ZigZag指标的问题 - 页 2

 
我忘了强调指标值,最小值符合,但最大值不符合,我试图在第二张图中显示...
 
aed71:

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

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

第二

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

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


我看到你的ZigZag指标中只有一个值

这个值是什么呢?

 
aed71:

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

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

第二

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

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

你在你的iCustom例子中错误地使用了ZigZag。MetQuotes的标准ZigZag有三个 (而不是两个)缓冲区(iCustom中的模式或行指数)。

  1. 模式=0:同时保持高点和低点ZigZag。
  2. 模式=1:高点,但不一定只有ZigZag点(因为它也持有重绘点)。
  3. 模式 = 2: 低点,但不一定只有ZigZag点(因为它也持有重绘点)。

你需要将第一个缓冲区(模式0)与其他两个缓冲区进行比较,以决定它是一个高点还是一个低点(例如,如果缓冲区1和缓冲区3的值相同,那么它就是一个低ZigZag点,如果缓冲区1和缓冲区2的值相同,那么它就是一个高点)。

另外,为了更好地理解ZigZag是如何工作的,以及它是如何重绘的,我建议玩一下我的 ZigZagZug指标。然而,在你的代码中使用MetaQuotes ZigZag,因为它更快。我的版本做了更多的处理,因为有额外的功能,所以比较慢。

PS!如果缓冲区1(模式=0)的值为0.0,但其他缓冲区的值非零,那么它们是旧的重绘点,而不是ZigZag点。

在你的代码中,你把模式0缓冲区作为低点,模式1缓冲区作为高点。这是完全不正确的。

 
FMIC:

你在你的iCustom例子中对ZigZag的使用是错误的。MetQuotes的标准ZigZag有三个 (而不是两个)缓冲区(iCustom中的模式或行指数)。

  1. 模式=0:同时保持高点和低点ZigZag。
  2. 模式=1:高点,但不一定只有ZigZag点(因为它也持有重绘点)。
  3. 模式 = 2: 低点,但不一定只有ZigZag点(因为它也持有重绘点)。

你需要将第一个缓冲区(模式0)与其他两个缓冲区进行比较,以决定它是一个高点还是一个低点(例如,如果缓冲区1和缓冲区3的值相同,那么它就是一个低ZigZag点,如果缓冲区1和缓冲区2的值相同,那么它就是一个高点)。

另外,为了更好地理解ZigZag是如何工作的,以及它是如何重绘的,我建议玩一下我的 ZigZagZug指标。然而,在你的代码中使用MetaQuotes ZigZag,因为它更快。我的版本做了更多的处理,因为有额外的功能,所以比较慢。

PS!如果缓冲区1(模式=0)的值为0.0,但其他缓冲区的值非零,那么它们是旧的重绘点,而不是ZigZag点。

在你的代码中,你把模式0缓冲区作为低点,模式1缓冲区作为高点。这是完全不正确的。


看这里https://www.mql5.com/en/forum/149492/page2#912747 外栏是旧编码Zigzag的一个问题。

黄线给出了一个更好的方法来显示Zigzag。

 
deVries:


请看这里https://www.mql5.com/en/forum/149492/page2#912747 外栏是旧编码Zigzag的一个问题。

黄线给出了一个更好的方法,即 "之 "字形必须如何显示。


外栏与 "aed71 "目前的困境没有关系。他对ZigZag的使用只是不正确。

请不要偏离目前的问题,因为你只会使情况变得混乱。

另外,我也给了一个链接,是我的ZigZagZug代码,不存在这个问题。

 
FMIC:

你在你的iCustom例子中对ZigZag的使用是错误的。MetQuotes的标准ZigZag有三个 (而不是两个)缓冲区(iCustom中的模式或行指数)。

  1. 模式=0:同时保持高点和低点ZigZag。
  2. 模式=1:高点,但不一定只有ZigZag点(因为它也持有重绘点)。
  3. 模式 = 2: 低点,但不一定只有ZigZag点(因为它也持有重绘点)。

你需要将第一个缓冲区(模式0)与其他两个缓冲区进行比较,以决定它是一个高点还是一个低点(例如,如果缓冲区1和缓冲区3的值相同,那么它就是一个低ZigZag点,如果缓冲区1和缓冲区2的值相同,那么它就是一个高点)。

另外,为了更好地理解ZigZag是如何工作的,以及它是如何重绘的,我建议玩一下我的 ZigZagZug指标。然而,在你的代码中使用MetaQuotes ZigZag,因为它更快。我的版本做了更多的处理,因为有额外的功能,所以比较慢。

PS!如果缓冲区1(模式=0)的值为0,但其他缓冲区有值,那么它们是旧的重绘点。


很好,谢谢你的重要提示!现在我明白了为什么它不能工作。现在我明白了为什么它不工作了......

我认为Metaquotes ZigZag的原始代码是不正确的,因为它 只有两个缓冲区。所以我在想,其中一个应该是高的,另一个是低的......

事实上,标题也不匹配,我最近看到。有人应该检查一下!

我指的是这里的代码 https://www.mql5.com/en/code/7796

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer[shift]=val;
      //--- high
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0; 
              } 
           }
        }
      ExtMapBuffer2[shift]=val;
     }

   // final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         res=ExtMapBuffer2[shift];
         if(res!=0.0) ExtMapBuffer[shift]=res;
        }
     }
  }
 
aed71:


很好,谢谢你的重要提示!现在我明白为什么它不能工作了...

我认为Metaquotes ZigZag的原始代码是不正确的,因为它 只有两个缓冲区。所以我在想,其中一个应该是高位,另一个是低位......

事实上,标题也不匹配,我最近看到。有人应该检查一下!

我指的是这里的代码 https://www.mql5.com/en/code/7796


不要使用该代码!那是古老的!

使用目前通过LiveUpdates推送的代码。使用目前600以上的版本,或者至少是509的版本。

PS!NB!另外,在名称中只使用 "ZigZag "而不是在iCustom中使用 "ZigZag.ex4"。

 
FMIC:


不要使用那个代码!那是古老的!

使用目前通过LiveUpdates推送的代码。使用目前的600+版本,或者至少是509版本。

PS!NB!另外,在名称中只使用 "ZigZag "而不是在iCustom中使用 "ZigZag.ex4"。


嗨,FMIC。

谢谢你的提示。我是在文件的末尾加上ex4,以免忘记编译。不幸的是,我的新版本610 ZigZag被旧版本取代了。

我决定使用你的,因为时间对我来说不是一个问题。我在这里也面临一些问题,如果你能指导我,我将不胜感激。

我使用了上面所说的同样的代码,只是把文件名改成了你的版本。我使用的是参数6,5,3;这是与你的默认设置的唯一区别。

我面临一些问题。

首先,指标在每一个tick都会加载,以读取zh,zl值。而在最后,它释放了所有的负载(你在图片中看不到),说明类似"2014.02.22 09:35:09.171 2013.11.01 22:55 Custom indicator ZigZagZug EURUSD,M15: removed" 。 请参考我附上的日志文件。这是否会导致以后的内存问题?

其次在日志中,计数器cnt从cnt8跳到cnt84,这很奇怪。在日志中,它没有跳跃。我想我应该把日志看作是正确的值。

第三个也是最关键的一个问题是,它发现了两个低点,而它不应该这样做。在图中我想得到灰色之字形线的高低值,但当我在日志中写下所有的高低值时,它们与你的粉色和青色的点完全相同。然而我只需要人字形的数值。我已经检查了其他的缓冲区,但没有带来正确的值。有什么建议吗?或者我应该使用经典的 "之 "字形(用于构建610?)

谢谢。

ZigZagZug

 
aed71:


你好,FMIC。

谢谢你的提示。我在文件的末尾加上ex4,以免忘记编译。不幸的是,我的新版本610 ZigZag被旧版本所取代。

我决定使用你的,因为时间对我来说不是问题。我在这里也面临一些问题,如果你能指导我,我将不胜感激。

我使用了上面所说的同样的代码,只是把文件名改成了你的版本。我使用的是参数6,5,3;这是与你的默认设置的唯一区别。

有什么建议吗?或者我应该使用经典的 "之 "字形(用于构建610?)

谢谢。

使用新的610 ZigZag没有任何问题。事实上,我鼓励你用它来代替,这样它就能与未来的版本兼容。不要使用旧的,甚至是我的那个。

我的ZigZagZug指标使用了额外的参数,而且顺序和类型不同,所以你不能只使用你现在使用的类似iCustom。它是完全不同的。

另外,我在指标中使用了7个缓冲区来实现额外的功能。它应该被用作理解ZigZag的视觉学习工具,而不是真正用于EA。

PS!在使用iCustom 对EA进行回测时,指标加载和卸载几次是正常的。这完全取决于EA和指标的编码方式。为了防止这种情况,并使EA更快,我通常只在EA本身重新编码基本代码,以便不依赖外部指标,但这是另一个问题,与您的情况没有直接关系。只是对你未来的EA提出一个建议。

 
aed71:


嗨,FMIC。

...我想得到灰色之字形线的高低值,但当我在日志中写下所有的高低值时,它们与你的粉色和青色的点完全一样。但是我只需要人字形的数值。...

谢谢。


正如之前的帖子所解释的,你不能只用高位和低位缓冲区来获得ZigZag的点,因为它们也包括重绘的点(ZigZagZug上的水红色和洋红色圆圈)。在标准的ZigZag上也是这样的,只是你看不到它们而已。这就是为什么我的指标会显示它们,以便你能更好地理解它。

你必须将高点和低点缓冲区与第一个容纳低点和高点的缓冲区进行比较,以便只过滤出ZigZag点。

NB!您需要将第一个缓冲区(模式0)与其他两个缓冲区进行比较,以决定它是高点还是低点(例如,如果缓冲区1和缓冲区3的值相同,那么它就是一个低ZigZag点,如果缓冲区1和缓冲区2的值相同,那么它就是一个高点)。

如果你愿意,请把你的文件附在帖子里,我将对它进行修正,这样你就能看到如何正确使用它(附在帖子里,不要用SRC,以免造成长篇大论)。

原因: