最低和最高函数返回什么

 
尊敬的Metatrader开发者!

最低和最高函数返回什么?
我为什么要问这样一个问题?对这些功能的描述令人困惑。在分析MetaTrader中的ZigZag为什么不能正常工作时,我面临的事实是,不清楚上述函数的返回内容。或者是由于描述混乱,它们没有被正确应用?我在本论坛第77页的 "基于艾略特波浪理论的交易策略 "部分描述了这个问题。我正在努力理解,也许ZigZag算法是错误的。但这一切都取决于这些功能如何运作。

我还观察到其他指标中这些功能的问题。但目前它是在ZigZag。

请澄清一下。
 
它们返回从当前条形图到历史背面的N个条形图中最高和最低的条形图的编号。在这种情况下,如果两个值相等(两个条形是这个样本的极值),总是返回较早出现的条形(较早)的编号。

Zigzag算法(包含在MT4标准中)没有考虑到一个柱子可以同时是最大值和最小值的情况(一个外柱)。
 
Rosh,这是可以理解的。 试着把我在波浪分析主题中给出的那些线条插入人字形文本。看看你能得到什么。而你得到的是垃圾。这就是为什么出现了这个问题。

在理论上一切都很清楚,直到它开始与实践相背离。如果发生错误,你必须一直走到最后。并找出错误的源头。
 
Rosh,这是可以理解的。 试着将我在波浪分析主题中给出的那些线条插入人字形文本。看看你能得到什么。而你得到的是垃圾。这就是为什么我问你这个问题。<br / translate="no">


我看了关于缟玛瑙的那一页,并打开标准的Zigzag进行比较。代码是不同的,你需要找到你的Zigzag版本来理解它,把它彻底拆开,只有这样你才能说些什么。这就是为什么我不能回答。

但是,是的,在代码中记录的数值有一些差异,这在你的页面上显示,但也许它应该是这样的,这很难说。我一直在用爬行值做这样的指标,它看起来像一个通道,但至少它不会在历史上说谎。
 
Rosh,这里是来自codebase.mql.com的人字形代码

//+------------------------------------------------------------------+
//| 自定义移动平均线.mq4|
//| Copyright © 2005, MetaQuotes Software Corp.
//|https://www.metaquotes.net/|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#属性链接"https://www.metaquotes.net/

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- 指标参数
外部intDepth=12。
Extern inttern ExtDeviation=5;
Extern inttern ExtBackstep=3;
//---- 指示器缓冲区
双倍ExtMapBuffer[]。
双倍ExtMapBuffer2[]。

//+------------------------------------------------------------------+
//|自定义指标初始化功能
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2)。
//---- 绘图设置
SetIndexStyle(0,DRAW_SECTION)。
//---- 指示器缓冲区的映射
SetIndexBuffer(0,ExtMapBuffer)。
SetIndexBuffer(1,ExtMapBuffer2)。
SetIndexEmptyValue(0,0.0)。
//---- 指标短名称
IndicatorShortName("ZigZag("+ExtDepth+", "+ExtDeviation+", "+ExtBackstep+")")。
//---- 初始化完成
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift,back,lasthighpos,lastlowpos。
double val,res;
双层Curlow,Curhigh,lasthigh,lastlow。

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


============================

星号表示我在波浪分析分支的第77页上引用的地方。这个代码与我引用的代码有什么不同?这是一个标准代码。

现在我引用你在这个主题的第二个帖子中的话

Rosh 18.10.06 10:14

它返回条形图的编号,该条形图是历史深度中从当前条形图开始的N个条形图中最高和最低的。在这种情况下,如果两个值相等(两个条形是该样本的极值),它们总是返回最先出现的条形的编号(是最古老的)。

Zigzag算法(作为标准包含在MT4中)并没有考虑到一个柱子可以同时是最大值和最小值的情况(外柱)。
======================
代码中有一行:val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]。
方括号中包含了酒吧的编号...你的答案说明了这个酒吧的号码是什么

然后在行中:ExtMapBuffer[shift]=val; - 我们有什么?我们需要进一步解释吗?

首先,指标缓冲区的索引必须等于条形图的索引,我们从中获取val值。否则,就会出现差异。我们实际上有什么,当我们看到人字形在空中有一个断裂。

Rosh,不要偏离主题。你的想法是 "之 "字形。让我们来看看这个问题的真相。代码中存在很多错误。如果你仔细解析我写的东西,你会看到明显的错误。

但这也不是主要的事情。如果只是关于这些错误,我就不会提出这个问题,这也是这个主题的标题。
 
还是关于最低和最高的功能。

在上一篇文章中,我写到了人字形代码中的一个错误。

主要的错误。

在ExtDepth条形图中,会搜索最高点或最低点的条形图。搜索是通过SHIFT栏进行的。罗氏给出了以下函数定义:它返回历史部分中当前条形的N个条形内最高和最低的条形的编号。但是没有定义目前的标准是什么。当前的条形图是一个零条形图或一个带有移位数字的条形图。根据人字形的给定代码判断,当前的条形应该被理解为带移位号的条形。

假设我们已经在酒吧的ExtDepth部分找到了酒吧的编号,从有shift编号的酒吧开始算。而这一栏不一定会有一个班次号。但是我们找到的与移位号的条形图不同的极值被放入移位号的指标缓冲区:ExtMapBuffer[shift]=val。因此,我们在悬挂在空中的 "之 "字形中得到休息。每个试图从MT工作的人都看到了之字形。

这是一个重大错误。但这个错误很容易纠正。而且这不值得提出来。

当人们开始清除这个错误时,就会问:在条形图上,最低和最高函数找到了我们要找的极值,是什么数字?这里没有逻辑帮助。无论我如何努力想弄清这根柱子的数量,都没有用。

这就是为什么这个问题是向开发商提出的。

但我很高兴这个问题得到了罗什的回答。正是在他的编辑之后,我们长期以来一直在使用MT附带的人字形。

亲爱的开发者,请注意所提出的问题。这些问题是严肃的。许多指标使用MT中包含的人字形。我无法计算有多少人对 "之 "字形工作的抱怨。
我已经给出了错误的描述。在很大程度上,必须纠正错误。忽视纠错会损害公司的声誉。而这并不是好事。没有人愿意这样。
 
......问题来了,最低和最高函数在哪个栏上找到了我们要找的极值?这里没有逻辑帮助。无论我如何努力计算条数,都没有用。根
据这个想法,酒吧的索引=Highest(NULL,0,MODE_HIGH,ExtDepth,shift)

即应该是ExtMapBuffer2[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]=val。
 
nen,现在我研究了标准的Zig-Zag算法--有另一种算法,与你给出的算法不同:

//+------------------------------------------------------------------+
//|                                                       ZigZag.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 ExtLowBuffer[];
double ExtHighBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtLowBuffer);
   SetIndexBuffer(2,ExtHighBuffer);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos,index;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;
//----
   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      index=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      val=Low[index];
      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=ExtLowBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtLowBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtLowBuffer[shift]=0.0;
      if(val!=0.0) ExtLowBuffer[index]=val;
      //--- high
      index=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      val=High[index];
      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=ExtHighBuffer[shift+back];
               if((res!=0)&&(res<val)) ExtHighBuffer[shift+back]=0.0; 
              } 
           }
        }
      ExtHighBuffer[shift]=0.0;
      if(val!=0.0) ExtHighBuffer[index]=val;
     }
//---- final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtLowBuffer[shift];
      curhigh=ExtHighBuffer[shift];
      if(curlow==0 && curhigh==0) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtHighBuffer[lasthighpos]=0;
            else ExtHighBuffer[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtLowBuffer[lastlowpos]=0;
            else ExtLowBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
//---- merge 2 buffers
   lasthighpos=-1;
   lastlowpos=-1;
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         curlow=ExtLowBuffer[shift];
         curhigh=ExtHighBuffer[shift];
         //----
         res=0;
         if(curlow!=0)
           {
            if(lastlowpos==-1)
              {
               res=curlow;
               lastlowpos=shift;
              }
            else
              {
               if(lasthighpos!=-1 && lastlowpos>lasthighpos)
                 {
                  res=curlow;
                  lastlowpos=shift;
                 }
              }
           }
         if(curhigh!=0)
           {
            if(lasthighpos==-1)
              {
               res=curhigh;
               lasthighpos=shift;
              }
            else
              {
               if(lastlowpos!=-1 && lasthighpos>lastlowpos)
                 {
                  res=curhigh;
                  lasthighpos=shift;
                 }
              }
           }
         //----
         ExtMapBuffer[shift]=res;
        }
     }
  }
//+------------------------------------------------------------------+



这里的一切似乎都是正确的--索引被保存,值被写入所需的数组元素 中。让我们从这个算法开始。

 
nen,请原谅我,但是写一个简短的代码,找到这些Lowest和Highest不是更容易吗?我根本就没有使用过这些函数,正是因为我通过简单的短代码获得我所需要的extrema数据,因为它肯定会比标准函数工作得更快。在我看来,只有在有必要获得另一个时间段的数据时,使用它们才有意义。
 
komposter,这就对了。然后看看它被写到哪里了。在指标缓冲区 中,有哪个索引。
Vladislav,代码来自codebase.mql.com,它是完全一样的。我将尝试把你的代码。我将看看可能发生什么。
Candid,我同意这可能更简单。但我将需要这些功能与另一个时间框架一起工作。
原因: