ZigZag_R_





//+------------------------------------------------------------------+
//|                                                    Zigzag_R_.mq4 |
//|                 Copyright © 2005-2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
/* Ýòîò âàðèàíò Zigzag'à ÿâëÿåòñÿ ïðîñòîé îïòèìèçàöèåé ñòàðîãî       |
âàðèàíòà, ê êîòîðîìó ïðèâûêëè ñîòíè òûñÿ÷ ïîëüçîâàòåëåé Metatrader   |
åùå ñ âåðñèè ÌÒ3 (ÿçûê MQL2).                                        |
Èñïîëüçîâàíèå èíäèêàòîðà áåç îïòèìèçàöèè äåëàëî ñëîæíûì è äîëãèì     |
òåñòèðîâàíèå ñîâåòíèêîâ, èñïîëüçóþùèõ çíà÷åíèÿ ïîëüçîâàòåëüñêîãî     |
èíäèêàòîðà Zigzag. Îïòèìèçèðîâàííûé âàðèàíò ðåøàåò äàííóþ ïðîáëåìó.  | 
 ïåðâûé ðàç, ïðè ïåðâîì çàïóñêå èíäèêàòîð ïðîñ÷èòûâàåò âñþ èñòîðèþ. | 
Ïðè ïîñëåäóþùèõ âûçîâàõ ïðè ïðèõîäå íîâûõ òèêîâ â ðåàëüíîì âðåìåíè   |
èëè ïðè èñïîëüçîâàíèè â òåñòåðå íàõîäèòñÿ òðåòèé ýêñòðåìóì îò        |
òåêóùåãî âðåìåíè âãëóáü èñòîðèè è ïåðåñ÷åò íà÷èíàåòñÿ ñ íåãî. Åñëè   |
Âû õîòèòå íà÷èíàòü ïåðåñ÷åò ñî âòîðîãî ýêñòðåìóìà, ïîìåíÿéòå         |
çíà÷åíèå ïåðåìåííîé level, êîòîðàÿ îïðåäåëÿåò ãëóáèíó ïåðåñ÷åòà:     |
int level = 3; // recounting's depth                                 |
Âñå íàçâàíèÿ âíåøíèõ ïåðåìåííûõ ñîõðàíåíû èç ñîîáðàæåíèé             |
ïðååìñòâåííîñòè. Êðîìå òîãî, óáðàíû ýêñòðåìóìû, âèñÿùèå â âîçäóõå,   |
êîòîðûå îáðàçîâûâàëèñü íà ìèíóòíûõ òàéì-ôðåéìàõ.                     |
//+------------------------------------------------------------------+
*/
#property copyright "Copyright © 2007, 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 ZigzagBuffer[];
double HighMapBuffer[];
double LowMapBuffer[];
// recounting's depth 
int level = 3; 
bool downloadhistory = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0, DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0, ZigzagBuffer);
   SetIndexBuffer(1, HighMapBuffer);
   SetIndexBuffer(2, LowMapBuffer);
   SetIndexEmptyValue(0, 0.0);
//---- indicator short name
   IndicatorShortName("ZigZag(" + ExtDepth + "," + ExtDeviation + 
                      "," + ExtBackstep + ")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i, counted_bars = IndicatorCounted();
   int limit, counterZ, whatlookfor;
   int shift, back, lasthighpos, lastlowpos;
   double val, res;
   double curlow, curhigh, lasthigh, lastlow;
// history was downloaded
   if(counted_bars == 0 && downloadhistory) 
     {
       ArrayInitialize(ZigzagBuffer, 0.0);
       ArrayInitialize(HighMapBuffer, 0.0);
       ArrayInitialize(LowMapBuffer, 0.0);
     }
//----
   if(counted_bars == 0) 
     {
       limit = Bars - ExtDepth;
       downloadhistory = true;
     }
//----
   if(counted_bars > 0) 
     {
       //----
       while(counterZ < level && i < 100)
         {
           res = ZigzagBuffer[i];
           if(res != 0) 
               counterZ++;
           i++;
         }
       i--;
       limit=i;
       //----
       if(LowMapBuffer[i] != 0) 
         {
           curlow = LowMapBuffer[i];
           whatlookfor = 1;
         }
       else
         {
           curhigh = HighMapBuffer[i];
           whatlookfor = -1;
         }
       //----
       for(i = limit - 1; i >= 0; i--)  
         {
           ZigzagBuffer[i] = 0.0;  
           LowMapBuffer[i] = 0.0;
           HighMapBuffer[i] = 0.0;
         }
     } 
//----
   for(shift = limit; shift >= 0; shift--)
     {
       val = Low[iLowest(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 = LowMapBuffer[shift+back];
                   //----
                   if((res != 0) && (res > val)) 
                       LowMapBuffer[shift+back] = 0.0; 
                 }
             }
         } 
       //----
       if(Low[shift] == val) 
           LowMapBuffer[shift] = val; 
       else 
           LowMapBuffer[shift] = 0.0;
       //--- high
       val = High[iHighest(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 = HighMapBuffer[shift+back];
                   //----
                   if((res != 0) && (res < val)) 
                       HighMapBuffer[shift+back] = 0.0; 
                 } 
             }
         }
       //----
       if(High[shift] == val) 
           HighMapBuffer[shift] = val; 
       else 
           HighMapBuffer[shift] = 0.0;
     }
// final cutting 
   if(whatlookfor == 0)
     {
       lastlow = 0;
       lasthigh = 0;  
     }
   else
     {
       lastlow = curlow;
       lasthigh = curhigh;
     }
//----
   for(shift = limit; shift >= 0; shift--)
     {
       res = 0.0;
       //----
       switch(whatlookfor)
         {
           // look for peak or lawn 
           case 0: if(lastlow == 0 && lasthigh == 0)
                     {
                      if(HighMapBuffer[shift] != 0)
                        {
                          lasthigh = High[shift];
                          lasthighpos = shift;
                          whatlookfor = -1;
                          ZigzagBuffer[shift] = lasthigh;
                          res = 1;
                        }
                      if(LowMapBuffer[shift] != 0)
                        {
                          lastlow = Low[shift];
                          lastlowpos = shift;
                          whatlookfor = 1;
                          ZigzagBuffer[shift] = lastlow;
                          res = 1;
                        }
                     }
                    break;  
           // look for peak
           case 1: if(LowMapBuffer[shift] != 0.0 && LowMapBuffer[shift] < lastlow && 
                      HighMapBuffer[shift] == 0.0)
                     {
                       ZigzagBuffer[lastlowpos]=0.0;
                       lastlowpos=shift;
                       lastlow=LowMapBuffer[shift];
                       ZigzagBuffer[shift]=lastlow;
                       res=1;
                     }
                   if(HighMapBuffer[shift] != 0.0 && LowMapBuffer[shift] == 0.0)
                     {
                       lasthigh = HighMapBuffer[shift];
                       lasthighpos = shift;
                       ZigzagBuffer[shift] = lasthigh;
                       whatlookfor = -1;
                       res = 1;
                     }   
                   break;               
           // look for lawn
           case -1:  if(HighMapBuffer[shift] != 0.0 && 
                        HighMapBuffer[shift] > lasthigh && 
                        LowMapBuffer[shift] == 0.0)
                       {
                         ZigzagBuffer[lasthighpos] = 0.0;
                         lasthighpos = shift;
                         lasthigh = HighMapBuffer[shift];
                         ZigzagBuffer[shift] = lasthigh;
                       }
                     if(LowMapBuffer[shift] != 0.0 && HighMapBuffer[shift] == 0.0)
                       {
                         lastlow = LowMapBuffer[shift];
                         lastlowpos = shift;
                         ZigzagBuffer[shift] = lastlow;
                         whatlookfor = 1;
                       }   
                     break;               
           default: return; 
         }
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_SECTION


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: