ZigZagOnParabolic





#property indicator_chart_window // â îêíå èíñòðóìåíòà
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color3 Blue
//--âíåøíèå ïåðåìåííûå
extern double Step=0.02; // íà÷àëüíîå çíà÷åíèå è øàã
extern double Maximum=0.2; // êîíå÷íîå çíà÷åíèå

extern bool ExtremumsShift=1; // ïîëîæåíèå ýêñòðåìóìîâ: 0 - ïî âðåìåíè èõ îïðåäåëíèÿ; 1 - ïî èõ ôàêòè÷åñêîìó ïîëîæåíèþ 
extern int History=0; // êîë-âî áàðîâ ïðåäûñòîðèè; 0 - âñå

//--
double   Peak[], // áóôåð ZigZag ïî ïèêàì
         Trough[], // áóôåð ZigZag ïî âïàäèíàì
         SAR[]; // áóôåð Parabolic

//=============================================================
int init()
  {
   SetIndexBuffer(0,Peak); // ïèêè
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexLabel(0,"Peak");
   SetIndexEmptyValue(0,0.0);

   SetIndexBuffer(1,Trough); // êðåñòû, ò.å. âïàäèíû)))
   SetIndexStyle(1,DRAW_ZIGZAG);
   SetIndexLabel(1,"Trough");
   SetIndexEmptyValue(1,0.0);

   SetIndexBuffer(2,SAR); // Ïàðàáîëèê
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,159);
   SetIndexLabel(2,"SAR");
   SetIndexEmptyValue(2,0.0);
     
   return(0);
  }

//=============================================================
int start()
  {
   static int BarsPrev; // çíà÷åíèå Bars íà ïðåä.áàðå
   bool MissBars=Bars-BarsPrev>1; // 1 - åñòü ïðîïóùåííûå áàðû
   bool NewBar=Bars-BarsPrev==1; // 1 - ïåðâûé òèê íóëåâîãî áàðà
   if(MissBars && BarsPrev!=0) BarsPrev=reinit(); // ïðîóùåííûå áàðû â ïðîöåññå - ïåðåñ÷åò çàíîâî
   
   int limit=Bars-BarsPrev-(BarsPrev==0); BarsPrev=Bars; // êîë-âî ïåðåñ÷åòîâ
   if(History!=0 && limit>History) limit=History-1; // êîë-âî ïåðåñ÷åòîâ ïî èñòîðèè

   for(int i=limit; i>=0; i--) // öèêë ïî íåïîñ÷èòàííûì è ïðåäïîñëåäíåìó áàðàì
     {   
      SAR[i]=iSAR(NULL,0,Step,Maximum, i); // Ïàðàáîëèê
      double mid[2]; // ñð. öåíà
      mid[0]=(High[i]+Low[i])/2; // ñð.öåíà íà òåêóùåì áàðå
      mid[1]=(High[i+1]+Low[i+1])/2; // ñð.öåíà íà ïðåä.áàðå

      static int j; // ñ÷åò÷èê ñìåùåíèÿ ìåæäó ìîìåíòîì îïðåäåëåíÿ ýêñòðåìóìà è åãî ïîëîæåíèåì âî âðåìåíè
      static bool dir; // ôëàã íàïðàâëåíèÿ; 0 - âíèç, 1 - ââåðõ
      static double h,l; // òåêóùèå ýêñòðåìàëüíûå çíà÷åíèÿ
      int shift; // ñìåùåíèå ìåæäó ìîìåíòîì îïðåäåëåíÿ ýêñòðåìóìà è åãî ïîëîæåíèåì âî âðåìåíè

      if(i>0) j++; // åñëè áàð çàâåðøåí, òî èíêðåìåíò ñ÷åò÷èêà ñìåùåíèÿ
      if(dir) // ëîâëÿ  ïèêà
        {
         if(h<High[i]) {h=High[i]; j=NewBar;} // òåêóùèé ìàêñèìóì; ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ
         if(SAR[i+1]<=mid[1] && SAR[i]>mid[0]) // ïåðåâîðîò Ïàðàáîëèêà âíèç
           {
            shift=i+ExtremumsShift*(j+NewBar); // ñìåùåíèå
            Peak[shift]=h; // ïèê
            dir=0; // íàïðàâëåíèå âíèç
            l=Low[i]; j=0; // òåêóùèé ìàêñèìóì, ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ
           }
        }
      else // ëîâëÿ âïàäèíû
        {
         if(l>Low[i]) {l=Low[i]; j=NewBar;} // òåêóùèé ìèíèìóì; ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ
         if(SAR[i+1]>=mid[1] && SAR[i]<mid[0]) // ïåðåâîðîò Ïàðàáîëèêà ââåðõ
           {
            shift=i+ExtremumsShift*(j+NewBar); // ñìåùåíèå
            Trough[shift]=l; // âïàäèíà
            dir=1; // íàïðàâëåíèå ââåðõ
            h=High[i]; j=0; // òåêóùèé ìàêñèìóì, ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ
           }
        }
     }

//   if(MissBars) Print("limit: ",limit," Bars:",Bars," IndicatorCounted: ",IndicatorCounted());

   return(0);
  }
//=============================================================

// ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè
int reinit()
  {
   ArrayInitialize(Peak,0.0);
   ArrayInitialize(Trough,0.0);
   ArrayInitialize(SAR,0.0);
   return(0);
  }
 



Sample





Analysis



Market Information Used:

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


Indicator Curves created:


Implements a curve of type DRAW_ZIGZAG
Implements a curve of type DRAW_ARROW

Indicators Used:

Parabolic Stop and Reverse system


Custom Indicators Used:

Order Management characteristics:

Other Features: