//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MickyMouse"
#property  link      "mihai27@seznam.cz"
//---- indicator settings

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1  Green
#property indicator_color2  Red
#property indicator_color3  Yellow
#property indicator_color4  Yellow
#property indicator_color5  Yellow
#property indicator_color6  Yellow
#property indicator_width1  3
#property indicator_width2  3
#property indicator_width3  3
#property indicator_width4  5
#property indicator_width5  5
#property indicator_width6  5
#property indicator_minimum 10
#property indicator_maximum 90
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
extern double buffersize = 0.1;
 int     levdr = 50;  
 int     levdr1 = 50;
//---- indicator buffers
double     MacdBuffer[];
double     SignalBuffer[];
double sslHup[];
double sslHdn[];
double hlv[];
double sslHup1[];
double sslHdn1[];
double hlv1[];
 int     TimeFrame    =  0;
 string  TimeFrames   = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  string TimeFrameStr;
   TimeFrame=MathMax(TimeFrame,Period());
      
      switch(TimeFrame)
      {
         case PERIOD_M1:  TimeFrameStr="M1"  ; break;
         case PERIOD_M5:  TimeFrameStr="M5"  ; break;
         case PERIOD_M15: TimeFrameStr="M15" ; break;
         case PERIOD_M30: TimeFrameStr="M30" ; break;
         case PERIOD_H1:  TimeFrameStr="H1"  ; break;
         case PERIOD_H4:  TimeFrameStr="H4"  ; break;
         case PERIOD_D1:  TimeFrameStr="D1"  ; break;
         case PERIOD_W1:  TimeFrameStr="W1"  ; break;
         case PERIOD_MN1: TimeFrameStr="MN1" ; break;
         default :        TimeFrameStr="TF0";
      }
//---- drawing settings
   SetIndexBuffer (0,sslHup); SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,167); SetIndexLabel(0,"macdup");
   SetIndexBuffer (1,sslHdn); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,167); SetIndexLabel(1,"macddown");
      SetIndexBuffer (2,hlv);
   SetIndexBuffer (3,sslHup1); SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,167); SetIndexLabel(3,"macdup");
   SetIndexBuffer (4,sslHdn1); SetIndexStyle(4,DRAW_ARROW); SetIndexArrow(4,167); SetIndexLabel(4,"macddown");
      SetIndexBuffer (5,hlv1);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
    int  i;
    

   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
  
   if (counted_bars<0) return(-1);
   if (counted_bars>0) counted_bars--;
            limit=Bars-counted_bars;
//---- macd counted in the 1-st buffer
   for( i=0; i<limit; i++)
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd buffer
   for(i=0; i<limit; i++){
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
 //---- signal line counted in the 2-nd buffer   
     }
     
      if (TimeFrame != Period())
   {
      datetime TimeArray[];
         limit = MathMax(limit,TimeFrame/Period());
         ArrayCopySeries(TimeArray, MODE_TIME, NULL,TimeFrame);
      for(i=0,int y=0; i<limit; i++)
         {
            if(Time[i]<TimeArray[y]) y++;

         sslHup[i] = iCustom(NULL,TimeFrame,levdr, 0,y);                                 
         sslHdn[i] = iCustom(NULL,TimeFrame,levdr, 1,y);
         sslHup1[i] = iCustom(NULL,TimeFrame,levdr, 3,y);                                 
         sslHdn1[i] = iCustom(NULL,TimeFrame,levdr, 4,y);
        
}
}
        
//+-       
   
    for(i=limit;i>=0;i--)
   {
      hlv[i] = hlv[i+1]; 
    
       
      if(iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i) > buffersize*Point)  hlv[i] =  1;
      if(iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i) < -buffersize*Point)  hlv[i] =  -1;

          
      
          if(hlv[i] == -1) { sslHdn[i] = levdr; sslHup[i] = EMPTY_VALUE;  }
         if(hlv[i] == 1)   { sslHdn[i] = EMPTY_VALUE;  sslHup[i] = levdr; } 
        
 
   
      hlv1[i] = hlv1[i+1]; 
    
       
      if(iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i) < buffersize*Point && iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i) > -buffersize*Point)  hlv1[i] =  -1;
      if(iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i) > buffersize*Point || iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i) < -buffersize*Point)  hlv1[i] =  1;
 
          
      
          if(hlv1[i] == -1) { sslHdn1[i] = levdr1; sslHup[i] = levdr1;  }
         if(hlv1[i] == 1)   { sslHdn1[i] = EMPTY_VALUE;  sslHup1[i] = EMPTY_VALUE; } 
        
 
   
   }
   
   
   
   
   return (0);
   
   }
   //---- done

