ZigZagの天底の値の取得方法[MT4][EA][備忘録]

EA(Expert Advisor)
スポンサーリンク

Mt4のカスタムインジケーターZigZagの天井(山)と底(谷)の値を取得するためのサンプルコードを紹介します。

ZigZagは山で高値、谷で安値を返し、その他の場所ではすべて0を返します。

EAでZigZagを使うにはiCustom()を使います。ZigZagの場合は、

double iCustom(NULL,PERIOD_5M,”ZigZag”,12,5,3,0,1)

のように、

iCustom(通貨ペア、時間足、”インジケーター名”、Depth,Deviation,Backstep,バッファー,Barの位置)

の形になります。(これはZigZagの場合であって他のカスタムインジケーターでは違う書き方になります)。バッファーは複数のiCustomでZigZagを使うときに変えます。

//---Zigzag--------------------------------------------------------------//
int m,n;
m=0;
n=0;
double Top[10];
double Bottom[10];
int tPosition[10];
int bPosition[10];
   for(int i=0;i<=200;i++)
   {
      double Zg=NormalizeDouble(iCustom(NULL,0,"ZigZag",12,5,3,0,i),5);
      if(Zg!=0 && Zg==NormalizeDouble(High[i],5))
      {
         Top[m++]=Zg;
         tPosition[m-1]=i;
         if(m>=10)break;
      }
      if(Zg!=0 && Zg==NormalizeDouble(Low[i],5))
      {
         Bottom[n++]=Zg;
         bPosition[n-1]=i;
         if(n>=10)break;
      }
}
Comment("Top_0= ",Top[0],",Position=",tPosition[0],"\n",
"Top_1=",Top[1],",Position=",tPosition[1],"\n",
"Top_2=",Top[2],",Position=",tPosition[2],"\n",
"Bottom_0=",Bottom[0],",Position=",bPosition[0],"\n",
"Bottom_1=",Bottom[1],",Position=",bPosition[1],"\n",
"Bottom_2=",Bottom[2],",Position=",bPosition[2],"\n");
//---Zigzag--------------------------------------------------------------//

上のサンプルコードでは、for関数を使ってローソク200本分のZigZagの値を計算し、その中でZigZagが0以外かつ該当ローソクの高値と一致する場合に山、0以外かつ安値と一致する場合に谷として値を取得します。

山はTop[]に谷はBottom[]に格納され、山のローソク位置はtPosition[]に谷のローソク位置はbPosition[]に格納されます。

また、山谷いずれかの値を10個格納した場合にforのループを抜けるようにしてあります。

コード最下部ではComment()を使って取得した値をチャート上に表示させます。値の確認に使ってください。

コメント

  1. まお より:

    こんにちは。

    ZigZagの検索をしていて、こちらのサイトにたどり着きました。
    ZigZagの頂点が見事に取得できていますね。感激しました。

    一つ教えていただきたく思います。

    14行目に、Top[m++]=Zg; との記述がありますね。
    forループで、初回にこの行を実行する場合は、mが0から1インクリメントされて、mの値は1となるように思います。

    ですので、初回は、Top[1]=Zg; と解釈されると思うのです。

    そうなると、Top[0]が一度も計算されないことにならないのでは、と悩んでしまいます。

    私はMQLの初心者なので、何か根本的な見落としをしているような気がするのですが、それが何かわかりません。

    どうか、このあたりを解説していただけませんでしょうか?

    よろしくお願いいたします。

  2. izu より:

    まおさん、コメントありがとうございます。
    Top[m++]=Zg;の「m++」は初回では「0を代入しその後インクリメント」ということになるのでTop[0]はしっかり計算できますよ!Bottom[0]も同様です。
    分かりにくければ、14行目から16行目を
    Top[m]=Zg;
    tPosition[m]=i;
    m++;
    if(m>=10)break;
    に変えてもらっても動作すると思います。

    実際に値が取得できているかは、MT4のストラテジーテスターのビューモードでコードを実行してみると分かると思います。

  3. れん より:

    このサンプルコードを使ってEAを作ろうとしている者です。
    このコードから直近の天底の値をとるにはどうしたらいいですか?

    • izu より:

      直近の天底はtPositon[0]bPosition[0]の条件で天がTop[0]、底がBottom[1]です。
      返信が遅くなってすみません。

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