MT4 如何获取zigzag指标每个折点的时间或者Bars值

 

我想根据zigzag指标获取过去折点的数值,目前只能获取折点最高价(最低价),想借此判断中长期趋势。

兄弟才疏学浅,可实在不知道从哪获取。希望大家不吝赐教,多谢!!

extern int ExtDepth=8;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

void start()
  {

   datetime some_time=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);

   int shift=iBarShift(Symbol(),0,some_time);


   Print(ZigV(0,8,5,3)+"__"+TimeToStr(TimeLocal(),TIME_DATE|TIME_MINUTES)+"__"+Bars);
   return;
  }
double ZigV(int VNum,int ExtDepth,int ExtDeviation,int ExtBackstep)
  {

   double p0,p1,p2,p3,p4,tmp;

   for(int i=0; i<=10000; i++)

     {
      tmp=iCustom(Symbol(),0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
      if(tmp>0 && p4==0 && p3>0)
         p4=tmp;
      if(tmp>0 && p3==0 && p2>0)
         p3=tmp;

      if(tmp>0 && p2==0 && p1>0)
         p2=tmp;

      if(tmp>0 && p1==0 && p0>0)
         p1=tmp;

      if(tmp>0 && p0==0)
         p0=tmp;

      if(p0>0 && p1>0 && p2>0 && p3>0 && p4>0)
         break;
     }

   if(VNum==0)
      return(p0);
   if(VNum==1)
      return(p1);
   if(VNum==2)
      return(p2);
   if(VNum==3)
      return(p3);
   if(VNum==4)
      return(p4);
  }

Domain Registration Services
  • www.registryrocket.com
Get a unique domain name plus our FREE value-added services to help you get the most from it. Call it a "dot-com name," a URL, or a domain. Whatever you call it, it's the cornerstone of your online presence, and we make getting one easy. Simply enter the name you want in the search field above, and we'll tell you instantly whether the name is...
 

套用你的自定義 挑出Bar的位置

沒電腦測試 你自己試試看行不行

int ZigB(int VNum,int ExtDepth,int ExtDeviation,int ExtBackstep) // 定義成正整數

  {

   double p0,p1,p2,p3,p4,tmp;

   int       b0,b1,b2,b3,b4; //定義計算Bar的數


   for(int i=0; i<=10000; i++)

     {
      tmp=iCustom(Symbol(),0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
      if(tmp>0 && p4==0 && p3>0)
         {p4=tmp; b4=i}                   //p4成立時 b4=i
      if(tmp>0 && p3==0 && p2>0)
         {p3=tmp; b3=i}

      if(tmp>0 && p2==0 && p1>0)
         {p2=tmp; b2=i}

      if(tmp>0 && p1==0 && p0>0)
         {p1=tmp; b1=i}

      if(tmp>0 && p0==0)
         {p0=tmp; b0=i}

      if(p0>0 && p1>0 && p2>0 && p3>0 && p4>0)
         break;
     }

   if(VNum==0)
      return(b0);
   if(VNum==1)
      return(b1);
   if(VNum==2)
      return(b2);
   if(VNum==3)
      return(b3);
   if(VNum==4)
      return(b4);
  }
 

谢谢!代码可用,虽然没有不是我想要的结果 但是让我想到可以实现的方式了。再次谢谢   

如果我这里想要开盘价、收盘价 成交量之类的如何获取?

 
//+------------------------------------------------------------------+
//|                                                  test_ZigZag.mq4 |
//|                                           Copyright 2020,fxMeter |
//|                            https://www.mql5.com/en/users/fxmeter |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020,fxMeter"
#property link      "https://www.mql5.com/en/users/fxmeter"
#property version   "1.00"
#property strict


extern int ExtDepth=8;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

struct ZigZag
{
   int shift;//K线位置
   int flag;//ZZ是高点还是低点,1是高点,-1是低点
   double value;//ZZ的值
};

#define  ZZ_NUM   16    // 找最近16个ZZ拐点
ZigZag ZZ[ZZ_NUM];      // 找最近16个ZZ拐点
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
   
   GetZigZag(ExtDepth,ExtDeviation,ExtDeviation);//获得16个拐点
   for(int i=0; i<ZZ_NUM; i++)
   {
      int flag = ZZ[i].flag;
      if(flag==1)//是个高点
      {
         int k = ZZ[i].shift; //拐点对应的K线的位置
         //---
         double open = Open[k];//拐点开盘价
         double close = Close[k];//拐点收盘价
      }
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GetZigZag(int depth,int deviation,int backstep)
{
   int k=0;
   for(int i=0; i<Bars; i++)
   {
      double  z =  iCustom(NULL,0,"ZigZag",depth,deviation,backstep,0,i);
      if(z>0&&z!=EMPTY_VALUE) //是个拐点
      {
         if(z==High[i])//是个高点
         {
            ZZ[k].value = z;//拐点值
            ZZ[k].shift = i;//K线位置
            ZZ[k].flag = 1;//1 表示高点
         }
         else if(z==Low[i])//是个低点
         {
            ZZ[k].value = z;//拐点值
            ZZ[k].shift = i;//K线位置
            ZZ[k].flag = -1;// -1 表示低点
         }
         k++;
         if(k>=ZZ_NUM)break;
      }
   }
}
//+------------------------------------------------------------------+
附加的文件:
 
 
Ziheng Zhuang:


首先感谢出手,代码质量很高。    z!=EMPTY_VALUE   这个没看懂没查询文档,只有一条说明是划线的省缺值。能简单解释一下省缺值吗?  再次感谢
 

这个EMPTY_VALUE是系统默认的空值,空值的作用就是这个K线位置指标不显示。

指标的值与K线是一一对应,但不是所有K线对应的位置都需要显示指标,不显示的位置就用空值,这说明我们在EA中获取指标值时获得的值可能是空值,因此需要排除空值。

原因: