【MQL5】ChartIndicatorsTotal関数について

MQL5リファレンス
スポンサーリンク

ChartIndicatorsTotal関数の働き・役割

ChartIndicatorsTotal関数は、指定されたチャートウィンドウに適用された全ての指標の数を返します。これにより、特定のウィンドウ内に存在する指標の数を把握することが可能になります。チャートの分析やカスタムインジケ-タの管理において重要な役割を果たします。

ChartIndicatorsTotal関数の引数について

int ChartIndicatorsTotal(
  long  chart_id,      // チャート識別子
  int   sub_window     // サブウィンドウ番号
);

引数1: chart_id

種類: long
説明: チャートの識別子を指定します。0を指定すると現在のチャートを意味します。他の値を使用することで特定のチャートを指定できます。

引数2: sub_window

種類: int
説明: チャートのサブウィンドウ番号を指定します。0はメインチャートウィンドウを意味し、他の値を使用して特定のサブウィンドウを指定できます。

ChartIndicatorsTotal関数の戻り値について

ChartIndicatorsTotal関数は、指定されたチャートウィンドウに適用された指標の総数を返します。戻り値の詳細は以下の通りです。

指定されたチャートウィンドウの指標の数

種類: int
説明: 指定されたチャートウィンドウに存在する指標の総数を返します。この数値は、ウィンドウ内で現在適用されているすべてのインジケータ(指標)を含みます。

エラー時

説明: エラーが発生した場合、GetLastError関数を使用して詳細なエラー情報を取得することができます。例えば、無効なチャート識別子やサブウィンドウ番号が指定された場合などです。

ChartIndicatorsTotal関数を使う際の注意点

指定されたチャートウィンドウに適用されたすべての指標を検索するため、正しいチャート識別子とサブウィンドウ番号を指定する必要があります。チャートのウィンドウの数の合計は、ChartGetInteger関数を使用してCHART_WINDOWS_TOTALプロパティから取得できます。

また、ChartIndicatorsTotal関数は現在のチャート状態を反映するため、チャートが動的に変更される場合は、関数の呼び出しごとに最新の情報が取得されることを考慮する必要があります。エラーが発生した場合は、GetLastError関数を使用して詳細なエラー情報を確認してください。

ChartIndicatorsTotal関数を使ったサンプルコード

以下に、ChartIndicatorsTotal関数を使用した具体的なサンプルコードを示します。このコードは、チャート上のすべてのウィンドウとサブウィンドウ内の指標を取得し、その指標ハンドルをログに出力します。

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
{
  //--- チャート上のウィンドウの数(少なくとも1つのメインウィンドウは常に存在する)
  int windows = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL);
  //--- すべてのウィンドウをチェックする
  for (int w = 0; w < windows; w++)
  {
    //--- このウィンドウ/サブウィンドウ内の指標の数
    int total = ChartIndicatorsTotal(0, w);
    //--- ウィンドウ内のすべての指標をみる
    for (int i = 0; i < total; i++)
    {
      //--- 指標の短縮名を取得する
      string name = ChartIndicatorName(0, w, i);
      //--- 指標ハンドルを取得する
      int handle = ChartIndicatorGet(0, w, name);
      //--- ログに加える
      PrintFormat("Window=%d,  index=%d,  name=%s,  handle=%d", w, i, name, handle);
      //--- 不要になった指標ハンドルは解放するべき
      IndicatorRelease(handle);
    }
  }
}

サンプルコードに使われた関数や文法要素の簡単な解説

OnStart関数

OnStart関数スクリプトの実行が開始されたときに自動的に呼び出される関数です。この関数の中で、スクリプトのメインロジックを実装します。

ChartGetInteger関数

ChartGetInteger関数は指定されたプロパティの整数値を取得します。このコードでは、チャート上のウィンドウの数を取得するために使用しています。

ChartIndicatorsTotal関数

ChartIndicatorsTotal関数は指定されたウィンドウ内の指標の総数を取得します。この関数を使用して、各ウィンドウ内の指標の数を調べます。

ChartIndicatorName関数

ChartIndicatorName関数は指定されたウィンドウ内の特定の指標の短縮名を取得します。この短縮名を使用して、指標ハンドルを取得する際に使用します。

ChartIndicatorGet関数

ChartIndicatorGet関数は指定された短縮名を持つ指標のハンドルを取得します。このハンドルを使用して、指標に対する操作を行います。

PrintFormat関数

PrintFormat関数は指定されたフォーマットに従って文字列を作成し、エキスパートログに出力します。このコードでは、取得した指標の情報をログに出力します。

PrintFormat("Window=%d,  index=%d,  name=%s,  handle=%d", w, i, name, handle);

このコードにおけるフォーマット指定子は以下の通りです。

  • %d: 整数値を出力します。この場合、ウィンドウ番号(w)、指標のインデックスi)、および指標ハンドルhandle)に対応しています。
  • %s: 文字列を出力します。この場合、指標の短縮名(name)に対応しています。

具体的には、PrintFormat関数は以下の値をエキスパートログに出力します。

これにより、各ウィンドウおよびサブウィンドウ内のすべての指標について、ウィンドウ番号、インデックス、短縮名、およびハンドルをエキスパートログに記録します。

IndicatorRelease関数

IndicatorRelease関数は不要になった指標ハンドルを解放します。これにより、システムリソースを節約することができます。

タイプキャスト

タイプキャスト(型変換)は、あるデータ型を別のデータ型に変換する操作です。このサンプルコードでは、ChartGetInteger関数戻り値int型に変換しています。ChartGetInteger関数long型の値を返しますが、windows変数int型であるため、適切に扱うために型変換を行います。

int windows = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL);

識別子CHART_WINDOWS_TOTAL

CHART_WINDOWS_TOTALは、チャート内のウィンドウの総数を取得するための識別子定数)です。この識別子を使用して、ChartGetInteger関数が適切なプロパティの値を取得します。

forループ

forループは、指定された回数だけ繰り返し処理を行う制御構文です。このサンプルコードでは、すべてのチャートウィンドウとサブウィンドウ内の指標を順に処理するために使用されています。

for (int w = 0; w < windows; w++)
{
    // 各ウィンドウ内の指標を処理する
    int total = ChartIndicatorsTotal(0, w);
    for (int i = 0; i < total; i++)
    {
        string name = ChartIndicatorName(0, w, i);
        int handle = ChartIndicatorGet(0, w, name);
        PrintFormat("Window=%d,  index=%d,  name=%s,  handle=%d", w, i, name, handle);
        IndicatorRelease(handle);
    }
}

このループは、最初にチャート内のウィンドウ数を取得し、それぞれのウィンドウについてさらに内部ループで各指標を処理しています。

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