1. IndicatorCreate関数の概要と実務での活用法
MQL5においてインジケーターの数値を取得するためには、通常 iMA() や iRSI() といった個別の関数を使用します。しかし、これらは「特定の指標」を呼び出すためのショートカットに過ぎません。これら全ての背後にある「親」のような存在が IndicatorCreate 関数です。
なぜIndicatorCreateが必要なのか?
実務レベルのEA(エキスパートアドバイザー)開発において、以下のような動的な処理を行いたい場合にこの関数が真価を発揮します。
- インジケーターの動的切り替え: パラメータ設定によって、ある時は移動平均線(MA)、ある時はボリンジャーバンドを使用するといったロジックを、コードを書き換えずに実装できます。
- カスタムインジケーターの汎用的な呼び出し:
iCustomをより構造化した形で扱えます。 - 汎用ライブラリの作成: 複数のインジケーターを共通のインターフェースで制御するクラスやライブラリを自作する際、この関数を使うことで引数を配列として一括管理できます。
初心者の方が最初につまずくのは、「引数の渡し方」です。単純な数値ではなく、MqlParam という構造体の配列を作成して渡す必要があるため、通常の関数呼び出しよりも手順が多く、難解に感じられがちです。しかし、これをマスターすることで、MQL5のオブジェクト指向的な設計思想を深く理解できるようになります。
2. 構文と戻り値
IndicatorCreate 関数の定義は以下の通りです。
int IndicatorCreate(
string symbol, // 通貨ペア名
ENUM_TIMEFRAMES period, // 時間軸
ENUM_INDICATOR type, // インジケーターの種類(ENUM_INDICATOR)
int parameters_cnt=0, // パラメータ配列の要素数
const MqlParam& parameters_array[] // MqlParam構造体の配列
);
パラメーター解説
- symbol / period: 対象となる通貨ペアと時間軸を指定します。現在のチャートなら
_Symbol,_Periodを使います。 - type: 作成したいインジケーターを定数で指定します(例:
IND_MA,IND_RSIなど)。 - parameters_cnt: 第5引数で渡す配列の要素数です。
- parameters_array[]: インジケーターの設定値(期間や適用価格など)を格納した
MqlParam型の配列です。
戻り値
- 成功した場合:インジケーターの ハンドル番号(整数)を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
3. 具体的な使い方・実践サンプルコード
以下は、IndicatorCreate を使用して「移動平均線(MA)」のハンドルを動的に作成し、その値を取得する実用的なコード例です。
//+------------------------------------------------------------------+
//| SampleIndicatorCreate |
//+------------------------------------------------------------------+
#property strict
int handleMA = INVALID_HANDLE; // MAのハンドルを保持する変数
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. パラメータを格納するMqlParam構造体配列を準備
// 移動平均線(SMA, 期間14, シフト0, 終値適用)の場合、引数は4つ
MqlParam params[4];
// 期間の設定
params[0].type = TYPE_INT;
params[0].integer_value = 14;
// シフトの設定
params[1].type = TYPE_INT;
params[1].integer_value = 0;
// 平均化メソッドの設定 (MODE_SMA=0)
params[2].type = TYPE_INT;
params[2].integer_value = MODE_SMA;
// 適用価格の設定 (PRICE_CLOSE=1)
params[3].type = TYPE_INT;
params[3].integer_value = PRICE_CLOSE;
// 2. IndicatorCreateでハンドルを作成
handleMA = IndicatorCreate(_Symbol, _Period, IND_MA, 4, params);
// ハンドル作成に失敗した場合の処理
if(handleMA == INVALID_HANDLE)
{
Print("ハンドルの作成に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// メモリ解放のためにハンドルをリリースする
if(handleMA != INVALID_HANDLE)
IndicatorRelease(handleMA);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double bufferMA[]; // 値を格納する配列
ArraySetAsSeries(bufferMA, true); // 最新の値をインデックス0にする
// CopyBufferを使ってインジケーターの値を取得
if(CopyBuffer(handleMA, 0, 0, 2, bufferMA) > 0)
{
Print("最新のMA値: ", bufferMA[0]);
}
}
4. 使用上の注意点とよくあるエラー
① MqlParamの「型(type)」指定ミス
MqlParam 構造体には type メンバがあり、これに TYPE_INT, TYPE_DOUBLE, TYPE_STRING のいずれかを正しくセットしなければなりません。例えば、期間に TYPE_DOUBLE を指定してしまうと、ハンドル作成に失敗します。公式リファレンスで、各インジケーターがどの順番でどの型の引数を求めているかを確認することが必須です。
② ハンドルの解放忘れ
IndicatorCreate で作成したハンドルは、EAが停止する際に IndicatorRelease 関数で明示的に解放する必要があります。これを怠ると、バックテストの繰り返しなどでメモリ消費量が増大し、プラットフォーム全体の動作が不安定になる原因となります。
③ インジケーター計算待ち
ハンドルが作成された直後は、まだ計算が終わっておらず CopyBuffer が失敗することがあります。実戦では、OnTick 内でデータが取得できるまでリトライするか、十分なデータが準備できているかチェックするロジックを組んでください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、IndicatorCreate を使いこなして高度なロジックを組むことは重要ですが、それ以上に収益を左右するのが「執行環境」です。自宅のPCや一般的な光回線でEAを動かす場合、ブローカーのサーバーとの間に数十〜数百ミリ秒の物理的なネットワーク遅延(レイテンシ)が発生します。この遅延は、相場急変時のスリッページを増大させ、せっかくのクオンツアルゴリズムが導き出した優位性を一瞬で食いつぶしてしまいます。
プロのクオンツエンジニアが「VPS(仮想専用サーバー)」を必須とするのは、単に24時間稼働させるためだけではありません。ブローカーのデータセンターに近い場所にあるVPSを利用することで、ネットワーク遅延を1ミリ秒(1000分の1秒)単位まで極限に抑え、約定スピードを劇的に向上させるためです。コンマ数秒の遅れが致命的な損失に繋がる自動売買の世界において、専用のVPS環境を用意することは、手法を開発することと同じくらい重要な「勝つためのインフラ投資」であることを忘れないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント