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

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

MQL5のiSAR関数は、J.W.ワイルダーによって考案された「パラボリックSAR(Stop and Reverse)」の値を算出するための組み込み関数です。チャート上に点(ドット)で表示されるこのインジケーターは、その名の通り「トレンドの転換点(止まって反転するポイント)」を視覚化することに特化しています。

実務での活用シーン:
多くの開発者が陥る罠は、パラボリック単体でエントリーサインを作ろうとすることです。しかし、レンジ相場ではダマシが頻発し、資金を削る原因になります。プロの現場では主に以下の2点で活用されます。

  1. トレーリングストップの基準値: 価格の更新に合わせて損切りラインを引き上げる(または引き下げる)際、パラボリックの値をそのままストップロス値として利用します。
  2. トレンドのフィルター: 「価格がドットより上なら買いのみ、下なら売りのみ」といった、戦略の方向性を決定するフィルターとして機能させます。

MQL5におけるiSARは、MQL4のように値を直接返すのではなく、「インジケーターのハンドル(識別番号)」を返す仕様になっています。この違いを理解することが、MQL5移行者や初心者にとって最初の高い壁となります。

2. 構文と戻り値

iSAR関数の基本構文は以下の通りです。

int  iSAR(
   string              symbol,            // 通貨ペア(NULLは現在の通貨)
   ENUM_TIMEFRAMES     period,            // 時間軸(0は現在の時間軸)
   double              step,              // 加速因子のステップ(通常 0.02)
   double              maximum            // 加速因子の最大値(通常 0.2)
   );

戻り値

  • int型のハンドル: 成功するとインジケーターの操作に必要な「ハンドル」と呼ばれる整数を返します。
  • INVALID_HANDLE: 失敗した場合はこの値が返されます。

パラメーターの解説

  • step(加速因子): トレンドが続くにつれてドットが価格に追いつく速さを決定します。初期値は0.02が一般的です。
  • maximum: 加速因子の最大上限値です。通常は0.2を設定します。数値を大きくするほど感度が上がりますが、ノイズに弱くなります。

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

MQL5では、iSARでハンドルを取得した後、CopyBuffer関数を使って実際の数値を取り出すという2ステップが必要です。

//--- グローバル変数
int sarHandle; // パラボリックSARのハンドルを格納

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // iSARのハンドルを作成(ステップ0.02、最大0.2)
    sarHandle = iSAR(_Symbol, _Period, 0.02, 0.2);

    // ハンドルの作成に失敗した場合の処理
    if(sarHandle == INVALID_HANDLE)
    {
        Print("iSARハンドルの作成に失敗しました。");
        return(INIT_FAILED);
    }
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    double sarValues[];         // 値を格納する動的配列
    ArraySetAsSeries(sarValues, true); // 最新のデータから順に並び替え

    // CopyBufferを使用してハンドルから値を取得(0番バッファ、最新から3つ分)
    if(CopyBuffer(sarHandle, 0, 0, 3, sarValues) < 0)
    {
        Print("データのコピーに失敗しました。エラーコード: ", GetLastError());
        return;
    }

    // 最新(インデックス0)と1つ前(インデックス1)の値を取得
    double currentSAR = sarValues[0];
    double prevSAR = sarValues[1];
    double closePrice = iClose(_Symbol, _Period, 0);

    // ロジック例:価格がドットを上に抜けたら上昇トレンドと判断
    if(closePrice > currentSAR)
    {
        Comment("現在は上昇トレンドです。SAR: ", DoubleToString(currentSAR, _Digits));
    }
    else
    {
        Comment("現在は下降トレンドです。SAR: ", DoubleToString(currentSAR, _Digits));
    }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // プログラム終了時にハンドルを解放してメモリを節約
    IndicatorRelease(sarHandle);
}

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

  1. ハンドルの重複作成(メモリリーク): OnTickの中でiSARを呼び出さないでください。ティックごとにハンドルが生成され、PCやサーバーのメモリを食いつぶします。必ずOnInitで一度だけ作成するようにしましょう。
  2. 配列の時系列設定: CopyBufferで取得したデータは、デフォルトでは古い順に並んでいます。ArraySetAsSeries(array, true)を使用しないと、index[0]が最新の確定足にならないため、売買ロジックが逆転する原因になります。
  3. 計算未完了の状態: MT5起動直後などはインジケーターの計算が終わっていないことがあります。CopyBufferの戻り値(コピーされた個数)を必ずチェックし、予期せぬゼロ値で注文を出さないようガードをかけましょう。

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

自動売買プログラム(EA)を完成させた後、多くの開発者が最後に見落とすのが「執行環境のレイテンシ(遅延)」です。自宅のPCでEAを稼働させることは、プロのレーシングカーを砂利道で走らせるようなものです。家庭用インターネット回線は、ブローカーの取引サーバーがあるデータセンター(ロンドンやニューヨーク)との物理的な距離が遠く、パケットの往復に数百ミリ秒の遅延が発生します。

この遅延は、パラボリックSARのようなトレンド転換を狙うロジックにおいて致命的です。価格が反転した瞬間に注文を出しても、サーバーに届く頃にはすでに価格が滑っており、本来得られるはずだった利益がスリッページによって削り取られます。ボラティリティが高い局面ほど、このコンマ数秒の差が「勝ちトレード」を「負けトレード」に変えてしまいます。プロのクオンツエンジニアが例外なく専用のVPS(仮想専用サーバー)を利用するのは、ブローカーのサーバーと同じデータセンター内に設置することで、約定スピードを極限まで高めるためです。安定した収益を目指すのであれば、ネットワーク環境への投資を惜しむことは、結果としてそれ以上の損失を招くことを理解しなければなりません。

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

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

コメント

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