//+------------------------------------------------------------------+
//|                                      macd.mq4  |
//+------------------------------------------------------------------+


#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 BlueViolet
#property indicator_color2 Aqua
#property indicator_width1 2
#property indicator_width2 2
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID



//---- input parameters
extern int MAPeriod = 50;
extern int MACD_Fast = 12;
extern int MACD_Slow = 26;
extern int MACD_SMA = 9;
extern int MAMode = MODE_SMA;
extern int MAPrice = PRICE_CLOSE;
extern int MAShift = 0;
extern int indicator_level1 =  10.0;
extern int indicator_level2  = 90.0;
input bool Platform_Alert = true;
input int Alert_Repeat = 1;
input int Alert_Interval = 1;


double MACD[];
double SMA50[];

datetime SignalTime;
int AlertType=0, AlertCounter=0;
string AlertMSG, TF;
//+------------------------------------------------------------------+
//| init()                                                           |
//+------------------------------------------------------------------+
int init()
{
EventSetTimer(Alert_Interval);
   SignalTime=Time[1];
   if(Period()==1) TF="M1";
   else if(Period()==5) TF="M5";
   else if(Period()==15) TF="M15";
   else if(Period()==30) TF="M30";
   else if(Period()==60) TF="H1";
   else if(Period()==240) TF="H4";
   else if(Period()==1440) TF="D1";
   else if(Period()==10080) TF="W1";
   else if(Period()==43200) TF="MN1";
   else TF="N/A";
   EventSetTimer(Alert_Interval);
   SignalTime=Time[1];
   
   SetIndexBuffer( 0, SMA50 );
   SetIndexLabel( 0, "Moving Average" );
   
   SetIndexBuffer( 1, MACD );
   SetIndexLabel( 1, "MACD" );
   

   
   IndicatorShortName( "DBB" );
   IndicatorDigits( Digits );
   
   return( 0 );
}

//+------------------------------------------------------------------+
//| deinit()                                                         |
//+------------------------------------------------------------------+
int deinit()
{
   return( 0 );
}

//+------------------------------------------------------------------+
//| start()                                                          |
//+------------------------------------------------------------------+
int start()
{
   int counted_bars = IndicatorCounted();
   
   if (counted_bars < 0) return (-1);
   if (counted_bars > 0) counted_bars--;
   int Limit = Bars - counted_bars;
        
   int index;
   for( index = Limit; index >= 0; index-- )
   {
     
      SMA50[index]=iMA(NULL,0, MAPeriod , 0, MAMode, MAPrice, index);
      MACD[index]=SMA50[index]+iMACD(NULL,0,MACD_Fast,MACD_Slow,MACD_SMA,MAPrice,MODE_MAIN,index);

   }
      if(SMA50[0]<=MACD[0] && SMA50[1]>MACD[1] && SignalTime!=Time[1])
      {
         AlertType=1;
         SignalTime=Time[1];
         AlertCounter=Alert_Repeat;
         if(Platform_Alert) Alert(StringConcatenate(Symbol(),"(",TF,") : SMA50 < MACD"));
                  Comment(AlertMSG);
      }
      else if(SMA50[0]<=MACD[0] && SMA50[1]>MACD[1] && SignalTime!=Time[1])
      {
         AlertType=2;
         SignalTime=Time[1];
         AlertCounter=Alert_Repeat;
         if(Platform_Alert) Alert(StringConcatenate(Symbol(),"(",TF,") : SMA50 > MACD"));
         Comment(AlertMSG);
      }
      
      
 //+------------------------------------------------------------------+     
   return( 0 );
}

void OnTimer()
{
   if(AlertType==1) AlertMSG="MACD < SMA";
   else if(AlertType==2) AlertMSG="MACD > SMA";
   else return;
   
   if(AlertCounter>0)
   {
      Alert(AlertMSG);
      AlertCounter--;
   }
}