//+------------------------------------------------------------------+ //| Custom MACD.mq4 | //| Copyright 2005-2014, MetaQuotes Software Corp. | //| http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "2005-2014, MetaQuotes Software Corp." #property link "http://www.mql4.com" #property description "Moving Averages Convergence/Divergence" #property strict //--- indicator settings #property indicator_separate_window #property indicator_buffers 4 #property indicator_color1 Silver #property indicator_width1 2 #property indicator_color2 Orange #property indicator_width2 2 #property indicator_color3 Red #property indicator_width3 2 #property indicator_color4 DodgerBlue #property indicator_width4 2 //--- indicator parameters input int InpFastEMA=12; // Fast EMA Period input int InpSlowEMA=26; // Slow EMA Period input int InpSignalSMA=9; // Signal SMA Period input int InpEMA01=8; // EMA01 input int InpEMA02=38; // EMA02 //--- indicator buffers double ExtMacdBuffer[]; double ExtSignalBuffer[]; double ExtEMA01Buffer[]; double ExtEMA02Buffer[]; //--- right input parameters flag bool ExtParameters=false; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(void) { IndicatorDigits(Digits+1); //--- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexStyle(1,DRAW_LINE); SetIndexDrawBegin(1,InpSignalSMA); SetIndexStyle(2,DRAW_LINE); SetIndexDrawBegin(2,InpEMA01); SetIndexStyle(3,DRAW_LINE); SetIndexDrawBegin(3,InpEMA02); //--- indicator buffers mapping SetIndexBuffer(0,ExtMacdBuffer); SetIndexBuffer(1,ExtSignalBuffer); SetIndexBuffer(2,ExtEMA01Buffer); SetIndexBuffer(3,ExtEMA02Buffer); //--- name for DataWindow and indicator subwindow label IndicatorShortName("MACD with 2 EMAs("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+"|EMA01 "+IntegerToString(InpEMA01)+"|EMA02 "+IntegerToString(InpEMA02)+")"); SetIndexLabel(0,"MACD"); SetIndexLabel(1,"Signal"); SetIndexLabel(2,"EMA01"); SetIndexLabel(3,"EMA02"); //--- check for input parameters if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA) { Print("Wrong input parameters"); ExtParameters=false; return(INIT_FAILED); } else ExtParameters=true; //--- initialization done return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[]) { int i,limit=fmin(rates_total-prev_calculated+1,rates_total-1); //--- macd counted in the 1-st buffer for(i=limit;i>=0 && !_StopFlag; i--) { ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)- iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i); } //--- signal line counted in the 2-nd buffer for(i=limit;i>=0 && !_StopFlag; i--) ExtSignalBuffer[i] = iMAOnArray(ExtMacdBuffer,0,InpSignalSMA,0,MODE_SMA,i); //--- EMA01 line counted in the 3-rd buffer for(i=limit;i>=0 && !_StopFlag; i--) ExtEMA01Buffer[i] = iMAOnArray(ExtMacdBuffer,0,InpEMA01,0,MODE_LWMA,i); //--- EMA02 line counted in the 4-th buffer for(i=limit;i>=0 && !_StopFlag; i--) ExtEMA02Buffer[i] = iMAOnArray(ExtMacdBuffer,0,InpEMA02,0,MODE_LWMA,i); //--- done return(rates_total); } //+------------------------------------------------------------------+