Navigation:Home > Content >

iMACD_ATR.mq4

Time: 2012-03-03 | Download file:iMACD_ATR.mq4

/*
вызов из кодов; вместо поля сигнальной - ATR
double iCustom(
   string symbol,          // символьное имя инструмента (NULL- текущий)
   int timeframe,          // тайм-фрейм (0- текущий)
   "iMACD±ATR",            // имя этого индикатора

   // входные параметры
   double fast_ema_period, // период быстрой EMA; м.б.дробным (>1) и в виде коэфф-та (<1)
   double slow_ema_period, // период медленной EMA; м.б.дробным (>1) и в виде коэфф-та (<1)
   int atr_period,         // период ATR, если =0, то atr_period=slow_ema_period
   int applied_price,      // тип цены:
                              // 0 - PRICE_CLOSE - цена закрытия 
                              // 1 - PRICE_OPEN - цена открытия
                              // 2 - PRICE_HIGH - макс.цена
                              // 3 - PRICE_LOW - мин.цена
                              // 4 - PRICE_MEDIAN - средняя цена,(high+low)/2
                              // 5 - PRICE_TYPICAL - типичная цена,(high+low+close)/3
                              // 6 - PRICE_WEIGHTED - взвешенная цена закрытия,(high+low+close+close)/4
   // буферы
   mode,                   // mode - номер буфера индикатора:
                              // 0 - главная
                              // 1 - главная +/- ATR
                              // 2 - пик
                              // 3 - впадина
   //
   int shift               // сдвиг
   ) 

==============

iCustom(NULL,0,"iMACD±ATR",FastEMA,SlowEMA,ATR,Price, 0,i);
*/

#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Gray // MACD
#property  indicator_color2  Blue // MACD±ATR
#property  indicator_color3  Green // пик
#property  indicator_color4  Red // впадина

// входные параметры
extern double FastEMA=12; // период быстрой EMA; м.б.дробным (>1) и в виде коэфф-та (<1)
   double f0;
extern double SlowEMA=26; // период медленной EMA; м.б.дробным (>1) и в виде коэфф-та (<1)
   double s0;
extern int ATR=0; // период ATR, если =0, то ATR=SlowEMA
 double kATR=1; // масштабирующий множитель
 double ATRmin=0; // шумовой порог значения ATR в пп.
extern int Price=0; // тип цены:
 int History=0; // 0- все бары

double   MACD[], // MACD
         TR[], // MACD±ATR
         UP[],DN[]; // экстремумы
double fper,sper; // производный период

void init() { 
   if(FastEMA>1) {f0=2/(1+FastEMA); fper=FastEMA;}
   else {f0=FastEMA; fper=(2-FastEMA)/FastEMA;}
   if(SlowEMA>1) {s0=2/(1+SlowEMA); sper=SlowEMA;}
   else {s0=SlowEMA; sper=(2-SlowEMA)/SlowEMA;}
   
   if(ATR==0) ATR=SlowEMA; 
   string _atrmin=DoubleToStr(ATRmin,1);
   ATRmin*=Point; // шумовой порог значения ATR в ценах

   IndicatorDigits(5);
   // MACD
   string _macd="MACD("+DoubleToStr(fper,2)+","+DoubleToStr(sper,2);
   SetIndexBuffer(0,MACD); 
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexLabel(0,_macd+")");
   SetIndexEmptyValue(0,0.0);
   // MACD±ATR
   string _tr="±"+ATR+")";
   SetIndexBuffer(1,TR); 
   SetIndexStyle(1,DRAW_LINE);
   SetIndexLabel(1,"TR("+_tr);
   SetIndexEmptyValue(1,0.0);
   // пики
   SetIndexBuffer(2,UP); 
   SetIndexStyle(2,DRAW_HISTOGRAM,1,2);
   SetIndexLabel(2,"Peak");
   // впадины
   SetIndexBuffer(3,DN); 
   SetIndexStyle(3,DRAW_HISTOGRAM,1,2);
   SetIndexLabel(3,"Trough");
   
   if(ATRmin>0) _macd=_atrmin+" "+_macd;
   IndicatorShortName(_macd+","+_tr);
  }

void start() {
   int limit=Bars-IndicatorCounted()-1; 
   if(limit>1) limit=MathMin(Bars,History+(History==0)*Bars)-1;
   // цикл пересчета
   for(int i=limit; i>=0; i--) { 
      // MACD
      double c=iMA(NULL,0,1,0,0,Price, i); // цена
      static double fm1,sm1; // EMAs previous
      if(i==limit && i>1) {fm1=c;sm1=c;} // начальные значение
      double fm0=f0*c+(1-f0)*fm1; // fast MA
      double sm0=s0*c+(1-s0)*sm1; // slow MA
      MACD[i]=fm0-sm0; // MACD
      // MACD±ATR
      double atr=kATR*iATR(NULL,0,ATR, i); // ATR
      atr=MathMax(atr,ATRmin); // шумовой порог
      if(MACD[i]>0) TR[i]=MACD[i]-atr; // для положительных значений MACD
      if(MACD[i]<0) TR[i]=MACD[i]+atr; // для отрицательных значений MACD
      // экстремумы
      if(MACD[i]>0 && MACD[i+1]=0) UP[i]=MACD[i]; // пики
      if(MACD[i]<0 && MACD[i+1]>MACD[i] && TR[i]<=0) DN[i]=MACD[i]; // впадины
      
      // синхронизация
      if(i>0) {fm1=fm0; sm1=sm0;}
     }
  }

Recommend