zigzagを使ったEA

2026/06/21 09:16
27

zigzagのリペイントしない過去の高値、安値を使ってロジックを組みたいのですが、
可能でしょうか?

例えば、何番目前の高値、安値みたいに条件を設定できるインジケーターを導入して
もらえたらありがたいのですが、

コメント

GogoJungle
2026/06/23 18:15

zigzagの確定済みの過去高値・安値を使ってEAロジックを組みたい、というご質問ですね。

残念ながら、EAつくーるの機能のみでは「ZigZagの何番目前の高値・安値」を直接指定して条件に使うことは難しいです。

EAつくーるの「取引条件」では、カスタムインジケーターの値を参照することは可能ですが、ZigZagのように「直近から数えて何個目の山・谷を取得する」という処理は、通常の「計算位置:何本前」とは考え方が異なります。

たとえば「10本前のZigZag値」は指定できても、「2個前のZigZag高値」「3個前のZigZag安値」のような指定は、EAつくーる標準機能だけでは行えません。

EAつくーるの機能のみでは「ZigZagの何番目前の高値・安値」を直接取得することはできませんが、出力されたコードを改造することで実現可能であると存じます。
修正方法を考えてみましたので提案させていただきます。

【準備】

まずEAつくーる側では、仮のエントリー条件を設定してEAを作成してください。
例として、初期状態に近い以下のような条件で問題ありません。

ローソク足 = ローソク足
↓
買いエントリー

その後、出力されたmq4ファイルをMetaEditorで開き、ZigZagの過去高値・安値を取得する処理を追加します。

【修正方法】

まず、コード内で以下を検索してください。

double PriceToPipsWithSymbol(double value, string symbol)

この関数より下あたりに、次の関数を追加します。

【修正後】

double getZigZagHigh(int zigzagIndex, int depth = 12, int deviation = 5, int backstep = 3)
{
   int count = 0;

   for(int i = 3; i < Bars; i++) {
      double zz = iCustom(Symbol(), 0, "ZigZag", depth, deviation, backstep, 0, i);

      if(zz != 0 && MathAbs(zz - iHigh(Symbol(), 0, i)) < Point * 10) {
         count++;
         if(count == zigzagIndex) return(zz);
      }
   }

   return(0);
}

double getZigZagLow(int zigzagIndex, int depth = 12, int deviation = 5, int backstep = 3)
{
   int count = 0;

   for(int i = 3; i < Bars; i++) {
      double zz = iCustom(Symbol(), 0, "ZigZag", depth, deviation, backstep, 0, i);

      if(zz != 0 && MathAbs(zz - iLow(Symbol(), 0, i)) < Point * 10) {
         count++;
         if(count == zigzagIndex) return(zz);
      }
   }

   return(0);
}

次に、エントリー条件部分を修正します。
コード内で以下を検索してください。

【修正前】

if(iClose(Symbol(), 0, 0)+PipsToPrice(0)  ==  iClose(Symbol(), 0, 0)+PipsToPrice(0)) signal = 1;

たとえば「現在価格が直近の確定ZigZag高値を上抜けたら買い」という条件にする場合は、以下のように変更します。

【修正後】

double zigzagHigh1 = getZigZagHigh(1);

if(zigzagHigh1 > 0 && Ask > zigzagHigh1) signal = 1;

また、「現在価格が直近の確定ZigZag安値を下抜けたら売り」にする場合は、以下のようにします。

double zigzagLow1 = getZigZagLow(1);

if(zigzagLow1 > 0 && Bid < zigzagLow1) signal = -1;

「2番目前のZigZag高値」を使いたい場合は、次のように指定します。

double zigzagHigh2 = getZigZagHigh(2);

「3番目前のZigZag安値」を使いたい場合は、次のように指定します。

double zigzagLow3 = getZigZagLow(3);

【注意点】

ZigZagは性質上、直近の山・谷が後から変わることがあります。
そのため、リペイントを避けたい場合は、現在足や直近すぎる値を使わず、ある程度過去の確定した山・谷を使う必要があります。

上記サンプルでは for(int i = 3; i < Bars; i++) としており、現在足・1本前・2本前を避けて検索しています。
より安全にしたい場合は、i = 5i = 10 から検索する形に変更してください。

例:

for(int i = 10; i < Bars; i++) {

このようにすると、より過去のZigZag値だけを対象にできます。

なお、ご要望の「何番目前のZigZag高値・安値を条件に使えるインジケーター」につきましては、EAつくーる側の標準項目としては現在対応しておりません。
対応する場合は、カスタムインジケーター側で「直近高値」「2個前の高値」「直近安値」「2個前の安値」などを別々のバッファとして出力し、EAつくーるの「カスタムインジケーター」で参照する方法が比較的扱いやすいです。

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。