//+------------------------------------------------------------------+ //| MACD.mq4 | //| Copyright © 2005, David W. Thomas | //| mailto:davidwt@usa.net | //+------------------------------------------------------------------+ // This is the correct computation and display of MACD. #property copyright "Copyright © 2005, David W. Thomas" #property link "mailto:davidwt@usa.net" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Green extern int Show_Alert = 1; extern int Send_Mail = 1; extern bool AlertMain = true; extern bool AlertSignal = false; extern bool AlertHistogram = false; //---- input parameters extern int FastMAPeriod=12; extern int SlowMAPeriod=26; extern int SignalMAPeriod=9; //---- buffers double MACDLineBuffer[]; double SignalLineBuffer[]; double HistogramBuffer[]; //---- variables double alpha = 0; double alpha_1 = 0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1); //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,MACDLineBuffer); SetIndexDrawBegin(0,SlowMAPeriod); SetIndexStyle(1,DRAW_LINE,STYLE_DOT); SetIndexBuffer(1,SignalLineBuffer); SetIndexDrawBegin(1,SlowMAPeriod+SignalMAPeriod); SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexBuffer(2,HistogramBuffer); SetIndexDrawBegin(2,SlowMAPeriod+SignalMAPeriod); //---- name for DataWindow and indicator subwindow label IndicatorShortName("MACD("+FastMAPeriod+","+SlowMAPeriod+","+SignalMAPeriod+")"); SetIndexLabel(0,"MACD"); SetIndexLabel(1,"Signal"); //---- alpha = 2.0 / (SignalMAPeriod + 1.0); alpha_1 = 1.0 - alpha; //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //-- Check for Start of a new Bar bool NewBar() { static datetime dt = 0; if (Time[0] != dt) { dt = Time[0]; return(true); } return(false); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int limit; int counted_bars = IndicatorCounted(); //---- check for possible errors if (counted_bars<0) return(-1); //---- last counted bar will be recounted if (counted_bars>0) counted_bars--; limit = Bars - counted_bars; for(int i=limit; i>=0; i--) { MACDLineBuffer[i] = iMA(NULL,0,FastMAPeriod,0,MODE_EMA,PRICE_CLOSE,i) - iMA(NULL,0,SlowMAPeriod,0,MODE_EMA,PRICE_CLOSE,i); SignalLineBuffer[i] = alpha*MACDLineBuffer[i] + alpha_1*SignalLineBuffer[i+1]; HistogramBuffer[i] = MACDLineBuffer[i] - SignalLineBuffer[i]; } if (!NewBar()) return(0); if (AlertMain) { if ( MACDLineBuffer[1] > 0 && MACDLineBuffer[2] < 0) { if (Show_Alert == 1) Alert("Main Cross Up on " + Symbol() + " " + Period() + "min "); if (Send_Mail == 1) SendMail("Main Cross Up on " + Symbol() + " " + Period() + "min ",""); } if ( MACDLineBuffer[1] < 0 && MACDLineBuffer[2] > 0) { if (Show_Alert == 1) Alert("Main Cross Down on " + Symbol() + " " + Period() + "min "); if (Send_Mail == 1) SendMail("Main Cross Down on " + Symbol() + " " + Period() + "min ", ""); } } if (AlertSignal) { if ( SignalLineBuffer[1] > 0 && SignalLineBuffer[2] < 0) { if (Show_Alert == 1) Alert("Signal Cross Up on " + Symbol() + " " + Period() + "min "); if (Send_Mail == 1) SendMail("Signal Cross Up on " + Symbol() + " " + Period() + "min ",""); } if ( SignalLineBuffer[1] < 0 && SignalLineBuffer[2] > 0) { if (Show_Alert == 1) Alert("Signal Cross Down on " + Symbol() + " " + Period() + "min "); if (Send_Mail == 1) SendMail("Signal Cross Down on " + Symbol() + " " + Period() + "min ", ""); } } if (AlertHistogram) { if ( HistogramBuffer[1] > 0 && HistogramBuffer[2] < 0) { if (Show_Alert == 1) Alert("Histogram Cross Up on " + Symbol() + " " + Period() + "min "); if (Send_Mail == 1) SendMail("Histogram Cross Up on " + Symbol() + " " + Period() + "min ",""); } if ( HistogramBuffer[1] < 0 && HistogramBuffer[2] > 0) { if (Show_Alert == 1) Alert("Histogram Cross Down on " + Symbol() + " " + Period() + "min "); if (Send_Mail == 1) SendMail("Histogram Cross Down on " + Symbol() + " " + Period() + "min ", ""); } } //---- return(0); } //+------------------------------------------------------------------+