AsimmetricStochNR

Miscellaneous
Implements a curve of type %1
1 Views
0 Downloads
0 Favorites
AsimmetricStochNR
/*
âûçîâ èç êîäîâ
iCustom(
   NULL,0,"AsimmetricStochNR",  // íà òåêóùåì òàéì-ôðåéìå è èíñòðóìåíòå
   KperiodShort,              // ìëàäøèé (êîðîòêèé) %K
   KperiodLong,               // ñòàðøèé (äëèííûé) %K
   Dperiod,                   // %D ñèãíàëüíàÿ
   Slowing,                   // çàìåäëåíèå
   Dmethod,                   // òèï MA ñèãíàëüíîé: 0-SMA, 1-EMA
   PriceField,                // òèï öåíû: 0-High/Low; 1-Close/Close
   Sens,                      // ÷óâñòâèòåëüíîñòü â ïï.
   OverSold,                  // óðîâåíü ÏÏ â %%
   N,                         // áóôåðû: 0- ãëàâíàÿ, 1- ñèãíàëüíàÿ, 2- òðåíä
   i                          // ñìåùåíèå
  );
*/

#property indicator_separate_window // â îòä. îêíå 
#property indicator_buffers 3
#property indicator_color1 Blue // ãëàâíàÿ
#property indicator_style1 0
#property indicator_color2 Red // ñèãíàëüíàÿ
#property indicator_style2 0
#property indicator_maximum 100
#property indicator_minimum 0
#property indicator_level3 50

// âõîäíûå ïàðàìåòðû
extern int KperiodShort=5; // %K
extern int KperiodLong=12; // %K
extern int Dperiod=1; // %D ñèãíàëüíàÿ
   double kd; // êîýôô. EMA äëÿ ñèãíàëüíîé
extern int Slowing=3; // çàìåäëåíèå
extern int Dmethod=0; // òèï MA ñèãíàëüíîé: 0-SMA, 1-EMA
extern int PriceField=0; // òèï öåíû: 0-High/Low; 1-Close/Close
extern int Sens=7; // ÷óâñòâèòåëüíîñòü â ïï.
   double sens; // ÷óâñòâèòåëüíîñòü â öåíàõ
extern int OverSold=20; // óðîâåíü ÏÏ â %%
   int OverBought;
 int History=0; // èñòîðèÿ ïåðåñ÷åòà: 0 - âñå áàðû

// ìàññèâû èíä.áóôåðîâ
double   Main[], // ãëàâíàÿ
         Signal[], // ñèãíàëüíàÿ
         Trend[]; // òðåíä: 0 - âíèç, 1 - ââåðõ

int init() {
   sens=Sens*Point; // ÷óâñòâèòåëüíîñòü â öåíàõ
   if(Dmethod==1) kd=2.0/(1+Dperiod); // êîýôô. EMA äëÿ ñèãíàëüíîé
   
   SetLevelValue(0,OverSold);
   OverBought=100-OverSold;
   SetLevelValue(1,OverBought);
   

   // áóôåð ãëàâíîé   
   SetIndexBuffer(0,Main);
   SetIndexStyle(0,DRAW_LINE);
   string _str="("+KperiodShort+"/"+KperiodLong+","+Slowing+")";
   SetIndexLabel(0,"Main"+_str);
   SetIndexEmptyValue(0,0.0);
   // áóôåð ñèãíàëüíîé
   SetIndexBuffer(1,Signal);
   SetIndexStyle(1,DRAW_LINE);
   _str="("+Dperiod+")";
   SetIndexLabel(1,"Signal"+_str);
   SetIndexEmptyValue(0,0.0);
   // òðåíä
   SetIndexBuffer(2,Trend);
   SetIndexStyle(2,DRAW_NONE);
   SetIndexLabel(2,"Trend");
   SetIndexEmptyValue(0,0.0);

   // êîðîòêîå èìÿ
   if(Sens!=0) string ShName=Sens+" ";
   ShName=ShName+"Stoch ";
   if(PriceField==0) ShName=ShName+"H/L";
   else ShName=ShName+"C/C";
   ShName=ShName+" ("+KperiodShort+"/"+KperiodLong+","+Dperiod+","+Slowing+")";
   IndicatorShortName(ShName);   
   
  }

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

void start() {
   int ic=IndicatorCounted();
   if(Bars-ic-1>1) ic=reinit(); 
   int limit=Bars-ic-1; // êîë-âî ïåðåñ÷åòîâ
   
   int counted_bars = IndicatorCounted();
   if(counted_bars < 0)  return(-1);
   if(counted_bars > 0)   counted_bars--;
   limit = Bars - counted_bars;
   if(counted_bars==0) limit-=1+1;   
   if(History!=0 && limit>History) limit=History-1; // êîë-âî ïåðåñ÷åòîâ ïî èñòîðèè

   for(int i=limit; i>=0; i--) { // öèêë ïåðåñ÷åòà ïî ÂÑÅÌ áàðàì
      // ïåðâîíà÷àëüíûå çíà÷åíèÿ
      static bool Kperiod0,Kperiod1,trend;
      if(i==limit && limit>1) { 
         Kperiod0=KperiodShort;
         Kperiod1=KperiodShort;
         trend=0;
        }
      // ãëàâíàÿ
      Main[i]=Stoch(Kperiod0, Kperiod1, Slowing, PriceField, sens, i);
      // ñèãíàëüíàÿ¸
      switch(Dmethod) {
         case 1: // EMA
            Signal[i]=kd*Main[i]+(1-kd)*Signal[i+1]; break;
         case 0: // SMA
            int sh=i+Dperiod;
            double ma=Signal[i+1]*Dperiod-Main[sh];
            Signal[i]=(ma+Main[i])/Dperiod;
        }
      // ïåðåêëþ÷åíèå íàïðàâëåíèÿ
      if(Signal[i+1]>OverBought) { // àïòðåíä
         Kperiod0=KperiodShort;
         Kperiod1=KperiodLong;
         trend=1;
        }
      if(Signal[i+1]<OverSold) { // äàóíòðåíä
         Kperiod0=KperiodLong;
         Kperiod1=KperiodShort;
         trend=0;
        }
      Trend[i]=trend;
     }
  }
//>>>>>>>>>>>>>>>>>>>>>  

// ñòîõàñòèê ñ øóìîäàâîì
double Stoch(int Kperiod0, int Kperiod1, int Slowing, int PriceField, double sens, int i) {  
   if(i+MathMax(Kperiod0,Kperiod1)+Slowing>Bars) return(-1); // íåäîñòàòî÷íî áàðîâ - âûõîä
   // ýêñòðåìóìû öåíû â öèêëå çàìåäëåíèÿ/ñãëàæèâàíèÿ
   double max,min,c;
   for(int j=i; j<i+Slowing; j++) {
      if(PriceField==1) { // ïî Close
         max+=Close[ArrayMaximum(Close,Kperiod0,j)];
         min+=Close[ArrayMinimum(Close,Kperiod1,j)];
        }
      else { // ïî High/Low
         max+=High[ArrayMaximum(High,Kperiod0,j)];
         min+=Low[ArrayMinimum(Low,Kperiod1,j)];
        }
      c+=Close[j];
     }
   // øóìîïîäàâëåíèå
   sens*=Slowing; // ïðèâåäåíèå ÷óâñòâèòåëüíîñòè â ñîîòâåòñòâèå ñ ïåðèîäîì çàìåäëåíèÿ
   double delta=max-min; // ðàçìàõ
   double diff=sens-delta; // ðàçíèöà ìåæäó ïîðîãîì ÷óâñòâ. è ðàçìàõîì
   if(diff>0) { // åñëè ðàçíèöà >0 (ðàçìàõ ìåíüøå ïîðîãà), òî
      delta=sens; // ðàçìàõ = ïîðîãó,
      min-=diff/2; // íîâîå çíà÷åíèå ìèíèìóìà
     }
   // âû÷èñëåíèå îñöèëëÿòîðà
   if(delta==0) return(-2); // äåëåíèå íà íîëü
   else return(100*(c-min)/delta); // ñòîõàñòèê
  }


Comments