/* iCustom(NULL,0,"_MACD_Xtr",FastMA,SlowMA,Source,SourcePeriod,FrontPeriod,xVolatility,Sens, N,i); */ #property indicator_separate_window // в окне индикатора #property indicator_buffers 5 #property indicator_color1 Blue // #property indicator_color2 Gray // уровень ПК #property indicator_color3 Gray // уровень ПП #property indicator_color4 Green // бар в зоне ПК #property indicator_color5 Red // бар в зоне ПП // входные параметры // MACD extern int FastMA=12; // период быстрой EMA extern int SlowMA=26; // период медленной EMA // волатильность extern int Source=1; // источник: 0 - объем, 1 - ATR, 2 - ст.девиация extern int SourcePeriod=5; // период источника // сигнальная double FrontPeriod=1; // период сглаживания фронта; м.б. <1 extern double BackPeriod=444; // период сглаживания затухания; м.б. <1 // уровни ПК/ПП extern double xVolatility=0.5; extern double Sens=0; // порог чувствительности в пп. или в тиках (для объема) int History=0; // кол-во баров предыстории; 0 - все // инд.буферы double MACD[], // MACD OB[], // уровень ПК OS[], // уровень ПП OBH[], // бар в зоне ПК OSH[]; // бар в зоне ПП // общие (глобальные) переменные bool first=1; // флаг первого запуска double sens; // порог чувствительности в ценах // инициализация int init() { first=1; sens=Sens*Point; // порог чувствительности в ценах string _md="MACD("+FastMA+","+SlowMA+")"; SetIndexBuffer(0,MACD); SetIndexStyle(0,DRAW_HISTOGRAM,0); SetIndexLabel(0,_md); SetIndexBuffer(1,OB); SetIndexStyle(1,DRAW_LINE,2); SetIndexLabel(1,"OB"); SetIndexBuffer(2,OS); SetIndexStyle(2,DRAW_LINE,2); SetIndexLabel(2,"OS"); SetIndexBuffer(3,OBH); SetIndexStyle(3,DRAW_HISTOGRAM,0,2); SetIndexLabel(3,"Peak"); SetIndexBuffer(4,OSH); SetIndexStyle(4,DRAW_HISTOGRAM,0,2); SetIndexLabel(4,"Trough"); if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0); // чувствительность if(Sens>0) string _src=DoubleToStr(Sens,1)+" "; // источник switch(Source) { case 0: _src=_src+"Volume"; break; // объем case 1: _src=_src+"ATR"; break; // ATR case 2: _src=_src+"StDev"; // ст.девиация } _src=_src+"("+SourcePeriod+","+_bk+")"; IndicatorShortName(_md+" "+_src); return(0); } // ф-я дополнительной инициализации int reinit() { ArrayInitialize(MACD,0.0); // обнуление массива ArrayInitialize(OB,0.0); // обнуление массива ArrayInitialize(OS,0.0); // обнуление массива ArrayInitialize(OBH,0.0); // обнуление массива ArrayInitialize(OSH,0.0); // обнуление массива return(0); } int start() { int ic=IndicatorCounted(); if(!first && Bars-ic-1>1) ic=reinit(); // если есть пропущенные бары не на подключении - пересчет bool ic0=ic==0; // флаг пересчета int limit=Bars-ic-1; // кол-во пересчетов if(History!=0 && limit>History) limit=History-1; // кол-во пересчетов по истории for(int i=limit; i>=0; i--) { // цикл пересчета по ВСЕМ барам double macd=iMACD(NULL,0,FastMA,SlowMA,1,0, 0,i); MACD[i]=macd; double vlt=xVolatility*iCustom(NULL,0,"_Volatility_FBA_NR",Source,SourcePeriod,FrontPeriod,BackPeriod,0, 1,i); double lev=MathMax(sens,vlt); OB[i]=lev; OS[i]=-lev; if(macd> lev) OBH[i]=macd; else OBH[i]=0; if(macd<-lev) OSH[i]=macd; else OSH[i]=0; } first=0; // сброс флага первого цикла return(0); }