iCustom関数とは
iCustom()関数を使用すると、指定したカスタムインジケーターの値を返す事が出来ます。
1 2 |
//定義 double iCustom(①string symbol, ②int timeframe, ③string name, ④..., ⑤int mode, ⑥int shift); |
各引数の意味は以下になります。
①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()関数ですが、残念ながら値を取得出来ないインジケーターも存在します。
それはシグナルや値をバッファとして出力しているインジケーターでないとその値を取得出来ません。
iCustom()関数はこのバッファ(ラインインデックス番号)の値を取得する事が出来ますので、バッファに値を保存する過程を踏んでいないシグナル等の値は取得出来ないという事です。
iCustom関数の使い方
実際にiCustom()関数をどの様に使用すれば良いか、iCustom関数を使った無料インジケーターの紹介と、使用する際のポイントについて説明して行きます。
ZigZagの山と谷に矢印表示のインジケーターを作成
まずZigZagインジケーターとは、MT4に標準搭載されているインジケーターです。
ちなみに、以下のような赤線のジグザグ線を描くインジケーターになります。
ZigZagはそのロウソク足がロジック上の頂点時にバッファ0と1に値を返し、底辺時にバッファ0と2に値を返します。
ZigZagが描画される頂点のみ取得したい場合はバッファ0の値のみ取得すれば大丈夫です。
以下の記事はそれを取得して作成したインジケーターとなりますので、コードの書き方など参考にしてみて下さい。
ではiCustom関数に使う際に必要なポイントについて説明して行きます。
iCustom関数の入力パラメーターを準備
iCustom関数のパラメーターというより、iCustom関数で使用するZigZagに渡す値を入力パラメーターから設定出来るようにinput変数で準備します。
1 2 3 4 |
//インジケーター設定 input int Depth=12; //ZigZagの深さ input int Deviation=5; //転換率 input int Backstep=3; //反転までの判断期間 |
iCustom関数のパラメーターは省略も可能
1 2 |
//iCustom関数の定義をおさらい iCustom(通貨ペア, 時間軸, "インジケーター名", パラメーター,,, バッファ番号, バー本数); |
iCustom()関数からインジケーターのパラメーターを指定する事が出来ますが、省略も可能です。
その場合はインジケーター初期値が適用されます。
1 2 3 4 5 6 7 8 9 10 11 |
//Zg変数に取得した値を代入 //条件:バッファ番号0,ローソク足3本前の値を取得する場合 //パラメーターを指定する時 double Zg=iCustom(_Symbol,_Period,"ZigZag",Depth,Deviation,Backstep,0,3); //パラメーターを省略する場合 double Zg=iCustom(_Symbol,_Period,"ZigZag",0,3); //パラメーターを一部(Depth)だけ指定する場合 double Zg=iCustom(_Symbol,_Period,"ZigZag",Depth,0,3); |
パラメーターを指定する場合に、間のパラメーター指定を飛ばす事は出来ませんので注意して下さい。
1 2 3 4 5 6 7 8 |
//この場合はDeviationにBackstepの値が適用されてしまいます。 × double Zg=iCustom(_Symbol,_Period,"ZigZag",Depth,Backstep,0,3); //こういった方法等で引数を飛ばすような事は出来ません。 × double Zg=iCustom(_Symbol,_Period,"ZigZag",Depth,"",Backstep,0,3); ※変数名をDepthにしたからと言って、Depthに適用されるという訳ではなく パラメーターの上から順番に引数が適用されると考えて下さい。 |
任意のカスタムインジケーター値を取得する
では実際にiCustom関数を使うには、どのバッファ(ラインインデックス番号)に必要な値が入っているのかが分からないと使用する事が出来ません。
インジケーターのmq4データがあれば中身を確認する事が出来ますが、ex4データだと中身を見る事が出来ません。
その為、取得したい値がどのバッファ番号に入っているかを調べるインジケーターを作成したいと思います。
バッファ番号の中身を調べる方法
どのバッファ番号にどの値を入れているか確認する為に、専用のインジケーターを作成します。
テストのインジケーターは私が最初に販売を始めた、AMA(適応型移動平均線)が一定の角度が出た時に矢印表示する AMAngleZn というインジケーターです( ・Д・)
では早速コード全文を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
//+------------------------------------------------------------------+ //| Zn_CodeChecker_01.mq4 | //| Copyright 2021, Zyuna32246 | //| https://zyunafx.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, Zyuna32246" #property link "https://zyunafx.com/" #property version "1.00" #property strict #property indicator_chart_window //---パラメーター入力 input string Indicator="AMAngleZn"; //インジケーター名 //+------------------------------------------------------------------+ int OnInit(){ return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { string com=""; //com変数を宣言 //0~19までループ処理 for(int i=0;i<20;i++){ //com変数に値を足して行く com+=StringConcatenate(i," = ",iCustom(_Symbol,0,Indicator,i,0),"\n"); } Comment(com); //コメント出力 return(rates_total); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } |
では順番に見てみましょう。
パラメーターでカスタムインジケーター名を設定
string型で任意の変数にカスタムインジケーター名を入力出来るようにする事で、パラメーターから任意のカスタムインジケーターのバッファ番号の中身を調べる事が出来るようになります。
1 2 |
//---パラメーター入力 input string Indicator="AMAngleZn"; //インジケーター名 |
その他の期間などの変更したいパラメーターがあれば追加して下さい。
各バッファ番号の中身を取得してコメント表示
OnCalculate関数内に各バッファ番号の中身を取得してコメント表示するコードを記述して行きます。
まずはstring型でcom変数(任意名)を宣言します。
1 |
string com=""; //com変数を宣言 |
次にインジケーターによってバッファ番号が何番まであるのか分からないので、今回は適当にfor文のループ処理で20個まで取得するようにしておきます。
1 2 3 4 5 |
//0~19までループ処理 for(int i=0;i<20;i++){ //com変数に文字列を足して行く com+=StringConcatenate(i," = ",iCustom(_Symbol,0,Indicator,i,0),"\n"); } |
i変数はバッファ番号にあたり、iCustom関数でiバッファ番号の値を取得し、”\n”は改行を意味します。
最後にコメント出力させます。
1 |
Comment(com); //コメント出力 |
インジケーターを削除した時のコメント削除コード
インジケーターを削除してもコメント文字は勝手に消えてくれないので、インジケーターを削除する直前に動作するOnDeinit関数内に以下のコードを書いておきます。
様は空文字で上書きする感じですね。
1 2 3 |
void OnDeinit(const int reason) { Comment(""); } |
使用方法と見方
使用方法としては、動いているチャート上にドラッグ&ドロップしてもらうと左上にコメントが表示されます。
しかし、それだとバッファ番号と現在足で入っている数値だけ表示されるだけなのでチャートが動くまで待たないといけません。
そんなに待てないのでストラテジーテスターを使って確認します。
ストラテジーテスターでの使い方
ここでは重要ポイントだけ紹介します。
①:インディケータを選択する。
②:今回のコードのインディケーターを選択する。
③:ビジュアルモードにチェックを入れる。
他:通貨ペアや時間足、期間などはお好みで変更して下さい。
※:プロパティで確認したいインジケーター名の入力も忘れないように!
設定が完了したら右下の「スタート」をクリックする事で指定期間のチャートが表示されて動き始めます。
そのチャートに確認したいインジケーター「今回はAMAngle」をドラッグ&ドロップする事で表示されるので、実際の動作を確認しながらバッファ番号と中身の値を確認する事が出来ます。
ビジュアルモード横にあるバーを左右に動かしてチャートの進行速度を調整する事が出来ます。
その横には一時停止ボタンがあります。もう一度押せば再生になります。
※間違えて右下の「ストップ」を押さないようにして下さい。完全に止まりますw
CodeCheckerとカスタムインジケーターの相互見方
バッファ番号と中身が見えても、どのバッファに欲しい情報が入っているかが分からないのでその確認方法です。
表示しているインジケーターをダブルクリックするとパラメーターウインドウが表示されますので、その中の「色の設定」タブを表示するとどの線がどの表示されているのかが分かると思います。
※幅やスタイルを変更してみるとより分かりやすいです。
このAMAngleインジケータは、バッファ0が移動平均線のライン、1が買い矢印、2が売り矢印となっていますので、例えば上矢印が出たタイミングで買いエントリーしたい場合は以下のようなコードになります。
※上画像では下矢印が出現している時、バッファ2に価格が入っていて、バッファ1は0になっているのが確認出来ると思います。
1 2 3 4 5 6 7 8 |
//バッファ番号1=買い矢印が出現するタイミングには価格が入る。 double UP1=iCustom(_Symbol,0,"AMAngle_Zn",1,1); //1本前 double UP2=iCustom(_Symbol,0,"AMAngle_Zn",1,2); //2本前 //1本前に上矢印が出現 & 2本前には矢印が出現していない if(UP1!=0 && UP2==0){ 買いエントリー } |
ちなみに注意として、このコードを現在足「0」と1本前で書いてしまうと、現在足はまだ確定していないので値動きによって上矢印が表示したり消えたりします。
その度にエントリーしてしまうような事が起きてしまうので注意して下さい。
まとめ
iCustom関数はプログラム初心者は使わない方が良いとよく記事を見かけますが、とても便利なので使ってみて下さい。
ただし、使用する際には注意して下さい!
先ほどの説明した通り、取得する値の足を間違えたEAを作成すると簡単に破産するEAを作ってしまう事もありますので、バックテストでの動作確認。デモ口座での動作確認は必ず必要です。
ネットにあるインジケーターをiCustom関数を使って動かす際にも、中身が見えない場合ので意図しない動作が含まれている可能性もあります。
こういった事を踏まえて、プログラム初心者は使わない方が良い。という事も分かります。
なので初心者の方は、石橋を叩いて渡るように動作確認してから使用しましょう!
失敗して気付く事は沢山あるので、まずはチャレンジする事が大事だと思います!(ダメージは最小限に!)
では( ・Д・)
コメント