Navigation:Home > Content >

StepMA_Stoch_NK_histo.mq4

Time: 2018-06-03 | Download file:StepMA_Stoch_NK_histo.mq4

//+X----------------------------------------------------------------x+
// Edited Nikolay Kositsin  2008.05.20 E-mail: farria@mail.redcom.ru |
//+X----------------------------------------------------------------x+
//+X================================================================X+
//|                                              StepMA_Stoch_NK.mq4 |
//|                          Copyright © 2005,  TrendLaboratory Ltd. |
//|                                       E-mail: igorad2004@list.ru |
//+X================================================================X+
//mod2009fxtsd histo

#property copyright "Copyright © 2005,  TrendLaboratory Ltd."
#property link "http://www.forex-instruments.info"
//---- отрисовка индикатора в отдельном окне
#property indicator_separate_window
//---- количество индикаторных буферов
#property indicator_buffers 4
//---- цвета индикатора
#property indicator_color3 BlueViolet
#property indicator_color4 Gold

#property indicator_color1 C'0,51,0' //7,58,177
#property indicator_color2 C'83,0,0' //63,2,83

#property indicator_style4     2
#property indicator_style3     0

#property indicator_width1     2
#property indicator_width2     2
#property indicator_width4     1
#property indicator_width3     2


#property indicator_level1      0.3
#property indicator_level2    - 0.3
#property indicator_levelstyle    4
#property indicator_levelcolor DarkSlateGray

//---- определение нижнего и верхнего 
            //значения отдельного окна индикатора
//#property indicator_minimum -0.5
//#property indicator_maximum  0.5

//---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА 

extern int    PeriodWATR = 10; 
extern double Kwatr = 1.0000; 
extern int    HighLow = 0; 


extern bool    HistoSt1mn  = false;
extern bool    HistoSt2md  = false;
extern bool    HistoStDelta= true;
extern double  HistoMultipl= 1.0;

extern bool    drawLines = true;

//---- индикаторные буферы
double LineMinBuffer[]; 
double LineMidBuffer[]; 
double Buffer1[]; 
double Buffer2[]; 
//+X================================================================X+
//| StepMA_Stoch_NK indicator initialization function                |
//+X================================================================X+
  int init()
  {
//---- установка стиля изображения индикатора 
   SetIndexStyle(2, DRAW_NONE); 
   SetIndexStyle(3, DRAW_NONE); 
  if (drawLines)
   {
   SetIndexStyle(2, DRAW_LINE); 
   SetIndexStyle(3, DRAW_LINE); 
   }

   SetIndexStyle(0, DRAW_HISTOGRAM); 
   SetIndexStyle(1, DRAW_HISTOGRAM); 
//---- определение буферов для подсчёта  

   SetIndexBuffer(3, LineMinBuffer); 
   SetIndexBuffer(2, LineMidBuffer); 

   SetIndexBuffer(0, Buffer1); 
   SetIndexBuffer(1, Buffer2); 


//---- Установка формата точности (количество знаков после 
          //десятичной точки) для визуализации значений индикатора 
   IndicatorDigits(Digits); 
//---- name for DataWindow and indicator subwindow label
   string short_name="StepMA Stoch ("
                  + PeriodWATR + ", " + DoubleToStr(Kwatr,4)+ ", " + HighLow + ") "; 
   IndicatorShortName(short_name); 
   SetIndexLabel(0, "StepMA Stoch1mn"); 
   SetIndexLabel(1, "StepMA Stoch2md"); 
//---- установка номера бара, 
                //начиная с которого будет отрисовываться индикатор 
   SetIndexDrawBegin(0, PeriodWATR); 
   SetIndexDrawBegin(1, PeriodWATR); 
   SetIndexDrawBegin(2, PeriodWATR); 
   SetIndexDrawBegin(3, PeriodWATR); 
//---- завершение инициализации
   return(0); 
  }
//+X================================================================X+
//| StepMA_Stoch_NK                                                  |
//+X================================================================X+
int start()
  {
   //---- Проверка количества баров на достаточность 
                                //для дальнейшего расчёта
   if (Bars - 1 < PeriodWATR)
                        return(0);
   //----
   static int      TrendMid_, time2;
   static int      TrendMin_, TrendMax_;
   //----
   static double   WATRmax_, WATRmin_;
   static double   SminMin1_, SmaxMin1_;  
   static double   SminMax1_, SmaxMax1_; 
   static double   SminMid1_, SmaxMid1_;
   //----
   int      counted_bars, Tnew;
   int      iii, bar, MaxBar, limit;
   int      TrendMin, TrendMax, TrendMid;
   int      StepSizeMin, StepSizeMax, StepSizeMid; 
   //----
   double   close, high, low;  
   double   WATRmax, WATRmin;
   double   SumRange, dK, WATR0;
   double   SizeMin, SizeMax, SizeMid, pKwatr;
   double   SizeMin2, SizeMax2, SizeMid2, point;
   double   SminMin0, SmaxMin0, SminMin1, SmaxMin1;  
   double   SminMax0, SmaxMax0, SminMax1, SmaxMax1; 
   double   SminMid0, SmaxMid0, SminMid1, SmaxMid1;
   double   Stoch1, Stoch2, bsmin, bsmax;
   double   linemin, linemax, linemid;  
   //----Получение уже посчитанных баров
   counted_bars = IndicatorCounted();
   //---- проверка на возможные ошибки
   if (counted_bars < 0)
                 return(-1);
   //---- последний посчитанный бар должен быть пересчитан 
   if (counted_bars > 0) 
                counted_bars--;
   //---- определение номера самого старого бара, 
          // начиная с которого будет произедён пересчёт новых баров
   limit = Bars - counted_bars - 1;
   //---- определение номера самого старого бара, 
          // начиная с которого будет произедён пересчёт всех баров 
   MaxBar = Bars - 1 - PeriodWATR; 
   //----	
   if (limit > MaxBar) 
                limit = MaxBar;
                
   //+---+ восстановление значений переменных +------------------------+
   Tnew = Time[limit + 1];
   if (limit < MaxBar)
    if (Tnew == time2)
     {
      WATRmax = WATRmax_;
	   WATRmin = WATRmin_;
	   //----
      SminMin1 = SminMin1_; 
	   SmaxMin1 = SmaxMin1_; 
	   //----
	   SminMax1 = SminMax1_; 
	   SmaxMax1 = SmaxMax1_; 
	   //----
	   SminMid1 = SminMid1_; 
	   SmaxMid1 = SmaxMid1_;
	   //----
	   TrendMin = TrendMin_;
	   TrendMax = TrendMax_;
	   TrendMid = TrendMid_;
     }
   else 
     {
      if (Tnew>time2)
           Print("Ошибка восстановления переменных!!! Tnew>time2");
      else Print("Ошибка восстановления переменных!!! Tnew= 0; bar--)
   {
    //+---+ Сохранение значений переменных 
     if (bar == 1)
       {
         WATRmax_ = WATRmax;
	      WATRmin_ = WATRmin;
	      //----
         SminMin1_ = SminMin1; 
	      SmaxMin1_ = SmaxMin1; 
	      //----
	      SminMax1_ = SminMax1; 
	      SmaxMax1_ = SmaxMax1; 
	      //----
	      SminMid1_ = SminMid1; 
	      SmaxMid1_ = SmaxMid1; 
	      //----
	      TrendMin_ = TrendMin;
	      TrendMax_ = TrendMax;
	      TrendMid_ = TrendMid;
	      //----
         time2 = Time[2];
       }
     //+---+
     //----
     SumRange = 0.0;
     //----
	  for (iii = PeriodWATR - 1; iii >= 0; iii--)
	    { 
         dK = 1.0 + 1.0 * (PeriodWATR - iii) / PeriodWATR; 
         SumRange += dK * MathAbs(High[bar + iii] - Low[bar + iii]); 
       }
     //----  
	  WATR0 = SumRange / PeriodWATR; 
	  //----
	  WATRmax = MathMax(WATR0, WATRmax);
	  if (bar == MaxBar) 
	             WATRmin = WATR0;
	  //----            
	  WATRmin = MathMin(WATR0, WATRmin); 
	  //----
	  point = Point;
	  //----
	  pKwatr = Kwatr / point;
	  
	  StepSizeMin = MathRound(pKwatr * WATRmin); 
	  StepSizeMax = MathRound(pKwatr * WATRmax); 
     StepSizeMid = MathRound(pKwatr * 0.5 * (WATRmax + WATRmin)); 
     //----
     SizeMin = StepSizeMin * point;
     SizeMax = StepSizeMax * point;
     SizeMid = StepSizeMid * point;
     //----
     SizeMin2 = 2 * SizeMin;
     SizeMax2 = 2 * SizeMax;
     SizeMid2 = 2 * SizeMid;
     //----
     low = Low[bar];
     high = High[bar];
     close = Close[bar];
	  //----	
	  if (HighLow > 0)
	   {
	    SmaxMin0 = low + SizeMin2; 
	    SminMin0 = high - SizeMin2; 
	    //----
	    SmaxMax0 = low + SizeMax2; 
	    SminMax0 = high - SizeMax2; 
	    //----
	    SmaxMid0 = low + SizeMid2; 
	    SminMid0 = high - SizeMid2; 
	    //----
	    if(close > SmaxMin1) TrendMin = 1;  
	    if(close < SminMin1) TrendMin = -1; 
	    //----
	    if(close > SmaxMax1) TrendMax = 1;  
	    if(close < SminMax1) TrendMax = -1; 
	    //----
	    if(close > SmaxMid1) TrendMid = 1;  
	    if(close < SminMid1) TrendMid = -1; 
	   }
	  //----
	  if (HighLow == 0)
	   {
	    SmaxMin0 = close + SizeMin2; 
	    SminMin0 = close - SizeMin2; 
	    //----
	    SmaxMax0 = close + SizeMax2; 
	    SminMax0 = close - SizeMax2; 
	    //----
	    SmaxMid0 = close + SizeMid2; 
	    SminMid0 = close - SizeMid2; 
	    //----
	    if(close > SmaxMin1) 
	                    TrendMin = 1;  
	    if(close < SminMin1)
	                    TrendMin = -1; 
	    //----
	    if(close > SmaxMax1) 
	                    TrendMax = 1;  
	    if(close < SminMax1) 
	                    TrendMax = -1; 
	    //----
	    if(close > SmaxMid1) 
	                    TrendMid = 1;  
	    if(close < SminMid1) 
	                    TrendMid = -1; 
	   }
	  //----	
	  if(TrendMin > 0 && SminMin0 < SminMin1) 
	                               SminMin0 = SminMin1; 
	  if(TrendMin < 0 && SmaxMin0 > SmaxMin1) 
	                               SmaxMin0 = SmaxMin1; 
		
	  if(TrendMax > 0 && SminMax0 < SminMax1) 
	                               SminMax0 = SminMax1; 
	  if(TrendMax < 0 && SmaxMax0 > SmaxMax1) 
	                               SmaxMax0 = SmaxMax1; 
	  
	  if(TrendMid > 0 && SminMid0 < SminMid1) 
	                               SminMid0 = SminMid1; 
	  if(TrendMid < 0 && SmaxMid0 > SmaxMid1) 
	                               SmaxMid0 = SmaxMid1;
	  //----                             
	  if (TrendMin > 0) 
	            linemin = SminMin0 + SizeMin; 
	  if (TrendMin < 0) 
	            linemin = SmaxMin0 - SizeMin; 
	  
	  if (TrendMax > 0) 
	            linemax = SminMax0 + SizeMax; 
	  if (TrendMax < 0) 
	            linemax = SmaxMax0 - SizeMax; 
	  
	  if (TrendMid > 0) 
	            linemid = SminMid0 + SizeMid; 
	  if (TrendMid < 0) 
	            linemid = SmaxMid0 - SizeMid; 
	  	  //----
	  bsmin = linemax - SizeMax; 
	  bsmax = linemax + SizeMax; 
	  
	  //----
	  Stoch1 = (linemin - bsmin) / (bsmax - bsmin); 
	  Stoch2 = (linemid - bsmin) / (bsmax - bsmin); 
	  //----
	  LineMinBuffer[bar] = Stoch1-0.5; 
	  LineMidBuffer[bar] = Stoch2-0.5; 
	  //----	  
	  SminMin1 = SminMin0; 
	  SmaxMin1 = SmaxMin0; 
	  //----
	  SminMax1 = SminMax0; 
	  SmaxMax1 = SmaxMax0; 
	  //----
	  SminMid1 = SminMid0; 
	  SmaxMid1 = SmaxMid0; 
	 
   double hist;         hist = EMPTY_VALUE;
      if (HistoSt1mn)   hist = LineMinBuffer[bar];
      if (HistoSt2md)   hist = LineMidBuffer[bar];
      if (HistoStDelta) hist = LineMinBuffer[bar]-LineMidBuffer[bar];
 
                        hist=hist*HistoMultipl;
   
   if (hist>0)  { Buffer1[bar] = hist; Buffer2[bar] =EMPTY_VALUE;}
   else         { Buffer2[bar] = hist; Buffer1[bar] =EMPTY_VALUE;}

	 
	 
	 }
	return(0); 	
 }
//+---+ +X----------------------------------------------------------X+

Recommend