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の OnInit で iCustom などを使用して取得したハンドル数は、この関数ではカウントされません。あくまで「チャート画面にドラッグ&ドロップ(またはプログラムから適用)して表示されているもの」が対象です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確さと同じくらい重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを稼働させる場合、プロバイダー経由のネットワーク遅延(レイテンシ)やOSのバックグラウンド更新によるリソース消費が避けられません。FXの価格はミリ秒単位で変動しており、自宅環境からの発注では、MT5上で「最高のタイミング」と判断した価格から数ピップス滑って約定する、あるいはリクオート(再指値)が発生してチャンスを逃すリスクが常に付きまといます。
このコンマ数秒の遅延が、累積で見れば月間の収益率を数%単位で悪化させる「サイレントキラー」となります。プロのクオンツエンジニアが運用においてFX専用のVPS(仮想専用サーバー)を必須とするのは、取引サーバーの物理的距離を極限まで縮め、ネットワークジッターを最小化するためです。24時間365日の安定稼働と、ミリ秒を争う約定スピードを確保して初めて、プログラムの優位性を市場で現金化することが可能になります。安定した利益を目指すのであれば、環境構築への投資を惜しむべきではありません。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント