iCustom関数の書式や引数を調べても、実際に自分のカスタムインジケーターの値をEAやインジケーターから取得するにはどう書けばいいのか分からない——という人向けの記事です。
この記事では、各引数の意味に加えて、実際にMetaEditorでコンパイルして動かせるサンプルコードを紹介します。
iCustom関数
iCustom関数は、指定したカスタムインジケーターの値を返す関数です。
iCustom関数は、独自インジケーターを組み込む際に利用することが多いです。
また、EAを作る際に外部のサインを出すインジケーターがあった時に、
iCustom関数を利用するとインジケーターフォルダに有るインジケーターを自由に呼び出すことが可能です。
サインインジケーターを自動売買化する際によく利用されます。
iCustom関数の定義
double iCustom( string symbol, // 通貨ペア int timeframe, // 時間軸 string name // コンパイルしたカスタムインジケータプログラム名(ファイルパス付) ... // カスタムインジケータの入力パラメータ(必要な場合) int mode // ラインインデックス int shift // shift );
iCustom関数の引数の説明
iCustom関数の引数の説明をします。
| 型 | 項目名 | 説明 |
|---|---|---|
| string | symbol | シンボル名 |
| int | timeframe | 時間枠 |
| string | name | コンパイルしたカスタムインジケータプログラム名 |
| – | …… | カスタムインジケータの入力パラメータ |
| int | mode | ラインインデックス |
| int | shift | いくつ前の値を取得するか |
symbol
インジケータ計算するデータの通貨ペア名。
NULLは現在の通貨ぺアを意味します。
timeframe
時間軸。
ENUM_TIMEFRAMES列挙の値を指定します。
0は現在の時間軸を意味します。
name
コンパイルされたカスタムインジケータプログラム名。
インジケータディレクトリ(\MQL4\Indicators)から検索されます。
サブディレクトリに配置されている場合は、”サブディレクトリ名\\カスタムインジケータ名”で指定します。
…
カスタムインジケータの入力パラメータです。
渡された入力パラメータの順序は、カスタムインジケータの宣言順に対応させる必要があります。
mode
ラインインデックス。0〜7の範囲で指定できます。
SetIndexBuffer()関数で指定したインデックスと一致する必要があります。
shift
インジケータバッファから取得する値のインデックス。
(現在バーを基準にして、指定した時間軸のバー数分を過去方向へシフト)
実際にiCustom関数を使ってみる
ここまでの説明だけでは、実際にどう書けば動くのかがイメージしにくいと思います。自作のカスタムインジケーター(ここでは仮に、バッファ0番にシグナル値を持つ「MySample」というカスタムインジケーターがインジケーターフォルダにコンパイル済みだとします)の値を、EAから毎ティック取得してチャートに表示する例です。
//+------------------------------------------------------------------+
//| iCustomTest.mq4 |
//+------------------------------------------------------------------+
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//"MySample"インジケーターのバッファ0番、現在足(shift=0)の値を取得する
double signalValue = iCustom(NULL, 0, "MySample", 0, 0);
Comment("MySampleのシグナル値: ", signalValue);
}
//+------------------------------------------------------------------+
「MySample」の部分は、実際に呼び出したいカスタムインジケーターのファイル名(拡張子.mq4/.ex4は付けません)に置き換えてください。呼び出したいインジケーターに入力パラメータ(input変数)がある場合は、iCustom(NULL, 0, "MySample", 期間などの引数, 0, 0)のように、name引数とmode引数の間に、そのインジケーターのinput宣言順どおりに値を追加します。
コピペしてコンパイルが通らないときに確認すること
「未定義のインジケーター名」「関数が見つかりません」といったエラーが出た場合は、次を確認してください。
- 呼び出したいカスタムインジケーターが、先にMetaEditorでコンパイル済み(拡張子.ex4が生成済み)であること
- name引数の綴りが、インジケーターのファイル名(拡張子なし)と完全に一致していること
- mode引数の番号が、呼び出し先インジケーターのSetIndexBuffer()で指定したインデックスと一致していること
iCustom関数を学ぶための本
iCustom関数を学ぶための本があります。
まとめ
iCustom関数はプログラミング初心者は使わないほうが良いですが、
少しずつMQLプログラミングを学び始めたら用途に合わせて活用すると幅が広がります。

コメント