【MQL5】sqrt関数の使い方と自動売買実装コード

1. sqrt関数の概要と実務での活用法

MQL5のsqrt関数は、指定した数値の平方根(ルート)を計算するための組み込み関数です。数学的には $\sqrt{x}$ を求めるものですが、FXのシステムトレード開発においては、単なる計算以上に重要な役割を果たします。

実務における主な活用シーンは以下の通りです。

  • ボラティリティの算出: 標準偏差(Standard Deviation)の計算プロセスで必須となります。ボリンジャーバンド自作や、リスク量に応じたポジションサイジングを行う際に頻出します。
  • 幾何学的な分析: チャート上の2点間の距離を計算する際(ピタゴラスの定理)に使用します。
  • 統計的アプローチ: 決定係数や相関係数の算出など、クオンツ的な指標を作成する際の基礎パーツとなります。

初心者の方がつまずきやすいポイントは、「負の数」を引数に入れてしまい、計算結果が「NaN(Not a Number:非数)」になってエラーを引き起こす点です。価格データや計算途中の数値がマイナスにならないよう、ロジックを組む必要があります。

2. 構文と戻り値

sqrt関数の構造は非常にシンプルです。

double  sqrt(
   double  value      // 正の数値
   );
  • パラメーター (value): 平方根を求めたい数値をdouble型で渡します。
  • 戻り値: 計算結果をdouble型で返します。
  • 注意: valueが負の値(0未満)の場合、関数は「NaN」を返します。これはランタイムエラーや表示バグの原因となるため、入力値のチェックが推奨されます。

3. 具体的な使い方・実践サンプルコード

以下は、過去数本分のローソク足の終値から、簡易的な「標準偏差(ボラティリティ)」を計算し、それに基づいて損切り幅(ストップロス)を決定する実践的なコード例です。

//+------------------------------------------------------------------+
//| 簡易的な標準偏差(ボラティリティ)を計算する関数                    |
//+------------------------------------------------------------------+
double CalculateSimpleVolatility(int periods)
{
    double sum = 0;
    double mean = 0;
    double sq_sum = 0;

    // 1. 指定期間の終値の平均(平均値)を計算
    for(int i = 0; i < periods; i++)
    {
        sum += iClose(_Symbol, _Period, i);
    }
    mean = sum / periods;

    // 2. 偏差の2乗の合計を計算
    for(int i = 0; i < periods; i++)
    {
        double diff = iClose(_Symbol, _Period, i) - mean;
        sq_sum += MathPow(diff, 2); // 偏差を2乗する
    }

    // 3. 分散の平方根をとって標準偏差(sqrtの出番)を算出
    double variance = sq_sum / periods;
    double std_dev = sqrt(variance); // ここでsqrtを使用

    return std_dev;
}

// EAのオンチックイベント
void OnTick()
{
    // 直近20本のボラティリティを取得
    double vol = CalculateSimpleVolatility(20);

    // ボラティリティの2倍を損切り幅として表示
    double stop_distance = vol * 2.0;

    PrintFormat("現在の予測ボラティリティ: %f, 推奨SL幅: %f", vol, stop_distance);
}

4. 使用上の注意点とよくあるエラー

開発時に特に注意すべき点は、「数学的制約」と「型の不一致」です。

  1. 負の値によるNaNエラー:
    株価や為替レートの差分を計算していると、稀にマイナスの値がsqrtに渡されることがあります。これを防ぐには、MathAbs()関数を使って絶対値に変換するか、if(value > 0)による条件分岐を必ず入れましょう。

  2. 型変換(キャスト):
    sqrtdouble型を想定しています。整数(int)をそのまま渡しても多くの場合自動でキャストされますが、精密な計算を行うクオンツモデルでは、明示的にdoubleに変換してから計算する癖をつけておくと、予期せぬ計算精度の欠如を防げます。

  3. ゼロ除算との混同:
    sqrt(0)0を返すためエラーにはなりませんが、その結果を分母に使う(例:1.0 / sqrt(x))場合、x0だとゼロ除算エラーでEAが停止します。セットで注意が必要です。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムの計算速度をsqrt関数の最適化などで1ミリ秒削ったとしても、実行環境が「自宅のPC」である限り、その努力は水の泡になる可能性が高いです。FXの自動売買において、プログラムの内部処理速度以上に重要なのが、証券会社サーバーとの物理的な通信距離が生むネットワーク遅延(レイテンシ)です。自宅のインターネット回線では、数ミリ秒から数百ミリ秒の遅延が常態化しており、これが「滑り(スリッページ)」を引き起こし、バックテスト通りの利益を削り取ります。

プロのクオンツエンジニアが極限まで約定スピードを高めるために行うのは、コードの微調整ではなく、取引サーバーの至近距離に位置する専用のVPS(仮想専用サーバー)への環境移行です。24時間安定稼働するのはもちろんのこと、専用VPSを利用することで注文がサーバーに到達するまでの時間を物理限界まで短縮でき、高ボラティリティ時でも有利な価格での約定が可能になります。勝てるロジックを組めたのであれば、次はそれを「戦える場所」で動かすことが、エンジニアとしての最終的な責務です。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました