//+------------------------------------------------------------------+ //| 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 5 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Green #property indicator_color4 Aqua #property indicator_color5 Yellow //---- input parameters extern int FastMAPeriod_1=12; extern int SlowMAPeriod_1=26; extern int SignalMAPeriod_1=9; extern int FastMAPeriod_2=24; extern int SlowMAPeriod_2=52; extern int SignalMAPeriod_2=9; //---- buffers double MACDLineBuffer_1[]; double SignalLineBuffer_1[]; double HistogramBuffer[]; double MACDLineBuffer_2[]; double SignalLineBuffer_2[]; //---- variables double alpha = 0; double alpha_1 = 0; double alpha_2 = 0; double alpha_2_1 = 0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1); //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,MACDLineBuffer_1); SetIndexDrawBegin(0,SlowMAPeriod_1); SetIndexStyle(1,DRAW_LINE,STYLE_DOT); SetIndexBuffer(1,SignalLineBuffer_1); SetIndexDrawBegin(1,SlowMAPeriod_1+SignalMAPeriod_1); SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexBuffer(2,HistogramBuffer); SetIndexDrawBegin(2,SlowMAPeriod_1+SignalMAPeriod_1); SetIndexStyle(3,DRAW_LINE); SetIndexBuffer(3,MACDLineBuffer_2); SetIndexDrawBegin(3,SlowMAPeriod_2); SetIndexStyle(4,DRAW_LINE,STYLE_DOT); SetIndexBuffer(4,SignalLineBuffer_2); SetIndexDrawBegin(4,SlowMAPeriod_2+SignalMAPeriod_2); //---- name for DataWindow and indicator subwindow label IndicatorShortName("MACD("+FastMAPeriod_1+","+SlowMAPeriod_1+","+SignalMAPeriod_1+")" + "("+FastMAPeriod_2+","+SlowMAPeriod_2+","+SignalMAPeriod_2+")"); SetIndexLabel(0,"MACD_1"); SetIndexLabel(1,"Signal_1"); SetIndexLabel(3,"MACD_2"); SetIndexLabel(4,"Signal_2"); //---- alpha = 2.0 / (SignalMAPeriod_1 + 1.0); alpha_1 = 1.0 - alpha; alpha_2 = 2.0 / (SignalMAPeriod_2 + 1.0); alpha_2_1 = 1.0 - alpha_2; //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| 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_1[i] = iMA(NULL,0,FastMAPeriod_1,0,MODE_EMA,PRICE_CLOSE,i) - iMA(NULL,0,SlowMAPeriod_1,0,MODE_EMA,PRICE_CLOSE,i); SignalLineBuffer_1[i] = alpha*MACDLineBuffer_1[i] + alpha_1*SignalLineBuffer_1[i+1]; HistogramBuffer[i] = MACDLineBuffer_1[i] - SignalLineBuffer_1[i]; MACDLineBuffer_2[i] = iMA(NULL,0,FastMAPeriod_2,0,MODE_EMA,PRICE_CLOSE,i) - iMA(NULL,0,SlowMAPeriod_2,0,MODE_EMA,PRICE_CLOSE,i); SignalLineBuffer_2[i] = alpha_2*MACDLineBuffer_2[i] + alpha_2_1*SignalLineBuffer_2[i+1]; } //---- return(0); } //+------------------------------------------------------------------+