自作サインツール|ZigZagの頂点で高勝率サインを出す方法(サンプルプログラムあり)

Sponsor Link








ミーでございます。

今回は相場分析に良く使われている有名な「ZigZag」を使用したサインツールを作っていきます!

ZigZagの頂点は必ず折り返しますので、それ通りのエントリーできたら・・・凄い高勝率なサインツールになりますよね(笑)って、それは事実なのですが、そんな簡単に高勝率のサインツールは作成できません。

ZigZagは、”騙しが非常に多い”ため、あくまで目安として使いましょう!

サインツールの作成が初めてという方は、以下の記事を読んでから見ていただけると更に分かり易いです。

自作サインツールの作り方|環境準備とサンプル動作の確認を初心者にも分かり易く説明

2021年12月21日

ZigZagとは

「ZigZag」はインジケーターの中にある「テクニカルツール」の一つで、レート(価格)の高値・安値を分かりやすくシンプルに表示しているインジケーターです。

高値・安値を線で引いてくれますので、相場が上昇傾向なのか、下降傾向なのか分析するのに役立ちます。多くのトレーダーの方が使用しているインジケーターですね。

私が作成しているインジケーターやサインツールでも、内部的に「ZigZag」を使用しているものが多いです。上手に活用すれば、レンジ相場の判断や、安値更新、高値更新時の順張りなどにも活用できると思いますし、ダウ理論と相性が良いと思います。

ZigZagはサインツールに不向き!?

ZigZagは、その名の通り高値・安値をジグザグに線を引いてくれるインジケーターです。過去のチャートと見ると、ZigZagの頂点でエントリーした場合、かなり高勝率(80%程度)で勝てていますよね(笑)

それもそのはずで、ZigZagの頂点は、高値から下降方向へ、安値から上昇方向へ折り返した位置(折り返し候補を含む)で構成されていますので、もし仮にZigZagの頂点を予測することができて、その頂点でエントリーできたら単発勝率80%以上いけます。

そんな、ZigZagですが、ZigZagを使用したサインツールは嫌われる傾向にあります。その理由はズバリ、

頂点が確定するまで、リペイントが発生する

ということです。

良くサインツールでリペイントするものがありますが、リペイントは変動するものを条件にした場合に発生します。つまり、Zigzagは頂点が確定するまでに何度も頂点が変わりますので、リペイントが発生します。

サインツールを作成している多くの方が、このZigZagを利用して、反発箇所を導き出そう・・・とチャレンジされたことだと思いますが、最終的にはリペイントの壁を超えることはできません。

過去チャートは確定している「ZigZag」の頂点でサインが出ていますので、そりゃ勝ててるように見えますが、実際には勝っている箇所の多くが残って表示されているだけです。

とは言っても、「ZigZag」の頂点エントリーは魅力的で夢がありますよね。そのため、今回は皆様に、ZigZagを使用したサインツールをご紹介しようと思いました!

ZigZagの頂点でサインを出そう!

ZigZagを使用したサインツールを実際に作っていきましょう。

ZigZagのインジケーターの値を取得する一番簡単な方法は、iCustomと呼ばれる関数を使用して、ZigZagを使用することです。

#property indicator_chart_window
#property indicator_buffers 2

extern int InpDepth = 12;
extern int InpDeviation = 5;
extern int InpBackstep = 3;


double DrawReverseLowBuffer[];
double DrawReverseHighBuffer[];


int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars=IndicatorCounted(); 
   int limit = Bars - counted_bars;
   double dResultZHigh,dResultZLow;
   
   for (int i=limit-1;i>=0;i--){
      dResultZHigh = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 1, i);
      if(dResultZHigh != 0.0){
         DrawReverseLowBuffer[i]=High[i];
      }
      dResultZLow  = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 2, i);
      if(dResultZLow != 0.0){
         DrawReverseHighBuffer[i]=Low[i];
      }
   }
   return(0);
}

上記を実行すると、ZigZagの頂点でサインが表示されますよね!

      dResultZHigh = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 1, i);
      if(dResultZHigh != 0.0){
         DrawReverseLowBuffer[i]=High[i];
      }
      dResultZLow  = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 2, i);
      if(dResultZLow != 0.0){
         DrawReverseHighBuffer[i]=Low[i];
      }

上記が今回のポイントとなります。

iCustomを使用して、ZigZagを呼び出しています。ZigZagのパラメータは3つ(InpDepth、InpDeviation、InpBackstep)です。その後の「1」と「2」は高値、安値のどちらを取得するのかを指定しています。最後のiは、取得する基準のローソク足ですね。

過去チャートを見てください!ほぼ勝っていませんか?凄いですよね。これがリペイントするサインツールの勝率(破壊力)となります(笑)

もっと勝率を上げる方法

もう少し、勝率を上げる方法としては、折り返しする頂点が、折り返しと逆(高値なら陰線、安値なら陽線)になっている箇所の方が、その方向に勢いが生じてくる可能性がありますので、勝率は高くなりますよね。

折り返し部分に、陰線・陽線を加味したサインツールは、以下となります。

#property indicator_chart_window
#property indicator_buffers 2

extern int InpDepth = 12;
extern int InpDeviation = 5;
extern int InpBackstep = 3;


double DrawReverseLowBuffer[];
double DrawReverseHighBuffer[];


int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars=IndicatorCounted(); 
   int limit = Bars - counted_bars;
   double dResultZHigh,dResultZLow;
   
   for (int i=limit-1;i>=0;i--){
      dResultZHigh = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 1, i);
      if(dResultZHigh != 0.0 && !isSunshineLine(i)){
         DrawReverseLowBuffer[i]=High[i];
      }
      dResultZLow  = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 2, i);
      if(dResultZLow != 0.0 && isSunshineLine(i)){
         DrawReverseHighBuffer[i]=Low[i];
      }
   }
   return(0);
}

bool isSunshineLine(int index){
   if(Close[index] > Open[index]){
     return(true);
   }
   return(false);
}

以下のようなサインが表示されていると思います。画像の4か所だけ見ると勝率100%です。

      dResultZHigh = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 1, i);
      if(dResultZHigh != 0.0 && !isSunshineLine(i)){
         DrawReverseLowBuffer[i]=High[i];
      }
      dResultZLow  = iCustom(Symbol(), 0, "ZigZag", InpDepth, InpDeviation, InpBackstep, 2, i);
      if(dResultZLow != 0.0 && isSunshineLine(i)){
         DrawReverseHighBuffer[i]=Low[i];
      }

上記がポイントとなる部分です。以前、ご紹介した陽線・陰線を判断するロジックを組み込んでいます。

自作サインツール|陽線・陰線と大陽線・大陰線の判断方法(サンプルプログラムあり)

2021年12月26日

今回ご紹介したサインツールは、Zigzagを利用したサインツールです。ぜひ、色々と改良して、もっと高勝率のサインツールを開発してみてはいかがでしょうか?

サインツール作成の記事一覧はこちら

Sponsor Link








コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です