优化的ZZ指标


//+------------------------------------------------------------------+//|                                                       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#property indicator_width1 0#property indicator_style1 1//---- extern int ExtDepth = 12;extern int ExtDeviation = 5;extern int ExtBackstep = 3;//---- double ZigZagBuffer[];//+------------------------------------------------------------------+//| ZigZag initialization function                                   |//+------------------------------------------------------------------+int init()  {    //----     SetIndexBuffer(0, ZigZagBuffer);     SetIndexStyle(0, DRAW_SECTION);    SetIndexEmptyValue(0, 0.0);    IndicatorShortName("ZigZag(" + ExtDepth + "," + ExtDeviation + "," +                      ExtBackstep + ")");    //----     return(0);  }//+------------------------------------------------------------------+//|  ZigZag iteration function                                       |//+------------------------------------------------------------------+int start()  {    //+ check whether the amount of bars is sufficient for correct    //  calculation of the indicator    if(Bars - 1 < ExtDepth)        return(0);    //+ Introduction of integer memory variables to re-count the indicator     //  on uncounted bars only    static int time2, time3, time4;      //+ Introduction of floating-point variables to re-count     //  the indicator on uncounted bars only    static  double ZigZag2, ZigZag3, ZigZag4;    //+ Introduction of integer variables to re-count the indicator only    //  on uncounted bars and getting of indicators already counted    int MaxBar, limit, supr2_bar, supr3_bar, supr4_bar;    int counted_bars = IndicatorCounted();    // check for possible errors    if(counted_bars < 0)        return(-1);    // the last counted bar must be re-counted    if(counted_bars > 0)         counted_bars--;    //----+ Introduction of variables        int shift, back, lasthighpos, lastlowpos;    double val, res, TempBuffer[1];    double curlow, curhigh, lasthigh, lastlow;    // determining of the oldest bar number, starting from which    // all bars will be fully re-counted    MaxBar = Bars - ExtDepth;     // determining of the start bar number in the loop, starting from     // which new bars will be re-counted    if(counted_bars == 0)        limit = MaxBar;    else       {        //----        supr2_bar = iBarShift(NULL, 0, time2, TRUE);        supr3_bar = iBarShift(NULL, 0, time3, TRUE);        supr4_bar = iBarShift(NULL, 0, time4, TRUE);        //----        limit = supr3_bar;              if((supr2_bar < 0) || (supr3_bar < 0) || (supr4_bar < 0))          {            limit = MaxBar;            Print("Start bar was not found,",            " the indicator will be re-counted on all bars" );          }      }    // initialization of null    if(limit >= MaxBar)       {        for(shift = Bars - 1; shift >= MaxBar; shift--)            ZigZagBuffer[shift] = 0.0;         limit = MaxBar;       }     // change of the temporary buffer size    if(ArrayResize(TempBuffer, Limit + ExtBackstep + 1)!=       limit + ExtBackstep + 1)        return(-1);    //+ start of the first large loop    for(shift = limit; 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  val))                         ZigZagBuffer[shift+back] = 0.0;                   }              }          }         ZigZagBuffer[shift] = val;        //---         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 = TempBuffer[shift+back];                    if((res != 0) && (res < val))                     TempBuffer[shift+back] = 0.0;                   }               }          }        TempBuffer[shift] = val;      }    //+ end of the first large loop     // final cutting     lasthigh = -1;     lasthighpos = -1;    lastlow = -1;     lastlowpos = -1;    //----+ start of the second large loop    for(shift = limit; shift >= 0; shift--)      {        curlow = ZigZagBuffer[shift];        curhigh = TempBuffer[shift];        if((curlow == 0) && (curhigh == 0))             continue;        //---        if(curhigh != 0)          {            if(lasthigh > 0)               {                if(lasthigh < curhigh)                     TempBuffer[lasthighpos] = 0;                else                     TempBuffer[shift] = 0;              }            if(lasthigh < curhigh || lasthigh < 0)              {                lasthigh = curhigh;                lasthighpos = shift;              }            lastlow = -1;          }        //----        if(curlow != 0)          {            if(lastlow > 0)              {                if(lastlow > curlow)                     ZigZagBuffer[lastlowpos] = 0;                else                   ZigZagBuffer[shift] = 0;              }            //---            if((curlow < lastlow) || (lastlow < 0))              {                lastlow = curlow;                lastlowpos = shift;              }             lasthigh = -1;          }      }    //+ end of the second large loop    //+ start of the third loop    for(shift = limit; shift >= 0; shift--)      {        res = TempBuffer[shift];        if(res != 0.0)             ZigZagBuffer[shift] = res;      }    //+ end of the third loop    //+ Restoring of values of the indicator buffer that     //  could be lost     if(limit < MaxBar)      {        ZigZagBuffer[supr2_bar] = ZigZag2;         ZigZagBuffer[supr3_bar] = ZigZag3;         ZigZagBuffer[supr4_bar] = ZigZag4;         for(int qqq = supr4_bar - 1; qqq > supr3_bar; qqq--)            ZigZagBuffer[qqq] = 0;         for(int ggg=supr3_bar - 1; ggg > supr2_bar; ggg--)            ZigZagBuffer[ggg] = 0;      }    //+ correction of hills     double vel1, vel2, vel3, vel4;    int bar1, bar2, bar3, bar4;    int count;    if(limit == MaxBar)        supr4_bar = MaxBar;    for(int bar = supr4_bar; bar >= 0; bar--)      {        if(ZigZagBuffer[bar] != 0)          {            count++;            vel4 = vel3;            bar4 = bar3;            vel3 = vel2;            bar3 = bar2;            vel2 = vel1;            bar2 = bar1;            vel1 = ZigZagBuffer[bar];            bar1 = bar;            if(count < 3)                continue;             if((vel3 < vel2) && (vel2 < vel1))                ZigZagBuffer[bar2] = 0;            if((vel3 > vel2) && (vel2 > vel1))                ZigZagBuffer[bar2] = 0;            if((vel2 == vel1) && (vel1 != 0))                ZigZagBuffer[bar1] = 0;                }      }     //+ memorizing of the last three inflections of the ZigZag and     //  the indicator values at these points     time2 = Time[bar2];    time3 = Time[bar3];    time4 = Time[bar4];    ZigZag2 = vel2;      ZigZag3 = vel3;     ZigZag4 = vel4;     //---- completion of calculating the indicator values    return(0);  } //---+ +----------------------------------------------------------+

15.jpg

微信公众号:天泓评测

本博客所有文章如无特别注明均为原创。作者:天泓评测
分享到:更多

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)