ZigZagインジケータに関する問題

 

こんにちは。

私は、過去データ(ピークとボトム)を掘り起こすエキスパートを開発し、私のメインエキスパートに使用しようとしています。ジグザグはシンプルで簡単に高値・安値がわかるので、使ってみることにしました。

問題は、iCustom()関数を使ってZigZag.ex4を呼び出すと、正しい高値と安値が取得できないことです。再描画を避けるために、iCustom()のインジケータのインデックス20を再描画の基本的な保護として使用しました。

ZigZagのコードには2つのバッファがあります(metaquotesのバージョンを使用 https://www.mql5.com/en/code/7796 )。高値と安値を逆に取ることもありますが、今のところあまり関係ありません。

ある値はコードと一致し、ある値は一致せず、ジャーナルでは、同じ列に高い値と低い値の両方を見ることができますが、これは不可能です。

ジグザグ

私のコードは以下の通りです。

//+------------------------------------------------------------------+
//|                                                 ZigZagDigger_02  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
/* 

*/

#include <stderror.mqh>
#include <stdlib.mqh>
    
int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

int init()
  {
   ArrayInitialize(Zig_high,0);
   ArrayInitialize(Zig_low,0);
   return(0);
 } 
   
int deinit()
{ 
   return(0);
}

void start()
  {
  
   static datetime tmp;
  

   //  On every tick
   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop
         
   
  }

ジグザグインジケーターの使い方が間違っているのか、それともコードを間違えたのでしょうか?問題が見つからないので、私の問題を特定するためにあなたの助けを親切にお願いします。

ありがとうございます。

 
aed71:

こんにちは。

私は、過去データ(ピークとボトム)を掘り起こすエキスパートを開発し、私のメインエキスパートに使用しようとしています。ジグザグはシンプルで簡単に高値・安値がわかるので、使ってみることにしました。

問題は、iCustom()関数を使ってZigZag.ex4を呼び出すと、正しい高値と安値が取得できないことです。再描画を避けるために、iCustom()のインジケータのインデックス20を再描画の基本的な保護として使用しました。

ZigZagのコードには2つのバッファがあります(metaquotesのバージョンを使用 https://www.mql5.com/en/code/7796 )。高値と安値を逆に取ることもありますが、今のところあまり関係ありません。

ある値はコードと一致し、ある値は一致せず、ジャーナルでは、同じ列に高い値と低い値の両方を見ることができますが、これは不可能です。

私のコードは以下の通りです。

ジグザグインジケーターの使い方が間違っているのか、それともコードを間違えたのでしょうか?問題が見つからないので、私の問題を特定するためにあなたの助けを親切にお願いします。

ありがとうございます。

あなたは、そのEAがどのように動作するかのコードMACDサンプルを読んで伝えることができますか?

私にはあなたが試したことがないように見える....

あなたが書いたものは、私が何かを行うようなものです......何が起こるかわからない あなたは私が何をしたか教えてもらえますか?

Every tick loop あなたのすべてのティックループは何ですか?

これですか?

   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop

yes then where is the loop ?

いいえ、それからあなたのコードが何を意味するか行ごとに説明してください...

 
aed71: ジグザグインジケータの使い方が間違っているのか、コードを間違えてしまったのか、どちらでしょうか?
  1. フォーラムを検索 すれば、答えが見つかるはずです。
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZagは すべてのバッファ要素を埋めるわけではありません(DRAW_SECTIONを 使用します)。ゼロでない値を持つシフトを見つけるまでループで呼び出しを行います。
 
WHRoeder:
  1. フォーラムを検索して いれば、答えが見つかったはずです。
  2. ZigZag はすべてのバッファ要素を埋めるわけではありません (DRAW_SECTION を 使用します。) 非ゼロの値を持つシフトを見つけるまで、ループで呼び出しを実行します。


はい、私はそれがすべてのバッファの要素を埋めることはありません知っています。私はゼロ(HighとLowがない場合)とHighとLowの値も含めてすべてのデータを配列に入れたいと思っています。その理由は、deinit()の内部で別の処理を行い、その配列を使って高値と安値のティック差を計算させたいからです。つまり、2つの高値の間に何ティック経過しているか、高値と安値の差はどれくらいか、ということです。しかし、私はまだその段階に到達していません。

なぜ、画像にあるように、高値と安値の両方を同時に返してしまうのでしょうか?これが私の主な問題です...

ありがとうございます。

 
deVries:

MACD Sampleのコードを読んで、そのEAがどのように動作するか教えてもらえますか?

私にはあなたが試したことがないように見えます....

あなたが書いたものは、私が何かをするようなものです......何が起こるかわからない 私が何をしたか教えてもらえますか?

Every tick loop あなたのすべてのティックループは何ですか?

これですか?

yes then where is the loop ?

いいえ、それからあなたのコードが意味するものを一行ずつ説明してください....

ループの問題はないと思います。ループは機能して結果をプリントアウトします。15分ごとにどのように動作しているか、緑色の長方形で確認してください。Start()関数自体がループなんですよね?

15Mごと

 
aed71:

ループの問題はないと思います。ループは動作し、結果をプリントアウトします。緑色の長方形で、15分ごとにどのように動作しているかを確認してください。Start()関数自体はループしていますよね?



Start() 関数自体がループであることは正しいです。

でも、そのループはどこから始まって、どこでStart()関数が終わるのでしょうか?

それは別の場所です。

出力されたメッセージは、毎回のように繰り返されるわけではありません.

では、何をやっているのでしょう......?

あなたのコードの行を説明してみてください......あなたができる限り

 
deVries:


Start()関数そのものがループであることは正しいのですが

しかし、そのループはどこで始まり、どこでStart()関数が終わるのでしょうか?

それは別の場所です.

出力されたメッセージは、tickごとに繰り返されるわけではありません.

では、何をやっているのでしょう・・・・・・?

あなたのコードの行を説明してみてください......あなたができる限り


うまく説明できなかったらごめんなさい。

このエキスパートはバックテストに 使用するもので、私の目的は15Mチャートで過去の高値と安値を見つけることです。そして、その高値と安値のデータを再処理して、グラフの位相と振幅を計算しようと思っています。

高値と安値を格納するために2つの配列、ティックをカウントするために1つのカウンターを使用しました。配列のサイズは1000で、最大で2日間動作させます(1日あたり1440/15=96ティック)。

int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

init()関数で、配列にゼロを入力しています。

start()関数の中で、新しいティックがトリガーされたかどうかを以下のコードでチェックしています。

 if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];

   // the code here runs every 15M.

   }

つまり、start()関数はバックテスト(2日間)が終了するまで連続的にループしているのです。

私の主な問題は、ZigZagの呼び出しだと思います。以下、ジグザグインジケーターを呼び出しています。通常、高値や安値があれば、ゼロ以外の値で返すはずです。しかし、私の場合、時々、低値と高値の両方が同じ値で返されることがあり、これは不可能です。


  double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

  Zig_high[cnt]=zh;
  Zig_low[cnt]=zl;
  cnt=cnt+1;

多分、私はMetaquotesのオリジナルのジグザグ・インジケータ(下記参照)で使用されている配列を理解していなかったのでしょう。私の理解では、これらは高値と安値を保存するために使用されます。

//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

ありがとうございます。

 

読書と学習の時間を取る

これも少しは役に立つかもしれません。

iCustomの詳しい説明

 
私のコードも添付しておきますが...。
ファイル:
 
データウィンドウの表示とは何ですか?
 
deVries:
データウィンドウは何を表示しているのでしょうか?

下のグラフは最小値(カーソル位置の値、データウィンドウの値、出力は同じ)です。

第1回

下のグラフは、6ティック後の最高値の部分です。データウィンドウもカーソルポイントも同じですが、出力は同じではなく、しかも低値と高値の両方が返されます。

第2回第2回

iCustom()が正しくインジケータをロードしていることを確認しました。安値は同じですが、高値が違います。ZigZagインジケータと関係があるのでしょうか?

何が間違っているのか、本当に理解できません。

理由: