iCustom関数とは

MQL4学習
スポンサーリンク

iCustom関数とは

iCustom()関数を使用すると、指定したカスタムインジケーターの値を返す事が出来ます。

カスタムインジケーターとは
MT4にデフォルトで入っているインジケーターではなく、外部サイトで入手したり自分で作成したインジケーターの事。

各引数の意味は以下になります。

string symbol
インジケーターの値を取得する通貨ペアの指定。
通貨ペアを指定する場合は、「気配値表示ウインドウ」の表記通りに記述します。
現在のチャートの通貨ペアを指定したい場合は、「NULL」or「_Symbol」を記述します。

②int timeframe
インジケーターを取得する時間軸の指定。
現在チャートの時間軸の場合「PERIOD_SURRENT」or「0」or「_Period」を記述します。
その他は事前定義されているチャート時間軸「ENUM_TIMEFRAMES」を参照。

③string name
値を取得したいインジケーター名。
インジケーター名は「”」ダブルクォーテーションで囲んで記述します。

④…
値を取得したいインジケーターの入力パラメータ。
インジケーターの「パラメーターの入力」ダイアログに記載されている順番通りにカンマで区切って記述します。
なお、パラメーターを指定しない場合は、インジケーターのデフォルト値が使用されます。

⑤int mode
値を取得したいインジケーターのラインインデックス番号。

⑥int shift
インジケーターの値を取得したいバー位置の指定。
現在のバーであれば「0」、1本前のバーであれば「1」…と記述します。

iCustom関数で出来る事

EA等を作成する際にインジケーターの値を取得したいと思いますよね。
例えば、短期と長期の移動平均線のクロスをトリガーにしたロジックや、RSIの値が70を超えた時など。

そんな時は標準インジケーターであれば、移動平均線ならiMA()関数や、RSIならiRSI()関数を使用する事で値を取得する事が可能です。

しかし、ZigZagやオリジナルのカスタムインジケーターなどはiZIG()関数やi〇〇()関数という物は存在しません。

そんな時に、iCustom()関数を使用する事でそれらのインジケーターの値を取得する事が可能になります。

iCustom関数が使えないインジケーターとは

万能だと思えるiCustom()関数ですが、残念ながら値を取得出来ないインジケーターも存在します。

それはシグナルや値をバッファとして出力しているインジケーターでないとその値を取得出来ません。

バッファとは?
データを一時的に保存しておくための変数の事です。
以下はZigZagインジケーターの一部抜粋です。赤枠部分でライン番号「0~2」の計3つのバッファに値を保存する為の変数が用意されて割り当てられています。

iCustom()関数はこのバッファ(ラインインデックス番号)の値を取得する事が出来ますので、バッファに値を保存する過程を踏んでいないシグナル等の値は取得出来ないという事です。

iCustom関数の使い方

実際にiCustom()関数をどの様に使用すれば良いか、iCustom関数を使った無料インジケーターの紹介と、使用する際のポイントについて説明して行きます。

ZigZagの山と谷に矢印表示のインジケーターを作成

まずZigZagインジケーターとは、MT4に標準搭載されているインジケーターです。
ちなみに、以下のような赤線のジグザグ線を描くインジケーターになります。

ZigZagはそのロウソク足がロジック上の頂点時にバッファ0と1に値を返し、底辺時にバッファ0と2に値を返します。

ZigZagが描画される頂点のみ取得したい場合はバッファ0の値のみ取得すれば大丈夫です。

以下の記事はそれを取得して作成したインジケーターとなりますので、コードの書き方など参考にしてみて下さい。

ではiCustom関数に使う際に必要なポイントについて説明して行きます。

iCustom関数の入力パラメーターを準備

iCustom関数のパラメーターというより、iCustom関数で使用するZigZagに渡す値を入力パラメーターから設定出来るようにinput変数で準備します。

iCustom関数のパラメーターは省略も可能

iCustom()関数からインジケーターのパラメーターを指定する事が出来ますが、省略も可能です。
その場合はインジケーター初期値が適用されます。

パラメーターを指定する場合に、間のパラメーター指定を飛ばす事は出来ませんので注意して下さい。

任意のカスタムインジケーター値を取得する

では実際にiCustom関数を使うには、どのバッファ(ラインインデックス番号)に必要な値が入っているのかが分からないと使用する事が出来ません。

インジケーターのmq4データがあれば中身を確認する事が出来ますが、ex4データだと中身を見る事が出来ません。

その為、取得したい値がどのバッファ番号に入っているかを調べるインジケーターを作成したいと思います。

バッファ番号の中身を調べる方法

どのバッファ番号にどの値を入れているか確認する為に、専用のインジケーターを作成します。

テストのインジケーターは私が最初に販売を始めた、AMA(適応型移動平均線)が一定の角度が出た時に矢印表示する AMAngleZn というインジケーターです( ・Д・)

では早速コード全文を見てみましょう。

では順番に見てみましょう。

パラメーターでカスタムインジケーター名を設定

string型で任意の変数にカスタムインジケーター名を入力出来るようにする事で、パラメーターから任意のカスタムインジケーターのバッファ番号の中身を調べる事が出来るようになります。

その他の期間などの変更したいパラメーターがあれば追加して下さい。

各バッファ番号の中身を取得してコメント表示

OnCalculate関数内に各バッファ番号の中身を取得してコメント表示するコードを記述して行きます。

まずはstring型でcom変数(任意名)を宣言します。

次にインジケーターによってバッファ番号が何番まであるのか分からないので、今回は適当にfor文のループ処理で20個まで取得するようにしておきます。

i変数はバッファ番号にあたり、iCustom関数でiバッファ番号の値を取得し、”\n”は改行を意味します。

\n”の表記について
ブログ記事上では\ですが、メタエディターでは以下の表示になります。

StringConcatenate関数とは
「,」カンマで区切った引数を連結した文字列に変換する関数になります。

最後にコメント出力させます。

インジケーターを削除した時のコメント削除コード

インジケーターを削除してもコメント文字は勝手に消えてくれないので、インジケーターを削除する直前に動作するOnDeinit関数内に以下のコードを書いておきます。

様は空文字で上書きする感じですね。

OnDeinit関数の動作タイミングとは
・インジケーターを削除する前
・通貨ペアやチャート期間を変更する前
・入力パラメーター変更の再初期化前

使用方法と見方

使用方法としては、動いているチャート上にドラッグ&ドロップしてもらうと左上にコメントが表示されます。

しかし、それだとバッファ番号と現在足で入っている数値だけ表示されるだけなのでチャートが動くまで待たないといけません。

そんなに待てないのでストラテジーテスターを使って確認します。

ストラテジーテスターでの使い方

ここでは重要ポイントだけ紹介します。

①:インディケータを選択する。
②:今回のコードのインディケーターを選択する。
③:ビジュアルモードにチェックを入れる。
他:通貨ペアや時間足、期間などはお好みで変更して下さい。
※:プロパティで確認したいインジケーター名の入力も忘れないように!

設定が完了したら右下の「スタート」をクリックする事で指定期間のチャートが表示されて動き始めます。

そのチャートに確認したいインジケーター「今回はAMAngle」をドラッグ&ドロップする事で表示されるので、実際の動作を確認しながらバッファ番号と中身の値を確認する事が出来ます。

ビジュアルモード横にあるバーを左右に動かしてチャートの進行速度を調整する事が出来ます。
その横には一時停止ボタンがあります。もう一度押せば再生になります。
※間違えて右下の「ストップ」を押さないようにして下さい。完全に止まりますw

CodeCheckerとカスタムインジケーターの相互見方

バッファ番号と中身が見えても、どのバッファに欲しい情報が入っているかが分からないのでその確認方法です。

表示しているインジケーターをダブルクリックするとパラメーターウインドウが表示されますので、その中の「色の設定」タブを表示するとどの線がどの表示されているのかが分かると思います。
※幅やスタイルを変更してみるとより分かりやすいです。

このAMAngleインジケータは、バッファ0が移動平均線のライン、1が買い矢印、2が売り矢印となっていますので、例えば上矢印が出たタイミングで買いエントリーしたい場合は以下のようなコードになります。
※上画像では下矢印が出現している時、バッファ2に価格が入っていて、バッファ1は0になっているのが確認出来ると思います。

ちなみに注意として、このコードを現在足「0」と1本前で書いてしまうと、現在足はまだ確定していないので値動きによって上矢印が表示したり消えたりします。

その度にエントリーしてしまうような事が起きてしまうので注意して下さい。

まとめ

iCustom関数はプログラム初心者は使わない方が良いとよく記事を見かけますが、とても便利なので使ってみて下さい。

ただし、使用する際には注意して下さい!
先ほどの説明した通り、取得する値の足を間違えたEAを作成すると簡単に破産するEAを作ってしまう事もありますので、バックテストでの動作確認。デモ口座での動作確認は必ず必要です。

ネットにあるインジケーターをiCustom関数を使って動かす際にも、中身が見えない場合ので意図しない動作が含まれている可能性もあります。

こういった事を踏まえて、プログラム初心者は使わない方が良い。という事も分かります。

なので初心者の方は、石橋を叩いて渡るように動作確認してから使用しましょう!
失敗して気付く事は沢山あるので、まずはチャレンジする事が大事だと思います!(ダメージは最小限に!)

では( ・Д・)

コメント

タイトルとURLをコピーしました