ZigZag指标的问题

 

你好。

我试图开发一个挖掘历史数据(峰值和底部)的专家,以用于我的主要专家。我决定使用Zigzag指标,因为它很简单,很容易找到高/低点。

我的问题是,当我使用iCustom()函数调用ZigZag.ex4时,我无法得到正确的高低值。为了避免重绘,我使用iCustom()指标的索引20作为重绘的基本保护。

在ZigZag代码中有两个缓冲区(使用metaquotes版本https://www.mql5.com/en/code/7796 )。我可能会把高位和低位的数值取反,但目前并不太重要。

有些值与代码相符,有些则不相符,在日志中,我可以看到同一列中的高值和低值,这是不可能的。

ZigZag

我的代码如下。

//+------------------------------------------------------------------+
//|                                                 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:

你好。

我试图开发一个挖掘历史数据(峰值和底部)的专家,以用于我的主要专家。我决定使用Zigzag指标,因为它很简单,很容易找到高/低点。

我的问题是,当我使用iCustom()函数调用ZigZag.ex4时,我无法得到正确的高低值。为了避免重绘,我使用iCustom()指标的索引20作为重绘的基本保护。

在ZigZag代码中有两个缓冲区(使用metaquotes版本https://www.mql5.com/en/code/7796 )。我可能会把高位和低位的数值取反,但目前并不太重要。

有些值与代码相符,有些则不相符,在日志中,我可以看到同一列中的高值和低值,这是不可能的。

我的代码如下。

我不知道我是否用错了 "之 "字形指标,或者我在代码中犯了一个错误?我找不到问题所在,所以我恳请您帮助查明我的问题。

谢谢

你能告诉阅读代码MACD样本,该EA是如何工作的吗?

在我看来,你从未尝试过....

你所写的就像我做了什么.....,不知道会发生什么,你能告诉我我做了什么吗?

你的每一个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: 我不知道我是否用错了Zig Zag指标,或者我在代码上犯了一个错误?
  1. 如果你在论坛上搜索了 一下,你会找到你的答案。
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZag 不会填入每一个缓冲区的元素(它使用DRAW_SECTION。)在一个循环中做你的调用,直到你找到有非零值的移位。
 
WHRoeder:
  1. 如果你在论坛上搜索一下,你会找到答案的。
  2. ZigZag 不会填入每一个缓冲区元素(它使用DRAW_SECTION)。


是的,我知道它不会填充每个缓冲区元素。我想把所有的数据放到一个数组中,包括零(如果没有高低值的话),也包括高低值。原因是我想在deinit()里面有另一个过程,用数组计算高低点之间的刻度差。我的意思是,例如,两个高点之间有多少个刻度,以及高点和低点之间的差异。但我还没有达到这个阶段。

为什么它同时返回高点和低点,正如我在图片中所想的那样(日记部分旁边有标记),而这些值并不对应于任何高点或低点......这是我的主要问题...

谢谢

 
deVries:

你能告诉我在阅读MACD样本代码时,该EA是如何工作的吗?

在我看来,你从未尝试过....

你所写的就像我做了什么.....,不知道发生了什么,你能告诉我我做了什么吗?

你的每一个tick循环是什么?

这个吗?

是的,那么这个循环在哪里呢?

没有,那就逐行解释你的代码是什么意思......

我不认为我有关于循环的问题,循环工作并打印出结果。它检查时间框架(在我的例子中是15M)并计算Zigzag值并打印出来。请查看绿色矩形,它是如何每15分钟工作的。Start()函数本身就是一个循环,不是吗?

每15分钟

 
aed71:

我不认为我有关于循环的问题,循环工作并打印出结果。它检查时间框架(在我的例子中是15分钟)并计算Zigzag值并打印出来。请查看绿色矩形,它是如何每15分钟工作的。Start()函数本身就是一个循环,不是吗?



你是对的,Start()函数本身就是一个循环。

但这个循环在哪里开始,Start()函数在哪里结束呢?

它是在其他地方...

你打印的信息并不是每一个刻度都在重复 ....

那么你在做什么?......?

尽量解释你的代码行.....。

 
deVries:


你是对的,Start()函数本身就是一个循环。

但这个循环在哪里开始,Start()函数在哪里结束呢?

它是在其他地方...

你所打印的信息并不是每一个刻度都在重复 ....

那么你在做什么?......?

尽量解释你的代码行.....。


如果我不能正确解释,我很抱歉。

这个专家是用来做回测 的,我的目的是在15M图表中找到历史高点和低点。我将对高点和低点数据进行重新处理,以计算图表的相位和振幅。

我的做法是:我用两个数组来存储高点和低点的数值,用一个计数器来计算刻度。数组大小为1000,因为我最多运行2天(每天1440/15=96个刻度),这已经足够了。

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

在init()函数中,我把数组中的数据填为零。

在start()函数中,我用下面的代码检查是否有新的tick被触发。

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

   // the code here runs every 15M.

   }

所以start()函数有一个连续的循环,直到回测(2天)结束。

我认为我的主要问题是调用ZigZag。下面我正在调用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 zigzag指标中使用的数组(见下文)。我的理解是,这些是用来存储高点和低点值的。

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

谢谢

 

花一些时间阅读和学习

这可能对你也有一点帮助

iCustom的详细解释

 
我还附上了我的代码...
附加的文件:
 
什么是数据窗口的显示?
 
deVries:
数据窗口显示的是什么?

下图显示的是最低值(光标点值、数据窗口值和输出都是一样的)。

第一届

下图是6个刻度后的最高高点部分。数据窗口和光标点都是一样的,但是输出却不一样,而且它同时返回低值和高值。

第2次第2次

我检查了iCustom()加载指标是否正确。低值是一样的,但高值却不一样。这是否与ZigZag指标有关?

我做错了什么,我真的不明白。