IndicatorCreate関数の働き・役割
IndicatorCreate関数は、MqlParam構造体型のパラメータの配列に基づいて作成された特定のテクニカルインジケータのハンドルを返します。この関数を使用することで、プログラム内でインジケータを動的に生成し、利用することができます。
MqlParam構造体について
MqlParam構造体は、IndicatorCreate関数を使用してテクニカルインジケータのハンドルを作成する際の入力パラメータを提供するためにデザインされています。
※構造体一般についての詳細は↓の記事をご参照ください。
type
- 種類: ENUM_DATATYPE
- 説明: 入力パラメータの型を指定します。このフィールドには、ENUM_DATATYPE列挙のいずれかの値が格納されます。
※ENUM_DATATYPE列挙についての詳細は↓の記事をご参照ください。
integer_value
double_value
- 種類: double
- 説明: double型の値を格納するフィールドです。typeフィールドがdouble型(TYPE_DOUBLE)を示している場合に使用されます。
string_value
- 種類: string
- 説明: string型の値を格納するフィールドです。typeフィールドがstring型(TYPE_STRING)を示している場合に使用されます。
MqlParam構造体の使い方
MqlParam構造体はインジケータの各設定パラメータを格納するために使用されます。インジケータに必要なパラメータの数だけMqlParam構造体の配列を用意し、各配列の要素に対して適切なtypeメンバと、必要に応じてinteger_value、double_value、またはstring_valueメンバを設定する、というのが基本的な使い方となります。
以下に詳細を示します:
- 配列の準備:
- インジケータに必要なパラメータの数だけ、MqlParam構造体の配列を用意します。
- 例:インジケータに4つのパラメータが必要な場合、配列のサイズを4に設定します。
- typeメンバの設定:
- 各配列のtypeメンバを、そのパラメータのデータ型に応じて設定します。
- 例:TYPE_INT(整数型)、TYPE_DOUBLE(浮動小数点型)、TYPE_STRING(文字列型)
- 値メンバの設定:
MqlParam params[4]; // 4つのパラメータが必要なため、配列のサイズを4に設定
// ma_period を設定する
params[0].type = TYPE_INT; // データ型は整数型
params[0].integer_value = 8; // パラメータの値は8
// ma_shift を設定する
params[1].type = TYPE_INT; // データ型は整数型
params[1].integer_value = 0; // パラメータの値は0
// ma_method を設定する
params[2].type = TYPE_INT; // データ型は整数型
params[2].integer_value = MODE_EMA; // パラメータの値はMODE_EMA
// applied_price を設定する
params[3].type = TYPE_INT; // データ型は整数型
params[3].integer_value = PRICE_CLOSE; // パラメータの値はPRICE_CLOSE
このように、インジケータの設定に必要なパラメータごとにMqlParam構造体の配列を用意し、それぞれのtypeメンバと適切な値メンバを設定していく形になります。
全てのインジケータ入力パラメータは、MqlParam型の配列の形で送信されます。この配列の各要素のtypeフィールドは、要素によって送信されるデータ型を指定します。
指標値は、初めに、typeフィールドにENUM_DATATYPEのどちらの列挙値があるかによって各要素に適切なフィールドに配置する必要があります(integer_value、double_value、およびstring_value)。
指標のタイプとしてIND_CUSTOM値がIndicatorCreate関数の第三引数で受け渡される場合、入力パラメータ配列の最初の要素のtypeフィールドはENUM_DATATYPE列挙のTYPE_STRING値を含み、string_valueフィールドはカスタムインジケ-タの名称を含まなければなりません。
IndicatorCreate関数の引数について
IndicatorCreate関数の引数構成は以下の通りです。
int IndicatorCreate(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 時間軸
ENUM_INDICATOR indicator_type, // ENUM_INDICATOR 列挙からの指標の種類
int parameters_cnt=0, // パラメータ数
const MqlParam& parameters_array[]=NULL, // パラメータの配列
引数1: symbol
引数2: period
- 種類: ENUM_TIMEFRAMES
- 説明: 時間軸。ENUM_TIMEFRAMES列挙のいずれかの値を指定します。0を指定すると現在の時間軸が使用されます。
引数3: indicator_type
- 種類: ENUM_INDICATOR
- 説明: インジケータの種類。ENUM_INDICATOR列挙のいずれかの値を指定します。
※ENUM_INDICATORについての詳細は↓の記事をご参照ください。
引数4: parameters_cnt
- 種類: int
- 説明: parameters_array配列に渡されるパラメータ数。初期値(デフォルト)は0で、この場合はパラメータが渡されません。1つ以上のパラメータが指定された場合、parameters_arrayは必須です。パラメータ数は64を超えることはできません。
引数5: parameters_array[]
IndicatorCreate関数の戻り値について
IndicatorCreate関数は、指定されたテクニカルインジケータのハンドルを返します。このハンドルは、作成されたインジケータを識別するために使用されます。
関数が正常に実行され、インジケータが正しく作成された場合、有効なハンドルを返します。インジケータの生成に失敗した場合、INVALID_HANDLEを返します。
- 戻り値: 指定されたテクニカルインジケータのハンドル
- 失敗時: INVALID_HANDLE
INVALID_HANDLEは、関数が失敗したことを示す特定の値であり、インジケータの生成に問題があったことを示します。
IndicatorCreateを使う際の注意点
カスタムインジケ-タは、EX5拡張子を持つファイルにコンパイルし、クライアント端末のMQL5/Indicatorsディレクトリまたはサブディレクトリ内に配置される必要があります。
テストが必要なインジケータは、パラメータが文字列定数で設定されている場合、iCustom関数の呼び出しから自動的に定義されます。文字列定数で設定されている状態とは、インジケータ名が直接指定されている場合を指します(例:「”CustomIndicator”」)。
一方、非定数文字列とは、変数や計算結果など、プログラムの実行時に決まる文字列のことを指します(例:「string customName = “CustomIndicator”;」)。このような場合やIndicatorCreate関数を使用する場合、#property tester_indicatorプロパティが必要です。
#property tester_indicatorプロパティは、テスト用のインジケータを指定するために使用されます。このプロパティを使用することで、テスト環境で使用するカスタムインジケ-タを明示的に指定することができます。例として、「#property tester_indicator “indicator_name.ex5″」のように記述します。
公式リファレンスのIndicatorCreate関数を使ったサンプルコードについて解説
以下は公式リファレンスのIndicatorCreate関数を使ったサンプルコードについての記述になります。
※コメントアウトは解説用にこちらで付与したものが含まれています。
void OnStart()
{
MqlParam params[]; // MqlParam型の配列を宣言
int h_MA, h_MACD; // インジケータハンドルを格納する変数を宣言
// EURUSDの15分足における期間8のEMAを作成
ArrayResize(params, 4); // params配列のサイズを4に設定
// ma_periodを設定
params[0].type = TYPE_INT; // params配列の0番目の要素の型を整数型に設定
params[0].integer_value = 8; // ma_periodを8に設定
// ma_shiftを設定
params[1].type = TYPE_INT; // params配列の1番目の要素の型を整数型に設定
params[1].integer_value = 0; // ma_shiftを0に設定
// ma_methodを設定
params[2].type = TYPE_INT; // params配列の2番目の要素の型を整数型に設定
params[2].integer_value = MODE_EMA; // ma_methodをEMAに設定
// applied_priceを設定
params[3].type = TYPE_INT; // params配列の3番目の要素の型を整数型に設定
params[3].integer_value = PRICE_CLOSE; // applied_priceを終値に設定
// 移動平均を作成
h_MA = IndicatorCreate("EURUSD", PERIOD_M15, IND_MA, 4, params); // 移動平均インジケータを作成し、そのハンドルをh_MAに格納
// EURUSDの15分足におけるMACDを作成
ArrayResize(params, 4); // params配列のサイズを4に設定
// 高速ma_periodを設定
params[0].type = TYPE_INT; // params配列の0番目の要素の型を整数型に設定
params[0].integer_value = 12; // 高速ma_periodを12に設定
// 低速ma_periodを設定
params[1].type = TYPE_INT; // params配列の1番目の要素の型を整数型に設定
params[1].integer_value = 26; // 低速ma_periodを26に設定
// 差の平滑期間を設定
params[2].type = TYPE_INT; // params配列の2番目の要素の型を整数型に設定
params[2].integer_value = 9; // 差の平滑期間を9に設定
// 指標ハンドルをapplied_priceとして設定
params[3].type = TYPE_INT; // params配列の3番目の要素の型を整数型に設定
params[3].integer_value = h_MA; // 指標ハンドルをh_MAに設定
// 移動平均に基づいてMACDを作成
h_MACD = IndicatorCreate("EURUSD", PERIOD_M15, IND_MACD, 4, params); // MACDインジケータを作成し、そのハンドルをh_MACDに格納
// 指標を解放
IndicatorRelease(h_MACD); // h_MACDで作成されたインジケータを解放
IndicatorRelease(h_MA); // h_MAで作成されたインジケータを解放
}
いくつのブロックに分けてコード内容を解説していきたいと思います。
解説1
void OnStart()
{
MqlParam params[]; // MqlParam型の配列を宣言
int h_MA, h_MACD; // インジケータハンドルを格納する変数を宣言
// EURUSDの15分足における期間8のEMAを作成
ArrayResize(params, 4); // params配列のサイズを4に設定
コード解説
MqlParam params[];
MqlParam型の配列を宣言しています。この配列は、IndicatorCreate関数に渡すパラメータを格納するために使用されます。
int h_MA, h_MACD;
インジケータのハンドルを格納するための変数を宣言しています。h_MAは移動平均(MA)のハンドル、h_MACDはMACDのハンドルを格納します。
ArrayResize(params, 4);
params配列のサイズを4に設定しています。これにより、配列には4つのパラメータを格納できるようになります。次のステップで、この配列にインジケータの設定パラメータを格納していきます。
※移動平均を設定するために必要な4つのパラメータは4つ以下の通りです。
- ma_period(期間)
- ma_shift(シフト)
- ma_method(移動平均の種類)
- applied_price(適用価格)
この部分のコードは、IndicatorCreate関数を使用してインジケータを作成する準備を行っています。最初に必要なパラメータを格納するための配列を準備し、次にハンドルを保持する変数を宣言しています。ArrayResize関数を使用して、params配列のサイズを指定することで、インジケータのパラメータを格納するスペースを確保しています。
解説2
//--- ma_period を設定する
params[0].type = TYPE_INT;
params[0].integer_value = 8;
//--- ma_shift を設定する
params[1].type = TYPE_INT;
params[1].integer_value = 0;
//--- ma_method を設定する
params[2].type = TYPE_INT;
params[2].integer_value = MODE_EMA;
//--- applied_price を設定する
params[3].type = TYPE_INT;
params[3].integer_value = PRICE_CLOSE;
//--- MA を作成する
h_MA = IndicatorCreate("EURUSD", PERIOD_M15, IND_MA, 4, params);
コード解説
params[0].type = TYPE_INT;
params配列の0番目の要素の型を整数型(TYPE_INT)に設定しています。
params[0].integer_value = 8;
params配列の0番目の要素に、移動平均の期間(ma_period)として8を設定しています。
params[1].type = TYPE_INT;
params配列の1番目の要素の型を整数型(TYPE_INT)に設定しています。
params[1].integer_value = 0;
params配列の1番目の要素に、移動平均のシフト(ma_shift)として0を設定しています。
params[2].type = TYPE_INT;
params配列の2番目の要素の型を整数型(TYPE_INT)に設定しています。
params[2].integer_value = MODE_EMA;
params配列の2番目の要素に、移動平均の計算方法(ma_method)として指数移動平均(MODE_EMA)を設定しています。
params[3].type = TYPE_INT;
params配列の3番目の要素の型を整数型(TYPE_INT)に設定しています。
params[3].integer_value = PRICE_CLOSE;
params配列の3番目の要素に、適用価格(applied_price)として終値(PRICE_CLOSE)を設定しています。
h_MA = IndicatorCreate(“EURUSD”, PERIOD_M15, IND_MA, 4, params);
IndicatorCreate関数を使用して、EURUSDの15分足における移動平均(MA)を作成しています。作成されたインジケータのハンドルは、h_MA変数に格納されます。ここで指定しているパラメータは以下の通りです。
この部分のコードは、移動平均のパラメータを設定し、IndicatorCreate関数を使用してインジケータを作成しています。各パラメータはMqlParam構造体の配列として渡され、それぞれの要素に必要な設定を行っています。
解説3
//--- iMACD("EURUSD",PERIOD_M15,12,26,9,h_MA); を作成する
ArrayResize(params, 4);
//--- 高速 ma_period を設定する
params[0].type = TYPE_INT;
params[0].integer_value = 12;
//--- 低速 ma_period を設定する
params[1].type = TYPE_INT;
params[1].integer_value = 26;
//--- 差の平滑期間を設定する
params[2].type = TYPE_INT;
params[2].integer_value = 9;
//--- 指標ハンドルを applied_price として設定する
params[3].type = TYPE_INT;
params[3].integer_value = h_MA;
//--- 移動平均に基づいて MACD を作成する
h_MACD = IndicatorCreate("EURUSD", PERIOD_M15, IND_MACD, 4, params);
コード解説
ArrayResize(params, 4);
MACDを作成するために、params配列のサイズを4に設定しています。これにより、4つのパラメータを格納できるようになります。
params[0].type = TYPE_INT;
params[0].integer_value = 12;
params配列の0番目の要素の型を整数型(TYPE_INT)に設定し、その値を12(高速ma_period)に設定しています。
params[1].type = TYPE_INT;
params[1].integer_value = 26;
params配列の1番目の要素の型を整数型(TYPE_INT)に設定し、その値を26(低速ma_period)に設定しています。
params[2].type = TYPE_INT;
params[2].integer_value = 9;
params配列の2番目の要素の型を整数型(TYPE_INT)に設定し、その値を9(差の平滑期間)に設定しています。
params[3].type = TYPE_INT;
params[3].integer_value = h_MA;
params配列の3番目の要素の型を整数型(TYPE_INT)に設定し、その値をh_MA(先に作成した移動平均のハンドル)に設定しています。この値は、MACDの適用価格として使用されます。
h_MACD = IndicatorCreate(“EURUSD”, PERIOD_M15, IND_MACD, 4, params);
IndicatorCreate関数を使用して、EURUSDの15分足におけるMACDを作成しています。作成されたインジケータのハンドルは、h_MACD変数に格納されます。ここで指定しているパラメータは以下の通りです。
この部分のコードは、MACDのパラメータを設定し、IndicatorCreate関数を使用してMACDを作成しています。各パラメータはMqlParam構造体の配列として渡され、それぞれの要素に必要な設定を行っています。
解説3
//--- 指標を使用する
//--- . にて。にて。
//--- 指標を解放する(初めの h_MACD)
IndicatorRelease(h_MACD);
IndicatorRelease(h_MA);
}
コード解説
この部分のコードでは、作成したインジケータを使用し、最後に解放しています。コメントには「指標を使用する」と書かれていますが、実際の使用プロセスは省かれています。
一般的な流れとして、ハンドルを取得した後は以下のような手順で利用します。
- インジケータの値を取得する: 作成したインジケータのハンドルを使って、必要なデータを取得します。たとえば、移動平均の値やMACDの値を取得して分析に利用します。
- インジケータの値を処理する: 取得したデータを基に、必要な計算や処理を行います。これには、トレードシグナルの生成やチャートの更新が含まれます。
- インジケータをチャートに描画する: 処理結果をチャート上に表示します。例えば、移動平均線やMACDのヒストグラムなどを描画します。
IndicatorRelease(h_MACD);
IndicatorRelease(h_MA);
最後に、IndicatorRelease関数を使用して、作成したインジケータを解放しています。これにより、メモリが解放され、リソースの無駄遣いを防ぎます。
この部分のコードは、インジケータを利用する際の基本的な流れを示していますが、実際にはインジケータのハンドルを取得した後の具体的な使用プロセス(値の取得や処理、描画など)は省かれています。