/* вызов из кодов; вместо поля сигнальной - 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;} } }