ChartIndicatorGet関数の働き・役割
ChartIndicatorGet関数は、指定されたチャートウィンドウで特定の短縮名を持つ指標のハンドルを取得するために使用されます。この関数は、チャート上で既に存在する指標を操作したり、情報を取得したりする際に非常に有用です。
例えば、複数のインジケータ(指標)を使用してチャートを分析する場合、それぞれのインジケータにアクセスしてその情報を取得する必要があります。ChartIndicatorGet関数を利用することで、特定の指標のハンドルを取得し、その後の操作を効率的に行うことができます。
ChartIndicatorGet関数の引数について
int ChartIndicatorGet(
long chart_id, // チャート識別子
int sub_window, // サブウィンドウ番号
const string indicator_shortname // 指標短縮名
);
引数1: chart_id
種類: long
説明: チャートの識別子を指定します。0を指定すると現在のチャートを意味します。他の値を使用することで特定のチャートを指定できます。
引数2: sub_window
種類: int
説明: チャートのサブウィンドウ番号を指定します。0はメインチャートウィンドウを意味し、他の値を使用して特定のサブウィンドウを指定できます。
引数3: indicator_shortname
種類: const string
説明: 指標の短縮名を指定します。この短縮名は、IndicatorSetString関数を使用してINDICATOR_SHORTNAMEプロパティに設定されます。
ChartIndicatorGet関数の戻り値について
ChartIndicatorGet関数は、指定されたチャートウィンドウで特定の短縮名を持つ指標のハンドルを返します。戻り値は以下の通りです。
成功時
種類: int
説明: 指標ハンドルを返します。指標ハンドルは、チャート上の特定の指標を操作するために使用される一意(1つしか存在しない)の識別子です。
失敗時
種類: int
説明: INVALID_HANDLEを返します。INVALID_HANDLEは、指標の取得に失敗したことを示す定数です。エラーの詳細を確認するためには、GetLastError関数を使用します。
ChartIndicatorGet関数を使う際の注意点
指標ハンドルを取得すると、内部の指標使用カウンターが増加します。
「内部の指標使用カウンター」とは、指標ハンドルを取得するたびに、その指標が使用されている回数をカウントする内部のカウンターの事で、MT5プラットフォーム上で指標が管理される仕組みの一部です。
このカウンターがゼロより大きい限り、その指標はターミナルランタイムシステム(MT5やMQL5が動作する環境下における一連の処理やサービスの総称)に常に読み込まれたままになります。
これによって、不要になった指標がシステムリソースを占有し続ける可能性があるため、指標ハンドルを使い終わった後は、IndicatorRelease関数を使って明示的に解放する必要があります。これを怠ると、リソースの無駄遣いが発生し、システムのパフォーマンスが低下する可能性があります。
指標の短縮名は、IndicatorSetString関数を使用してINDICATOR_SHORTNAMEプロパティに設定されます。ChartIndicatorGet関数は、この短縮名によって指標を識別します。短縮名には、指標の全ての入力パラメータの値を含めることが推奨されます。
指標を識別するためには、IndicatorParameters関数を使用して指定されたハンドルのパラメータリストを取得する方法もあります。
ChartIndicatorGet関数を使ったサンプルコード
以下に、ChartIndicatorGet関数を使用した具体的なサンプルコードを示します。このコードは、チャート上のすべてのウィンドウとサブウィンドウ内の指標を取得し、その指標ハンドルをログに出力します。
//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数 |
//+------------------------------------------------------------------+
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);
}
}
このループは、最初にチャート内のウィンドウ数を取得し、それぞれのウィンドウについてさらに内部ループで各指標を処理しています。