Zigzag2_R_





//+------------------------------------------------------------------+
//|                                                   Zigzag2_R_.mq4 |
//|                 Copyright © 2005-2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
/* Â ñòàíäàðòíîì èíäèêàòîðå http://codebase.mql4.com/ru/238 äëÿ      |
ðèñîâàíèÿ èñïîëüçîâàëñÿ ñòèëü DRAW_SECTION. Ýòîò ñòèëü ïîçâîëÿåò     |
ðèñîâàòü îòðåçêàìè òîëüêî ìåæäó òî÷êàìè, íàõîäÿùèìèìñÿ íà ðàçíûõ     |
áàðàõ. Ñòèëü îòðèñîâêè DRAW_ZIGZAG ïîçâîëÿåò ñíÿòü ýòî îãðàíè÷åíèå,  |
äëÿ ýòîãî èñïîëüçóþòñÿ äâà áóôåðà âìåñòî îäíîãî. Äëÿ èëëþñòðàöèè     |
ýòîãî ñòèëÿ è áûë íàïèñàí Zigzag2_R_.mq4.                            |
 êîä äîáàâëåíà îáðàáîòêà âíåøíåãî  áàðà (outside bar), êîãäà  High  |
òåêóùåãî áàðà âûøå ïðåäûäóùèõ, à Low òåêóùåãî áàðà íèæå ïðåäûäóùèõ.  |
Êîä òàêæå äåìîíñòðèðóåò, ÷òî öâåò îïðåäåëÿåòñÿ öâåòîì ïåðâîãî èç     |
äâóõ áóôåðîâ.                                                        |
#property indicator_chart_window                                     |
#property indicator_buffers 2                                        |
#property indicator_color1 Blue                                      |
#property indicator_color2 Red                                       |
Äëÿ âûçîâà ýòîãî èíäèêàòîðà èç äðóãèõ ïðîãðàìì íà mql4 òåïåðü        |
íåîáõîäèìî èñïîëüçîâàòü äâå êîíñòðóêöèè:                             |
iCustom(NULL, 0, "Zigzag2_R_", 12, 5, 3, 0, index) - ïè÷êè           |
iCustom(NULL, 0, "Zigzag2_R_", 12, 5, 3, 1, index) - äîíûøêè         |
Áëîê îáðàáîòêè âíåøíåãî áàðà äàí êàê ïðèìåð. Âû ìîæåòå èñïîëüçîâàòü  |
ñâîé àëãîðèòì äëÿ òàêîé ñèòóàöèè.                                    |
//+------------------------------------------------------------------+
*/
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- indicator parameters
extern int ExtDepth = 12;
extern int ExtDeviation = 5;
extern int ExtBackstep = 3;
//---- indicator buffers
double ZigzagPeakBuffer[];
double ZigzagLawnBuffer[];
double HighMapBuffer[];
double LowMapBuffer[];
int level = 3; // recounting's depth 
bool downloadhistory = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(4);
//---- drawing settings
   SetIndexStyle(0, DRAW_ZIGZAG);
   SetIndexStyle(1, DRAW_ZIGZAG);
//---- indicator buffers mapping
   SetIndexBuffer(0, ZigzagPeakBuffer);
   SetIndexBuffer(1, ZigzagLawnBuffer);
   SetIndexLabel(0, "ZigzafPeak");
   SetIndexLabel(1, "ZigzafLawn");
//----
   SetIndexBuffer(2, HighMapBuffer);
   SetIndexBuffer(3, LowMapBuffer);
//----
   SetIndexEmptyValue(0, 0.0);
   SetIndexEmptyValue(1, 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(ZigzagPeakBuffer, 0.0);
       ArrayInitialize(ZigzagLawnBuffer, 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 = (ZigzagPeakBuffer[i] + ZigzagLawnBuffer[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--)  
         {
           ZigzagPeakBuffer[i] = 0.0;  
           ZigzagLawnBuffer[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;
                           ZigzagPeakBuffer[shift] = lasthigh;
                           res = 1;
                         }
                       if(LowMapBuffer[shift] != 0)
                         {
                           lastlow = Low[shift];
                           lastlowpos = shift;
                           whatlookfor = 1;
                           ZigzagLawnBuffer[shift] = lastlow;
                           res = 1;
                         }
                     }
                   break;  
           // look for peak
           case 1: if(LowMapBuffer[shift] != 0.0 && LowMapBuffer[shift] < lastlow &&
                      HighMapBuffer[shift] == 0.0)
                     {
                       ZigzagLawnBuffer[lastlowpos] = 0.0;
                       lastlowpos = shift;
                       lastlow = LowMapBuffer[shift];
                       ZigzagLawnBuffer[shift] = lastlow;
                       res = 1;
                     }
                   if(HighMapBuffer[shift] != 0.0 && LowMapBuffer[shift] == 0.0)
                     {
                       lasthigh = HighMapBuffer[shift];
                       lasthighpos = shift;
                       ZigzagPeakBuffer[shift] = lasthigh;
                       whatlookfor = -1;
                       res = 1;
                     }   
                   break;               
           // look for lawn
           case -1:  if(HighMapBuffer[shift] != 0.0 && 
                        HighMapBuffer[shift] > lasthigh && 
                        LowMapBuffer[shift] == 0.0)
                       {
                         ZigzagPeakBuffer[lasthighpos] = 0.0;
                         lasthighpos = shift;
                         lasthigh = HighMapBuffer[shift];
                         ZigzagPeakBuffer[shift] = lasthigh;
                       }
                     if(LowMapBuffer[shift] != 0.0 && HighMapBuffer[shift] == 0.0)
                       {
                         lastlow = LowMapBuffer[shift];
                         lastlowpos = shift;
                         ZigzagLawnBuffer[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_ZIGZAG


Indicators Used:




Custom Indicators Used:
Zigzag2_R_

Order Management characteristics:

Other Features: