MT4指标:NonLagZigZag_v2源码

阅读 :
外_汇_邦 WaiHuiBang.com

这是一款改编ZigZag未来MT4指标

 

MT4指标:NonLagZigZag_v2源码.gif

 

//+------------------------------------------------------------------+

//|                                              NonLagZigZag_v2.mq4 |

//|                                Copyright ?2006, TrendLaboratory |

//|            http://finance.groups.yahoo.com/group/TrendLaboratory |

//|                                   E-mail: igorad2003@yahoo.co.uk |

//+------------------------------------------------------------------+

#property copyright "Copyright ?2006, TrendLaboratory"

#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

//----

#property indicator_chart_window

#property indicator_buffers 1

//----

#property indicator_color1 Gold

#property indicator_width1 2

//---- input parameters

extern int     Price      =0;  //Apply to Price(0-Close;1-Open;2-High;3-Low;4-Median price;5-Typical price;6-Weighted Close) 

extern int     Length      =100;  //Period of NonLagMA

extern double  PctFilter  =2;  //Dynamic filter in decimals

//----

double ZZBuffer[];

double MABuffer[];

double trend[];

double Del[];

double AvgDel[];

//----

int    ilow, ihigh, nlow, nhigh, prevnhigh,prevnlow, BarsBack;

double alfa[];

datetime lotime,hitime;

int    i, Phase, Len, Cycle=4, Back=0;

double Coeff, beta, t, Sum, Weight, g;

double pi=3.1415926535;

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

  int init()

  {

   IndicatorBuffers(5);

   SetIndexStyle(0,DRAW_SECTION);

   SetIndexBuffer(0,ZZBuffer);

   SetIndexBuffer(1,MABuffer);

   SetIndexBuffer(2,trend);

   SetIndexBuffer(3,Del);

   SetIndexBuffer(4,AvgDel);

   string short_name;

//---- indicator line

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));

//---- name for DataWindow and indicator subwindow label

   short_name="NonLagZigZag("+Length+")";

   IndicatorShortName(short_name);

   SetIndexLabel(0,"NonLagZigZag");

//----

   SetIndexEmptyValue(0,0.0);

   SetIndexDrawBegin(0,Length*Cycle+Length);

//----

   Coeff= 3*pi;

   Phase=Length-1;

   Len=Length*Cycle + Phase;

   ArrayResize(alfa,Len);

   Weight=0;

   for(i=0;i<Len-1;i++)

     {

      if (i<=Phase-1) t=1.0*i/(Phase-1);

      else t=1.0 + (i-Phase+1)*(2.0*Cycle-1.0)/(Cycle*Length-1.0);

      beta=MathCos(pi*t);

      g=1.0/(Coeff*t+1);

      if (t<=0.5)g=1;

      alfa[i]=g * beta;

      Weight+=alfa[i];

     }

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| NonLagZigZag_v2                                                  |

//+------------------------------------------------------------------+

int start()

  {

   int    i,shift,limit;

   double price,smin,smax;

   int counted_bars = IndicatorCounted();

   if(counted_bars < 0)  return(-1); 

   if(counted_bars > 0)   counted_bars--;

   limit = Bars - counted_bars;

   if(counted_bars==0) limit-=1+1+MathMax(Len,Length);

 

   for(shift=limit;shift>=0;shift--)

     {

      Sum=0;

      for(i=0;i<=Len-1;i++)

        {

         price=iMA(NULL,0,1,0,3,Price,i+shift);

         Sum+=alfa[i]*price;

        }

      if (Weight > 0) MABuffer[shift]=Sum/Weight;

      Del[shift]=MathAbs(MABuffer[shift] - MABuffer[shift+1]);

//----

      double sumdel=0;

      for(i=0;i<=Length-1;i++) sumdel+=Del[shift+i];

      AvgDel[shift]=sumdel/Length;

//----

      double sumpow=0;

      for(i=0;i<=Length-1;i++) sumpow+=MathPow(Del[shift+i]-AvgDel[shift+i],2);

      double StdDev=MathSqrt(sumpow/Length);

      double Filter=PctFilter * StdDev;

      if (Filter < Point) Filter=Point;

      if(MathAbs(MABuffer[shift]-MABuffer[shift+1]) < Filter)MABuffer[shift]=MABuffer[shift+1];

//----

      trend[shift]=trend[shift+1];

      if (MABuffer[shift]-MABuffer[shift+1] > Filter) trend[shift]= 1;

      if (MABuffer[shift+1]-MABuffer[shift] > Filter) trend[shift]=-1;

      if(trend[shift]>0)

        {

         if(trend[shift]!=trend[shift+1])

           {

            ilow=LowestBar(iBarShift(NULL,0,hitime,FALSE)-shift,shift);

            lotime=Time[ilow];

            ZZBuffer[ilow]=Low[ilow];

           }

         else

            if (shift==0)

              {

               int hilen=iBarShift(NULL,0,lotime,FALSE);

               nhigh=HighestBar(hilen,0);

               ZZBuffer[nhigh]=High[nhigh];

               if (nhigh== 0) for(i=hilen-1;i>=1;i--) ZZBuffer[i]=0;

               if (nhigh > 0) for(i=nhigh-1;i>=0;i--) ZZBuffer[i]=0;

              }

        }

      if (trend[shift]<0)

        {

         if(trend[shift]!=trend[shift+1])

           {

            ihigh=HighestBar(iBarShift(NULL,0,lotime,FALSE)-shift,shift);

            hitime=Time[ihigh];

            ZZBuffer[ihigh]=High[ihigh];

           }

         else

            if (shift==0)

              {

               int lolen=iBarShift(NULL,0,hitime,FALSE);

               nlow=LowestBar(lolen,0);

               ZZBuffer[nlow]=Low[nlow];

               if (nlow==0) for(i=lolen-1;i>=1;i--) ZZBuffer[i]=0;

               if (nlow >0) for(i=nlow-1;i>=0;i--) ZZBuffer[i]=0;

              }

        }

     }

   return(0);

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

int LowestBar(int len,int k)

  {

   double min=10000000;

   int lobar;

//----

   for(int i=k+len-1;i>=k;i--)

      if(Low[i] < min) {min=Low[i]; lobar=i;}

   if(len<=0) lobar=k;

   return(lobar);

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

int HighestBar(int len,int k)

  {

   double max=-10000000;

   int hibar;

   for(int i=k+len-1;i>=k;i--)

      if(High[i] > max) {max=High[i]; hibar=i;}

   if(len<=0) hibar=k;

   return(hibar);

  }

//+------------------------------------------------------------------+

外_汇_邦 WaiHuiBang.com
本文标题:MT4指标:NonLagZigZag_v2源码 - MT4平台MQL4编程学习
本文地址:http://www.waihuibang.com/fxschool/autotrading/mql4/40717.html

相关文章

  • 一个带注释的完整的EA基础构架【源码】

    希望学习EA编程的朋友,可以参考如下我们提供的源码【带注释】这个EA例子的交易逻辑是:N日高点 N日低点,超过高点做空,低过低点做多。带止损 止盈 及移动止损的处理部分。如果你能细心研究掌握此EA的设计逻辑,基本可以入...

    MQL4编程学习
  • 编写一个成功EA的全过程和必须注意的事项
    编写一个成功EA的全过程和必须注意的事项

    从系统交易的观点看。从上到下形成交易策略思想比起从下到上形成交易策略思想有以下优点: 1. 有利于把握局部的挫折与全局的失败关系。 2. 有利于交易系统的风险控制。 3. 有利于对交易系统 的维护与修改。...

    MQL4编程学习
  • 外汇EA的种类

    这几年国内外的外汇EA技术有了极大的发展,各种新型外汇EA不断涌现,我仅对其进行大概的分类,不够完善和严谨之处,敬请原谅。 1、趋势类 最常见也是最成熟的类型,趋势类。最为主流的EA类型,一般根据各种指标和策略来进行出...

    MQL4编程学习
  • EA编程教程第一讲 MQL语法

    什么是MQL?MetaQuotes Language 4 (MQL4)语言是MT4软件为了编写出执行交易策略的内置编程语言。我们可以通过编写EA(Expert Advisors)来控制MT4客户端按照我们的预先定义好的交易策略来执行外汇交易。另外,我们可以使...

    MQL4编程学习
  • Sidus v.2指标源码[MT4公式]
    Sidus v.2指标源码[MT4公式]

    有了这个指标,可以很容易的使用tick数据而不是HLOC数据来计算其它任何指标,如用 iMAOnArray(.....)来得到tick数据的MA。 注意:新加入本指标或在指标列表中修改参数,MT将会重新初始化指标,MT没提供tick数据数组记录,当然,本指标显示的tick是从初始化时刻开始收集获得的,初始化时历史数据缺省使用当前时间周期的close数据填充。所以从指标初始化开始,需要一段时间收集tick数据才有足够数据可观察显示。...

    MQL4编程学习
你可能感兴趣