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

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

ChartIndicatorsTotalは、指定したチャートのウィンドウ(メインウィンドウまたはサブウィンドウ)に、現在いくつのインジケーターが適用されているかを取得するための関数です。

実務レベルの開発において、この関数は単独で使うよりも、「チャートのクリーンアップ」や「重複動作の防止」のために利用されることが多いです。例えば、EAが動作する際に必要なインジケーターが既にセットされているかを確認したり、逆にEA停止時に残ってしまった不要なインジケーターをプログラムから一括削除する際のループ処理の起点として活用します。

初心者が特につまずきやすいポイントは、この関数が返すのは「チャート上に視覚的に表示されているインジケーターの数」であって、「EAの内部コード内で iMA などの関数を使って生成したハンドル数」ではないという点です。ここを混同すると、ロジックの不整合が発生するため注意が必要です。


2. 構文と戻り値

ChartIndicatorsTotal関数の基本的な構文は以下の通りです。

int  ChartIndicatorsTotal(
   long  chart_id,      // チャートID(0は現在のチャート)
   int   sub_window     // サブウィンドウの番号(0はメインウィンドウ)
   );

パラメーター

  • chart_id: 操作対象のチャートを識別するIDを指定します。現在のチャートであれば 0 または ChartID() を指定するのが一般的です。
  • sub_window: インジケーターの数を数えたいウィンドウのインデックスを指定します。
    • 0: メインウィンドウ(価格チャートが表示されている場所)
    • 1 以上: オシレーターなどが表示されるサブウィンドウ

戻り値

  • 指定したウィンドウに存在するインジケーターの数を int 型で返します。
  • 指定したチャートやウィンドウが見つからない場合は -1 を返します。

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

以下のサンプルコードは、現在のチャートのメインウィンドウ(0番)に適用されている全てのインジケーター名を抽出し、エキスパートログに出力する実用的なスクリプト例です。

//+------------------------------------------------------------------+
//| チャート上のインジケーター名をリストアップするスクリプト             |
//+------------------------------------------------------------------+
void OnStart()
{
   // メインウィンドウ(0)に適用されているインジケーターの総数を取得
   int total = ChartIndicatorsTotal(0, 0);

   if(total < 0)
   {
      Print("インジケーター数の取得に失敗しました。");
      return;
   }

   PrintFormat("メインウィンドウにあるインジケーター総数: %d", total);

   // ループを回して個別のインジケーター名を取得
   for(int i = 0; i < total; i++)
   {
      // インデックスを指定してインジケーターの「短縮名」を取得
      string name = ChartIndicatorName(0, 0, i);

      PrintFormat("インデックス [%d] のインジケーター名: %s", i, name);
   }
}

このコードを実行することで、プログラムから現在どのインジケーターがチャートを占有しているかを把握できます。特定のインジケーターが存在する場合のみトレードを許可する、といったフィルター機能の実装に応用可能です。


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

サブウィンドウ番号の指定ミス

MQL5では、サブウィンドウの番号は上から順に 0(メイン)、1、2… と割り振られます。存在しないサブウィンドウ番号(例えばインジケーターを1つも出していないのにサブウィンドウ1を指定するなど)を渡すと、エラーや意図しない戻り値が返ってきます。

インジケーターの削除に伴うインデックスの変化

ループ処理の中でインジケーターを削除(ChartIndicatorDelete)する場合、削除するたびに全体の total 数とインデックスが詰まって変化します。複数のインジケーターを削除する場合は、ループを後ろ(total-1)から逆順に回すのが鉄則です。

「ハンドル」との混同

冒頭でも触れましたが、EAの OnInitiCustom などを使用して取得したハンドル数は、この関数ではカウントされません。あくまで「チャート画面にドラッグ&ドロップ(またはプログラムから適用)して表示されているもの」が対象です。


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

アルゴリズムトレードにおいて、ロジックの正確さと同じくらい重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを稼働させる場合、プロバイダー経由のネットワーク遅延(レイテンシ)やOSのバックグラウンド更新によるリソース消費が避けられません。FXの価格はミリ秒単位で変動しており、自宅環境からの発注では、MT5上で「最高のタイミング」と判断した価格から数ピップス滑って約定する、あるいはリクオート(再指値)が発生してチャンスを逃すリスクが常に付きまといます。

このコンマ数秒の遅延が、累積で見れば月間の収益率を数%単位で悪化させる「サイレントキラー」となります。プロのクオンツエンジニアが運用においてFX専用のVPS(仮想専用サーバー)を必須とするのは、取引サーバーの物理的距離を極限まで縮め、ネットワークジッターを最小化するためです。24時間365日の安定稼働と、ミリ秒を争う約定スピードを確保して初めて、プログラムの優位性を市場で現金化することが可能になります。安定した利益を目指すのであれば、環境構築への投資を惜しむべきではありません。

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

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

コメント

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