_Channel@Stoch





#property indicator_chart_window // â îêíå èíñòðóìåíòà
#property indicator_buffers 5
#property indicator_color1 Magenta // çèãçàã
#property indicator_color3 Green // âåðõí. ãð. êàíàëà
#property indicator_color4 Red // íèæí. ãð. êàíàëà
// âõîäíûå ïàðàìåòðû
extern double OverSold=20; // çîíà ïåðåïðîäàííîñòè â %% (çîíà ïåðåêóïëåííîñòè=100-çîíà ÏÏ)
extern int K=5; // %K
extern int Slow=3; // çàìåäëåíèå
extern int SlowMethod=0; // 0-SMA, 1-EMA, 2-SMMA, 3-LWMA
extern int applied_price=0; // 0-High&Low, 1-Close&Close
extern int ShowChannel=2; // ïîêàçàòü 1 - ïî ìåñòó ýêñòðåìóìîâ, 2 - ïî âðåìåíè îïðåäåëåíèÿ
extern int ShowZigZag=0; // ïîêàçàòü 1 - ïî ìåñòó ýêñòðåìóìîâ, 2 - ïî âðåìåíè îïðåäåëåíèÿ
// èíä.áóôåðû
double   ZZpeak[], // ïèê
         ZZtrough[], // âïàäèíà
         ChTop[], // âåðõí. ãð. êàíàëà
         ChBot[], // íèæí. ãð. êàíàëà
         Stoch[]; // Stoch
double   JT[],JP[];
// îáùèå ïåðåìåííûå
double OverBought; // çîíà ïåðåêóïëåííîñòè
bool dir; // 0-ïîéìàíà âïàäèíà, 1 - ïèê
double max,min; // òåêóùèå ìàêñ., ìèíèìóìû
double top,bot; // ïèêè, âïàäèíû
int jDn,jUp; // ñ÷åò÷èêè ðàññòîÿíèÿ ìåæäó ýêñòðåìóìàìè
bool count=1; // íàïðàâëåíèå ïîèñêà öåíîâîãî ýêñòðåìóìà; 1 - îò ñòàðøèõ áàðîâ ê ìëàäøèì
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   if(ShowZigZag<0 || ShowChannel<0) count=0;
   ShowZigZag=MathAbs(ShowZigZag); ShowChannel=MathAbs(ShowChannel);
   OverBought=100.0-OverSold; // çîíà ïåðåêóïëåííîñòè
//---- indicators
   SetIndexBuffer(0,ZZpeak);
   SetIndexEmptyValue(0,0.0);
   SetIndexLabel(0,"Peak");
   
   SetIndexBuffer(1,ZZtrough);
   SetIndexEmptyValue(1,0.0);
   SetIndexLabel(1,"Trough");
   
   if(ShowZigZag>0) {
      SetIndexStyle(0,DRAW_ZIGZAG);
      SetIndexStyle(1,DRAW_ZIGZAG);
     }
   else {      
      SetIndexStyle(0,DRAW_NONE);
      SetIndexStyle(1,DRAW_NONE);
     }

   SetIndexBuffer(2,ChTop);
   SetIndexEmptyValue(2,0.0);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexLabel(2,"ChTop");

   SetIndexBuffer(3,ChBot);
   SetIndexEmptyValue(3,0.0);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexLabel(3,"ChBot");

   if(ShowChannel>0) {
      SetIndexStyle(2,DRAW_LINE);
      SetIndexStyle(3,DRAW_LINE);
     }
   else {      
      SetIndexStyle(2,DRAW_NONE);
      SetIndexStyle(3,DRAW_NONE);
     }

   SetIndexBuffer(4,Stoch);
   SetIndexStyle(4,DRAW_NONE);
   string _st="St("+K+", "+Slow+") "+SlowMethod+", "+applied_price;
   SetIndexLabel(4,_st);

//----
   IndicatorShortName("ZZ@Stoch"); 

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int ic=IndicatorCounted();
   if(Bars-ic-1>1) ic=reinit();
   int limit=Bars-ic-1; // êîë-âî ïåðåñ÷åòîâ

   for(int i=limit; i>=0; i--) Stoch[i]=iStochastic(NULL,0,K,1,Slow,SlowMethod,applied_price, 0,i); 

   for(i=limit; i>0; i--)
     {
      double st=Stoch[i];
      jDn++; jUp++; // ñ÷åò÷èêè ðàññòîÿíèÿ ìåæäó ýêñòðåìóìàìè

      bool up=st>=OverBought; // 1 - â çîíå ÏÊ
      bool dn=st<=OverSold; // 1 - â çîíå ÏÏ
      
      if(dir) { // åñëè áûë ïîéìàí ïèê
         if(up) { // åñëè â çîíå ÏÊ
            double l=High[i]*100;
            if(count) {for(int k=jUp; k>=0; k--) if(Low[i+k]<l) {int sh=i+k;l=Low[i+k];}}
            else {for(k=0; k<=jUp; k++) if(Low[i+k]<l) {sh=i+k;l=Low[i+k];}}
            bot=Low[sh]; // âïàäèíà = ìèíèìóìó
            if(ShowZigZag==1) ZZtrough[sh]=bot; else ZZtrough[i]=bot;
            if(ShowChannel==1) for(k=sh; k>i; k--) ChBot[k]=bot;
            dir=0; // ïîéìàíà âïàäèíà
           }
        }
      else {
         if(dn) {
            double h=0;
            if(count) {for(k=jDn; k>=0; k--) if(High[i+k]>h) {sh=i+k; h=High[i+k];}}
            else {for(k=0; k<=jDn; k++) if(High[i+k]>h) {sh=i+k; h=High[i+k];}}
            top=High[sh];
            if(ShowZigZag==1) ZZpeak[sh]=top; else ZZpeak[i]=top;
            if(ShowChannel==1) for(k=sh; k>i; k--) ChTop[k]=top;
            dir=1;
           }
        }

      if(up) jUp=-2; if(dn) jDn=-2; // ñáðîñ ñ÷åò÷èêîâ

      for(k=0; k<2; k++) {ChTop[i-k]=top; ChBot[i-k]=bot;}
     }
        
   return(0);
  }


// ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè
int reinit()
  {
   ArrayInitialize(ZZpeak,0.0);
   ArrayInitialize(ZZtrough,0.0);
   ArrayInitialize(ChTop,0.0);
   ArrayInitialize(ChBot,0.0);
   ArrayInitialize(Stoch,0.0);
   dir=0;max=0;min=0;top=0;bot=0;jDn=0;jUp=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_NONE
Implements a curve of type DRAW_LINE

Indicators Used:

Stochastic oscillator


Custom Indicators Used:

Order Management characteristics:

Other Features: