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・timeframe・nameの指定方法
表だけでは分かりにくい3つの引数を、1つずつ詳しく見ていきます。
symbol(通貨ペアの指定)
インジケータ計算するデータの通貨ペア名。
NULLは現在の通貨ぺアを意味します。
timeframe(時間軸の指定)
時間軸。
ENUM_TIMEFRAMES列挙の値を指定します。
0は現在の時間軸を意味します。
name(呼び出すカスタムインジケーター名の指定)
コンパイルされたカスタムインジケータプログラム名。
インジケータディレクトリ(\MQL4\Indicators)から検索されます。
サブディレクトリに配置されている場合は、
“サブディレクトリ名\\カスタムインジケータ名”で指定します。
入力パラメータ・mode・shiftの指定方法
残りの3つの引数(入力パラメータ・mode・shift)について確認します。
…(カスタムインジケーターの入力パラメータ)
カスタムインジケータの入力パラメータです。
渡された入力パラメータの順序は、カスタムインジケータの宣言順に対応させる必要があります。
mode(ラインインデックス)
ラインインデックス。0〜7の範囲で指定できます。
SetIndexBuffer()関数で指定したインデックスと一致する必要があります。
shift(いくつ前の値を取得するか)
インジケータバッファから取得する値のインデックス。
(現在バーを基準にして、指定した時間軸のバー数分を過去方向へシフト)
実際にiCustom関数を使ってみる(サンプルコード)
ここまでの説明だけでは、実際にどう書けば動くのかがイメージしにくいと思います。
自作のカスタムインジケーター(ここでは仮に、
バッファ0番にシグナル値を持つ「MySample」
というカスタムインジケーターがインジケーターフォルダにコンパイル済みだとします)の値を、
EAから毎ティック取得してチャートに表示する例です。
コード全文(MySampleのシグナル値を取得する例)
//+------------------------------------------------------------------+
//| 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変数)がある場合は、
name引数とmode引数の間に、
そのインジケーターのinput宣言順どおりに値を追加します
(例: iCustom(NULL, 0, "MySample",
期間などの引数, 0, 0)のように指定します)。
コピペしてコンパイルが通らないときに確認すること
「未定義のインジケーター名」「関数が見つかりません」といったエラーが出た場合は、
次を確認してください。
- 呼び出したいカスタムインジケーターが、先にMetaEditorでコンパイル済み(拡張子.ex4が生成済み)であること
- name引数の綴りが、インジケーターのファイル名(拡張子なし)と完全に一致していること
- mode引数の番号が、呼び出し先インジケーターのSetIndexBuffer()で指定したインデックスと一致していること
iCustom関数を学ぶための本
iCustom関数を学ぶための本があります。
あわせて読みたい: 【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた
【MQL】指定したカスタムインジケーターの値を返す『iCustom関数』についてわかりやすく説明してみた:まとめ
iCustom関数はプログラミング初心者は使わないほうが良いですが、
少しずつMQLプログラミングを学び始めたら用途に合わせて活用すると幅が広がります。

コメント