/*
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);
  }



