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

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

MQL5での開発において、多くのエンジニアは iMA()iRSI() といった関数を使って「新規に」インジケーターのハンドルを作成します。しかし、実務では「既にチャート上に表示されているインジケーターの計算結果をEAで利用したい」という場面が多々あります。そこで登場するのが ChartIndicatorGet 関数です。

この関数の最大の特徴は、新しくインジケーターを生成するのではなく、指定したチャート・ウィンドウに存在するインジケーターの「ハンドル」を取得できる点にあります。

実務での活用シーン:
裁量トレードの補助: ユーザーが手動でパラメータを調整したチャート上のインジケーター値を、EAがそのまま読み取って自動売買のトリガーにする。
計算リソースの節約: 同じ設定のインジケーターを二重に作成せず、既存のものを参照することでメモリ消費を抑える。
同期の確保: チャートで見ている視覚的な情報と、EA内部のロジックで使う数値を完全に一致させる。

初心者の方は「インジケーター名」の指定でつまずきやすいですが、これはファイル名ではなく、プログラム内で設定された「短縮名(Short Name)」を指すという点に注意が必要です。

2. 構文と戻り値

ChartIndicatorGet 関数の構文は以下の通りです。

int  ChartIndicatorGet(
   long           chart_id,      // チャートID(0は現在のチャート)
   int            sub_window,    // サブウィンドウ番号(0はメインウィンドウ)
   const string   indicator_name // インジケーターの短縮名(Short Name)
);

パラメーター解説

  1. chart_id: 操作対象のチャートを識別するIDです。通常、自身のチャートを指す 0 を指定します。
  2. sub_window: インジケーターが配置されているウィンドウのインデックスです。メインウィンドウは 0、その下のサブウィンドウは 1, 2, ... となります。
  3. indicator_name: ここが最重要です。 IndicatorSetString(INDICATOR_SHORTNAME, "名前") で設定された名前を指定します。設定されていない場合はファイル名になることもありますが、基本的には短縮名を指定します。

戻り値

  • 成功した場合:インジケーターのハンドル(整数値)を返します。
  • 失敗した場合:INVALID_HANDLE を返します。

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

以下のサンプルは、チャート上に手動で適用された「RSI」の値をEAから取得し、その値が70以上か30以下かを判定する実用的なコードです。

//+------------------------------------------------------------------+
//|                                              IndicatorGetSample  |
//|                                  Copyright 2024, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

// 入力パラメータ:取得したいインジケーターの短縮名
input string InpIndiName = "RSI(14)"; 

void OnTick()
{
    // 1. チャート上のサブウィンドウ1に配置されているインジケーターのハンドルを取得
    // ※RSIなどは通常サブウィンドウに表示されるため
    int handle = ChartIndicatorGet(0, 1, InpIndiName);

    // ハンドルが取得できなかった場合のエラー処理
    if(handle == INVALID_HANDLE)
    {
        Print("インジケーターが見つかりません。名前やサブウィンドウ番号を確認してください。");
        return;
    }

    // 2. 値を格納するための配列を用意
    double buffer[];
    ArraySetAsSeries(buffer, true); // 最新の値をインデックス0にする

    // 3. ハンドルを使って値をコピー(直近1本分)
    if(CopyBuffer(handle, 0, 0, 1, buffer) > 0)
    {
        double rsiValue = buffer[0];
        Print("取得したRSIの値: ", rsiValue);

        // ロジックの実行
        if(rsiValue >= 70) Print("買われすぎ圏内です。");
        if(rsiValue <= 30) Print("売られすぎ圏内です。");
    }

    // ChartIndicatorGetで取得したハンドルは、本来IndicatorReleaseで解放する必要はありませんが、
    // 自身のEA内でiRSI等で作ったハンドルとは扱いが異なる点に留意してください。
}

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

  1. 「短縮名」の不一致:
    最も多いミスは、インジケーターのファイル名(例:RSI.ex5)を指定してしまうことです。インジケーターのプロパティ画面の「全般」タブに表示される名前、あるいはコード内の INDICATOR_SHORTNAME を確認してください。特に、パラメータが含まれる名前(例:RSI(14))になっている場合は、その文字列を正確に指定する必要があります。

  2. サブウィンドウ番号の間違い:
    メインウィンドウにある移動平均線などを取得する場合は 0 ですが、オシレーター系は 1 以降になります。ChartWindowFind 関数を併用して、動的にサブウィンドウ番号を特定するのがプロの手法です。

  3. タイミングの問題:
    EAの OnInit で実行すると、インジケーターが完全にロードされる前に取得を試みて失敗することがあります。取得処理は OnTick 内で行うか、ハンドルが取得できるまでリトライするロジックを組むのが安全です。

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

アルゴリズムトレードにおいて、ロジックの正確性と同じ、あるいはそれ以上に重要なのが「実行環境のレイテンシ(遅延)」です。自宅のPCでMT5を起動して自動売買を行うことは、プロの視点からは推奨できません。家庭用回線ではパケットロスやネットワークの揺らぎ(ジッター)が頻繁に発生し、EAが完璧なタイミングでシグナルを出しても、証券サーバーに届くまでに数ミリ〜数百ミリ秒の遅延が生じます。

このわずかな遅延が原因で、本来の価格から滑って約定(スリッページ)し、期待した期待値を大きく削り取られることになります。特にスキャルピングやデイトレードにおいては、この遅延が年間で致命的な損失額に膨らむことも珍しくありません。極限まで約定スピードを高め、24時間安定した稼働を実現するには、証券サーバーに物理的に近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。インフラを整えることは、手法を磨くことと同等、あるいはそれ以上に収益に直結する投資であることを忘れないでください。

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

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

コメント

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