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

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

MQL5でカスタムインジケーターやEA(エキスパートアドバイザー)を開発していると、「特定のインジケーターがサブウィンドウの何番目に表示されているか」を特定したい場面に遭遇します。ここで活躍するのがChartWindowFind関数です。

MetaTrader 5(MT5)のチャートは、メインチャート(ローソク足が表示される場所)を「インデックス0」とし、その下に表示されるRSIやMACDなどのサブウィンドウに1、2、3…と番号が振られます。しかし、ユーザーが手動でインジケーターを削除したり順番を入れ替えたりすると、この番号は動的に変わってしまいます。

実務レベルの開発では、特定のサブウィンドウに水平線を引いたり、図形を描画したりする場合に、「決め打ちの番号」ではなく、この関数を使ってリアルタイムにウィンドウ番号を特定するのが定石です。これを行わないと、意図しない場所にグラフィックが表示されるといったバグの原因になります。

2. 構文と戻り値

ChartWindowFind関数の使い方は非常にシンプルですが、引数の指定には注意が必要です。

int  ChartWindowFind(
   long    chart_id,                  // チャート識別子(通常は0)
   string  indicator_short_name       // インジケーターの短縮名(ショートネーム)
   );

パラメーター

  • chart_id: 操作対象のチャートIDを指定します。現在のチャートであれば 0 または ChartID() を使用します。
  • indicator_short_name: 探したいインジケーターの「短縮名」を指定します。※ファイル名ではない点に注意してください。

戻り値

  • インジケーターが見つかった場合:そのインジケーターが存在するウィンドウのインデックスを返します。
  • 見つからなかった場合: -1 を返します。

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

以下のサンプルは、チャート上に表示されている「RSI」のサブウィンドウを探し出し、そのウィンドウ内に特定のレベル(例:70のライン)に水平線を引くEA(またはスクリプト)の例です。

//+------------------------------------------------------------------+
//|                                              CheckRSIWindow.mq5  |
//+------------------------------------------------------------------+
void OnStart()
{
    // 検索したいインジケーターの短縮名
    // ※インジケーター側で IndicatorSetString(INDICATOR_SHORTNAME, "MyRSI") 
    //   のように設定されている必要があります。
    string rsiName = "RSI(14)"; 

    // RSIが表示されているウィンドウ番号を取得
    int windowIndex = ChartWindowFind(0, rsiName);

    if(windowIndex != -1)
    {
        Print("インジケーターが見つかりました。ウィンドウ番号: ", windowIndex);

        // 見つかったサブウィンドウに水平線を引く
        string objName = "RSI_Level_Line";
        ObjectCreate(0, objName, OBJ_HLINE, windowIndex, 0, 70.0);
        ObjectSetInteger(0, objName, OBJPROP_COLOR, clrRed);
        ObjectSetInteger(0, objName, OBJPROP_STYLE, STYLE_DOT);

        Print("ウィンドウ ", windowIndex, " に水平線を設置しました。");
    }
    else
    {
        // 見つからない場合は、サブウィンドウにRSIが表示されていない可能性がある
        Print("インジケーター '", rsiName, "' が見つかりませんでした。");
        Print("注意:インジケーターの『短縮名』が正確か確認してください。");
    }
}

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

① 「ファイル名」と「短縮名」の混同

初心者が最も陥りやすい罠は、ChartWindowFindの引数に「RSI.ex5」のようなファイル名を指定してしまうことです。この関数が探すのは、インジケーター内部で IndicatorSetString(INDICATOR_SHORTNAME, "名前") によって定義された短縮名です。
標準のRSIであれば、パラメーターに応じて「RSI(14)」のような名前になります。自作インジケーターを探したい場合は、必ず OnInit 内で INDICATOR_SHORTNAME を明示的に設定しておきましょう。

② 重複するインジケーター

同じインジケーターを2つ以上チャートに入れている場合、ChartWindowFind は最初に見つけた方のインデックスを返します。特定の個体を識別したい場合は、短縮名にパラメーターの値を含めるなどの工夫が必要です。

③ インジケーターのロード待ち

EAの OnInit で実行する場合、チャートが完全に初期化される前に呼び出すと -1 が返ってくることがあります。その場合は、OnTickOnTimer でリトライするか、少し待機する処理を入れるのが安全です。

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

アルゴリズム取引において、コードの最適化と同じくらい、あるいはそれ以上に重要なのが実行環境です。どんなに優れたロジックをMQL5で組み上げても、自宅のPCや一般的な光回線から注文を出している限り、プロのクオンツや機関投資家には勝てません。家庭用回線では、プロバイダを経由するたびに数十ミリ秒(ms)単位のレイテンシ(遅延)が発生し、MT5の画面上の価格と実際の市場価格との間に「滑り(スリッページ)」が生じるからです。

このコンマ数秒の遅延は、ボラティリティが高い局面では致命的な損失、あるいは獲得できたはずの利益の消失を意味します。約定スピードを極限まで高め、物理的な距離による遅延を最小化するには、取引サーバーの目と鼻の先に位置するデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の使用が不可欠です。24時間365日、安定した電源と超低遅延なバックボーンネットワーク環境でEAを稼働させることは、現代のシストレ開発者にとって「最低限のスタートライン」と言っても過言ではありません。

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

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

コメント

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