IndicatorParameters関数の働き・役割
IndicatorParameters関数は、指定された指標ハンドルに基づいて、その指標の入力パラメータの数、値、および型を返します。
これにより、特定の指標が使用する入力パラメータの詳細情報を取得し、そのパラメータを動的に操作することが可能になります。この関数は、インジケータ(指標)の詳細な設定や分析に役立ちます。
IndicatorParameters関数の引数について
int IndicatorParameters(
int indicator_handle, // 指標ハンドル
ENUM_INDICATOR& indicator_type, // 指標の種類を受け取る変数
MqlParam& parameters[] // パラメータを受け取る配列
);
引数1: indicator_handle
種類: int
説明: 指標のハンドルを指定します。このハンドルは、計算されたパラメータの数を知る必要のある指標を示します。
引数2: indicator_type
種類: ENUM_INDICATOR&
説明: 指標の種類が書き入れられるENUM_INDICATOR型の変数です。この引数は、関数が指標の種類を返すために使用されます。
引数3: parameters[]
種類: MqlParam&
説明: 指標パラメータのリストが書き入れられるMqlParam構造体型の値を受け取る動的配列です。この配列には、指標の各パラメータの値と型が含まれます。配列のサイズは、IndicatorParameters関数で返されます。
IndicatorParameters関数の戻り値について
IndicatorParameters関数は、指定されたハンドルを持つ指標の入力パラメータの数を返します。戻り値の詳細は以下の通りです。
指定されたハンドルを持つ指標の入力パラメータの数
種類: int
説明: 指定された指標の入力パラメータの数を返します。これにより、指標がどのようなパラメータを使用しているかを把握できます。
エラー時
種類: int
説明: エラーが発生した場合は-1を返します。エラーの詳細については、GetLastError関数を使用して確認することができます。例えば、無効な指標ハンドルが指定された場合などが考えられます。
IndicatorParameters関数を使う際の注意点
IndicatorParameters関数を使用する際には、いくつかの重要な注意点があります。
指標ハンドルが無効な場合や、指標が存在しない場合、関数は-1を返し、詳細なエラー情報はGetLastError関数を使用して確認する必要があります。
parameters配列は動的配列として定義される必要があります。関数呼び出し後、この配列には指標の各パラメータの情報が含まれます。配列のサイズは、IndicatorParameters関数の戻り値として返されるパラメータの数と一致する必要があります。
indicator_type引数は、ENUM_INDICATOR型の変数で、関数呼び出し後に指標の種類が格納されます。この変数を使用して、取得した指標がどのタイプであるかを確認できます。
動的配列を使用するため、メモリ管理に注意が必要です。必要に応じて、配列の初期化やメモリの解放を適切に行うことが重要です。
IndicatorParameters関数を使ったサンプルコード
以下に、IndicatorParameters関数を使用して、特定の指標の入力パラメータの情報を取得し、それをエキスパートログに出力するサンプルコードを示します。
//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数 |
//+------------------------------------------------------------------+
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, indicator #%d, handle=%d", w, i, handle);
//--- 指標のパラメータを取得するための配列を宣言
MqlParam parameters[];
//--- 指標の種類を格納する変数を宣言
ENUM_INDICATOR indicator_type;
//--- 指標のパラメータを取得
int params = IndicatorParameters(handle, indicator_type, parameters);
//--- メッセージヘッダー
string par_info = "Short name " + name + ", type " + EnumToString(ENUM_INDICATOR(indicator_type)) + "\r\n";
//--- 各パラメータの情報をログに追加
for (int p = 0; p < params; p++)
{
//--- パラメータの情報をフォーマットして追加
par_info += StringFormat(
"parameter %d: type=%s, long_value=%d, double_value=%G, string_value=%s\r\n",
p,
EnumToString((ENUM_DATATYPE)parameters[p].type), // パラメータの型を取得
parameters[p].integer_value, // パラメータの整数値
parameters[p].double_value, // パラメータの実数値
parameters[p].string_value // パラメータの文字列値
);
}
//--- パラメータ情報をログに出力
Print(par_info);
}
//--- ウィンドウの全ての指標で完了
}
}
サンプルコード解説1
void OnStart()
{
//--- チャート上のウィンドウの数(少なくとも1つのメインウィンドウは常に存在する)
int windows = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL);
//--- すべてのウィンドウをチェックする
for (int w = 0; w < windows; w++)
{
//--- このウィンドウ/サブウィンドウ内の指標の数
int total = ChartIndicatorsTotal(0, w);
void OnStart()
OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出される関数です。この関数の中で、スクリプトのメインロジックを実装します。
int windows = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL);
ChartGetInteger関数を使用して、現在のチャート(識別子0)のウィンドウの数を取得しています。この関数は、チャート上のウィンドウの総数を示す整数値を返します。取得した値はlong型ですが、int型にキャストしています。
for (int w = 0; w < windows; w++)
取得したウィンドウの数だけループを実行します。各ループで、ウィンドウ番号を変数wに設定し、次の処理を行います。
int total = ChartIndicatorsTotal(0, w);
ChartIndicatorsTotal関数を使用して、現在のウィンドウ(w)に存在する指標の総数を取得しています。この関数は、指定されたウィンドウ内の指標の数を示す整数値を返します。この値を変数totalに格納し、次のループ処理で使用します。
サンプルコード解説2
//--- ウィンドウ内のすべての指標をみる
for (int i = 0; i < total; i++)
{
//--- 指標の短縮名を取得する
string name = ChartIndicatorName(0, w, i);
//--- 指標ハンドルを取得する
int handle = ChartIndicatorGet(0, w, name);
//--- ログに加える
PrintFormat("Window=%d, indicator #%d, handle=%d", w, i, handle);
for (int i = 0; i < total; i++)
ChartIndicatorsTotal関数で取得した指標の総数(total)だけループを実行します。各ループで、指標番号を変数iに設定し、次の処理を行います。
string name = ChartIndicatorName(0, w, i);
ChartIndicatorName関数を使用して、現在のウィンドウ(w)内の特定の指標(i)の短縮名を取得します。この短縮名は、後で指標ハンドルを取得する際に使用されます。取得した短縮名は、変数nameに格納されます。
int handle = ChartIndicatorGet(0, w, name);
ChartIndicatorGet関数を使用して、指定された短縮名(name)を持つ指標のハンドルを取得します。このハンドルは、指標に対する操作を行うための識別子です。取得したハンドルは、変数handleに格納されます。
PrintFormat(“Window=%d, indicator #%d, handle=%d”, w, i, handle);
PrintFormat関数を使用して、現在のウィンドウ番号(w)、指標番号(i)、および指標ハンドル(handle)をフォーマットしてエキスパートログに出力します。これにより、各ウィンドウ内の指標情報がログに記録されます。
サンプルコード解説3
//--- 指標のパラメータを取得するための配列を宣言
MqlParam parameters[];
//--- 指標の種類を格納する変数を宣言
ENUM_INDICATOR indicator_type;
//--- 指標のパラメータを取得
int params = IndicatorParameters(handle, indicator_type, parameters);
//--- メッセージヘッダー
string par_info = "Short name " + name + ", type " + EnumToString(ENUM_INDICATOR(indicator_type)) + "\r\n";
MqlParam parameters[];
IndicatorParameters関数から取得したパラメータを格納するための配列を宣言しています。MqlParamは、パラメータの型と値を保持する構造体です。この配列は動的にサイズが決まります。
ENUM_INDICATOR indicator_type;
IndicatorParameters関数から取得した指標の種類を格納するための変数を宣言しています。ENUM_INDICATORは、指標の種類を表す列挙型です。
int params = IndicatorParameters(handle, indicator_type, parameters);
IndicatorParameters関数を使用して、指定された指標ハンドル(handle)に基づいて、指標の入力パラメータの数、値、および型を取得します。この関数は、取得したパラメータの数を返します。結果は、変数paramsに格納されます。
string par_info = “Short name ” + name + “, type ” + EnumToString(ENUM_INDICATOR(indicator_type)) + “\r\n”;
par_info変数には、メッセージヘッダーとして指標の情報が格納されます。
"Short name "
+ name: まず、”Short name “という文字列に指標の短縮名(name)を連結しています。これにより、メッセージの冒頭に指標の短縮名が表示されます。", type "
: 次に、”, type “という文字列を連結します。これにより、指標の種類の情報が続くことを示します。- EnumToString(ENUM_INDICATOR(indicator_type)): EnumToString関数を使用して、indicator_type変数に格納された指標の種類を文字列に変換します。ここで、タイプキャストを行い、ENUM_INDICATOR型として扱います。
"\r\n"
: 最後に、改行文字を連結します。\r\n
はキャリッジリターン(行の先頭に戻る)とラインフィード(次の行に移動する)を表し、ログのメッセージが見やすくなるように改行します。
これらをすべて連結することで、par_infoには指標の短縮名と種類の情報が含まれたメッセージヘッダーが生成されます。
サンプルコード解説4
//--- 各パラメータの情報をログに追加
for (int p = 0; p < params; p++)
{
//--- パラメータの情報をフォーマットして追加
par_info += StringFormat(
"parameter %d: type=%s, long_value=%d, double_value=%G, string_value=%s\r\n",
p,
EnumToString((ENUM_DATATYPE)parameters[p].type), // パラメータの型を取得
parameters[p].integer_value, // パラメータの整数値
parameters[p].double_value, // パラメータの実数値
parameters[p].string_value // パラメータの文字列値
);
}
//--- パラメータ情報をログに出力
Print(par_info);
}
//--- ウィンドウの全ての指標で完了
}
}
各パラメータの情報をログに追加
取得したパラメータの数(params)だけループを実行します。各ループで、パラメータ番号を変数pに設定し、次の処理を行います。
for (int p = 0; p < params; p++)
このループは、各パラメータの情報を順に処理します。
par_info += StringFormat(…)
StringFormat関数を使用して、各パラメータの情報をフォーマットしてpar_info文字列に追加します。各パラメータの情報は以下の形式でフォーマットされます。
"parameter %d: type=%s, long_value=%d, double_value=%G, string_value=%s\r\n"
parameter %d
: パラメータの番号(p)を整数として出力します。type=%s
: パラメータの型を文字列として出力します。EnumToString関数を使用して、ENUM_DATATYPE型にタイプキャストしたパラメータの型を取得します。long_value=%d
: パラメータの整数値(parameters[p].integer_value)を出力します。double_value=%G
: パラメータの実数値(parameters[p].double_value)を出力します。string_value=%s
: パラメータの文字列値(parameters[p].string_value)を出力します。\r\n
: 最後に、改行文字を連結します。\r\n
はキャリッジリターン(行の先頭に戻る)とラインフィード(次の行に移動する)を表し、ログのメッセージが見やすくなるように改行します。
Print(par_info);
Print関数を使い、par_info文字列に追加されたすべてのパラメータ情報をエキスパートログに出力します。
ウィンドウの全ての指標で完了
このループを通じて、ウィンドウ内のすべての指標のパラメータ情報がログに記録されます。