Add a Moving Average to MACD code

 

Hi guys I'm trying to add a moving average to an adaptive macd code but I'm having some troubles. In particular the MA is showing but not like if I add it with navigator function (I need to implement a moving average in the MACD code to do another edit). I post a pic to show you the difference between what I want and what I actually have, the original macd adaptive mq4 and its code edited by me. I hope somebody could help me saying where I'm wrong. Thank you.

 

 

EDITED CODE :

 

//+------------------------------------------------------------------+

//|                                         adaptivemacd 4 color mtf |

//|                                                                  |

//+------------------------------------------------------------------+

#property copyright "www.forex-tsd.com"

#property link      "www.forex-tsd.com"


#property description "edited by eevviill"

#property description "buf 3 to 1"

//

//

//

//

//


#property indicator_separate_window

#property indicator_buffers    6

#property indicator_color2     LimeGreen

#property indicator_color3     Red

#property indicator_color1     DimGray

#property indicator_color4     DeepSkyBlue

#property indicator_color5     PaleVioletRed

#property indicator_color6     Yellow

#property indicator_width1     2

#property indicator_width2     2

#property indicator_width3     2

#property indicator_width4     2

#property indicator_width5     2

#property indicator_width6     1

#property indicator_level1     0

#property indicator_levelcolor Gold

#property indicator_levelstyle STYLE_DOT

#property indicator_style6     STYLE_DOT


//

//

//

//

//


extern ENUM_TIMEFRAMES    TimeFrame        = PERIOD_CURRENT;

extern int                FastMa           = 12;

extern int                FastMaMethod     = 0;

extern ENUM_APPLIED_PRICE FastMaPrice      = 0;

extern int                AmaPeriod        = 26;

extern ENUM_APPLIED_PRICE AmaPrice         = PRICE_CLOSE;

extern int                Nfast            = 5;

extern int                Nslow            = 20;

extern double             GCoeff           = 2.0;

extern int                SignalMa         = 9;

extern ENUM_MA_METHOD     SignalMaMode     = 0;

extern int                SignalSMA        = 3;


extern bool   alertsOn         = true;

extern bool   alertsOnCurrent  = true;

extern bool   alertsMessage    = true;

extern bool   alertsSound      = false;

extern bool   alertsEmail      = false;


extern string  __              = "arrows settings";

extern bool   ShowArrows       = true;

extern string arrowsIdentifier = "rsima arrows";

extern color  arrowsUpColor    = Lime;

extern color  arrowsDnColor    = Orange;

extern bool               Interpolate      = true;


//

//

//

//

//


double osma[];

double green_buffer[];

double red_buffer[];

double macd[];

double sig[];

double kAMAbuffer[];

double diff[];

double trend[];

double sma[];


//

//

//

//

//


double fastend;

double slowend;

string indicatorFileName;

bool   returnBars;

int    timeFrame;


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

//

//

//

//

//


int init()

{

 IndicatorBuffers(9);

   SetIndexBuffer(1,green_buffer); SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID);

   SetIndexBuffer(2,red_buffer);   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID);

   SetIndexBuffer(0,osma);

   SetIndexBuffer(3,macd);

   SetIndexBuffer(4,sig);

   SetIndexBuffer(5,kAMAbuffer);

   SetIndexBuffer(6,diff);

   SetIndexBuffer(7,trend);

   SetIndexBuffer(8,sma);          SetIndexDrawBegin(8,SignalSMA);

                                   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);

   

      fastend   = (2.0 /(Nfast + 1));

      slowend   = (2.0 /(Nslow + 1));

   //

   //

   //

   //

   //

      

     indicatorFileName = WindowExpertName();

     returnBars        = TimeFrame==-99;

     TimeFrame         = MathMax(TimeFrame,_Period);

      

   IndicatorShortName(timeFrameToString(TimeFrame)+"  adaptive macd  ("+FastMa+")"+getAverageName(FastMaMethod)+" ("+AmaPeriod+") "+(SignalSMA)+"");

   return(0);

}


//

//

//

//

//


int deinit(){  if (ShowArrows) deleteArrows();  return(0); }


//

//

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+


int start()

  {

   

   int counted_bars=IndicatorCounted();

   int i,n,k,x,limit;

      if(counted_bars<0) return(-1);

      if(counted_bars>0) counted_bars--;

         limit=MathMin(Bars-counted_bars,Bars-1);

         if (returnBars)  { green_buffer[0] = limit+1; return(0); }

   

   //

   //

   //

   //

   //

   

   if (TimeFrame == Period())

   {

   

   for(i=limit; i>=0; i--)

   {

      double price = iMA(NULL,0,1,0,MODE_SMA,AmaPrice,i);


         if (i > Bars-AmaPeriod) { kAMAbuffer[i] = price; continue; }

   

         //

         //

         //

         //

         //

   

         double efratio = 1.00;

         double noise   = 0.00;

         double smooth;

         double signal;

             signal  = MathAbs(price-iMA(NULL,0,1,0,MODE_SMA,AmaPrice,i+AmaPeriod));

             diff[i] = MathAbs(price-iMA(NULL,0,1,0,MODE_SMA,AmaPrice,i+1));

                for (k=0;k<AmaPeriod;k++)

                        noise += diff[i+k];


          //

          //

          //

          //

          //


                  if (noise != 0) efratio = signal/noise;

                            smooth        = MathPow(efratio*(fastend-slowend)+slowend,GCoeff);

                            kAMAbuffer[i] = kAMAbuffer[i+1] + smooth*(price-kAMAbuffer[i+1]);

                            macd[i]       = iCustomMA(iMA(NULL,0,1,0,MODE_SMA,FastMaPrice,i),FastMa,FastMaMethod,i) - kAMAbuffer[i];

          }

          

         for (i=limit; i>=0; i--) sig[i]  = iMAOnArray(macd,Bars,SignalMa,0,SignalMaMode,i);

   

   //

   //

   //

   //

   //

   //

   

   for(i=limit; i>=0; i--)

   sma[i]=iMAOnArray(osma,Bars,SignalSMA,0,MODE_SMA,i);

   

   //

   //

   //

   //

   //

   

   for (i=limit; i>=0; i--)

   {

   

      osma[i] = macd[i]- sig[i];

      green_buffer[i]  = 0;

      red_buffer[i]    = 0;

        

      if(osma[i] > 0) 

     

           green_buffer[i]   = osma[i];

      else red_buffer[i]     = osma[i]; 

      

      trend[i] = trend[i+1]; 

         

  if (macd[i] > sig[i] && macd[i+1] <= sig[i+1]) trend[i]= 1; 

  if (macd[i] < sig[i] && macd[i+1] >= sig[i+1]) trend[i]=-1;

  

  manageArrow(i);

      

      //

      //

      //

      //

      //

      

      }

      

      manageAlerts();

      return(0);

      }

  

      //

      //

      //

      //

      //

   

      limit = MathMax(limit,MathMin(Bars,iCustom(NULL,TimeFrame,indicatorFileName,-99,0,0)*TimeFrame/Period()));

   

      for (i=limit; i>=0; i--)

      {

   

      int y = iBarShift(NULL,TimeFrame,Time[i]);

         osma[i]        = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,FastMa,FastMaMethod,FastMaPrice,AmaPeriod,AmaPrice,Nfast,Nslow,GCoeff,SignalMa,SignalMaMode,SignalSMA,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,"",ShowArrows,arrowsIdentifier,arrowsUpColor,arrowsDnColor,2,y);

         green_buffer[i]= iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,FastMa,FastMaMethod,FastMaPrice,AmaPeriod,AmaPrice,Nfast,Nslow,GCoeff,SignalMa,SignalMaMode,SignalSMA,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,"",ShowArrows,arrowsIdentifier,arrowsUpColor,arrowsDnColor,0,y);

         red_buffer[i]  = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,FastMa,FastMaMethod,FastMaPrice,AmaPeriod,AmaPrice,Nfast,Nslow,GCoeff,SignalMa,SignalMaMode,SignalSMA,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,"",ShowArrows,arrowsIdentifier,arrowsUpColor,arrowsDnColor,1,y);

         macd[i]        = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,FastMa,FastMaMethod,FastMaPrice,AmaPeriod,AmaPrice,Nfast,Nslow,GCoeff,SignalMa,SignalMaMode,SignalSMA,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,"",ShowArrows,arrowsIdentifier,arrowsUpColor,arrowsDnColor,3,y);

         sig[i]         = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,FastMa,FastMaMethod,FastMaPrice,AmaPeriod,AmaPrice,Nfast,Nslow,GCoeff,SignalMa,SignalMaMode,SignalSMA,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,"",ShowArrows,arrowsIdentifier,arrowsUpColor,arrowsDnColor,4,y);

         trend[i]       = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,FastMa,FastMaMethod,FastMaPrice,AmaPeriod,AmaPrice,Nfast,Nslow,GCoeff,SignalMa,SignalMaMode,SignalSMA,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,"",ShowArrows,arrowsIdentifier,arrowsUpColor,arrowsDnColor,7,y);

         sma[i]         = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,FastMa,FastMaMethod,FastMaPrice,AmaPeriod,AmaPrice,Nfast,Nslow,GCoeff,SignalMa,SignalMaMode,SignalSMA,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,"",ShowArrows,arrowsIdentifier,arrowsUpColor,arrowsDnColor,8,y);

         if (!Interpolate || y==iBarShift(NULL,TimeFrame,Time[i-1])) continue;


         //

         //

         //

         //

         //


         datetime time = iTime(NULL,TimeFrame,y);

         for(n = 1; i+n < Bars && Time[i+n] >= time; n++) continue;

         for(x = 1; x < n; x++)

         {

          osma[i+x]         = osma[i]         + (osma[i+n]         - osma[i])         * x/n;

          green_buffer[i+x] = green_buffer[i] + (green_buffer[i+n] - green_buffer[i]) * x/n;

          red_buffer[i+x]   = red_buffer[i]   + (red_buffer[i+n]   - red_buffer[i])   * x/n;

          macd[i+x]         = macd[i]         + (macd[i+n]         - macd[i])         * x/n;

          sig[i+x]          = sig[i]          + (sig[i+n]          - sig[i])          * x/n;

          sma[i+x]          = sig[i]          + (sig[i+n]          - sig[i])          * x/n;

        }              

   }

   return(0);

}

      

//

//

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+


void manageAlerts()

{

   if (alertsOn)

   {

      if (alertsOnCurrent)

           int whichBar = 0;

      else     whichBar = 1;

      if (trend[whichBar] != trend[whichBar+1])

      {

         if (trend[whichBar] ==  1) doAlert(whichBar,"up");

         if (trend[whichBar] == -1) doAlert(whichBar,"down");

      }

   }

}


//

//

//

//

//


void doAlert(int forBar, string doWhat)

{

   static string   previousAlert="nothing";

   static datetime previousTime;

   string message;

   

   if (previousAlert != doWhat || previousTime != Time[forBar]) {

       previousAlert  = doWhat;

       previousTime   = Time[forBar];


       //

       //

       //

       //

       //


       message =  StringConcatenate(Symbol()," ",timeFrameToString(_Period)," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," adaptive macd changed direction to ",doWhat);

          if (alertsMessage) Alert(message);

          if (alertsEmail)   SendMail(StringConcatenate(Symbol()," adaptive macd "),message);

          if (alertsSound)   PlaySound("alert2.wav");

   }

}


//+-------------------------------------------------------------------

//|                                                                  

//+-------------------------------------------------------------------

//

//

//

//

//


string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};

int    iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};


string timeFrameToString(int tf)

{

   for (int i=ArraySize(iTfTable)-1; i>=0; i--) 

         if (tf==iTfTable[i]) return(sTfTable[i]);

                              return("");

}


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

//

//

//

//

//


double workPrices[];

double workResult[];

int    r;


double iCustomMA(double price, int period, int method, int i)

{

   if (ArraySize(workPrices)!= Bars) ArrayResize(workPrices,Bars);

            r = Bars-i-1;

   workPrices[r] = price;


   //

   //

   //

   //

   //

   

      switch(method)

      {

         case  0: return(iSma(price,period,i));

         case  1: return(iEma(price,period,i));

         case  2: return(iSmma(price,period,i));

         case  3: return(iLwma(price,period,i));

         case  4: return(iLsma(price,period,i));

         case  5: return(iTma(price,period,i));

         case  6: return(iSineWMA(price,period,i));

         case  7: return(iVolumeWMA(price,period,i));

         case  8: return(iHma(price,period,i));

         case  9: return(iNonLagMa(price,period,i));

         case 10: return(iLwmp(price,period,i));

      }

   return(EMPTY_VALUE);

}


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

//

//

//

//

//


double iSma(double price, double period, int i)

{

   double sum = 0;

   for(int k=0; k<period && (r-k)>=0; k++) sum += workPrices[r-k];  

   if (k!=0)

         return(sum/k);

   else  return(EMPTY_VALUE);

}


//

//

//

//

//


double iEma(double price, double period, int i)

{

   if (ArraySize(workResult)!= Bars) ArrayResize(workResult,Bars);

   double alpha = 2.0 / (1.0+period);

          workResult[r] = workResult[r-1]+alpha*(price-workResult[r-1]);

   return(workResult[r]);

}

//

//

//

//

//


double iSmma(double price, double period, int i)

{

   if (ArraySize(workResult)!= Bars) ArrayResize(workResult,Bars);

   if (i>=(Bars-period))

   {

      double sum = 0; 

         for(int k=0; k<period && (r-k)>=0; k++) sum += workPrices[r-k];  

         if (k!=0)

               workResult[i] = sum/k;

         else  workResult[i] = EMPTY_VALUE;

   }      

   else   workResult[r] = (workResult[r-1]*(period-1)+price)/period;

   return(workResult[r]);

}


//

//

//

//

//


double iLwma_prices[][3];

double iLwma(double price, double period, int i,int forValue=0)

{

   if (ArrayRange(iLwma_prices,0)!= Bars) ArrayResize(iLwma_prices,Bars);

   

   //

   //

   //

   //

   //

   

   iLwma_prices[r][forValue] = price;

      double sum  = 0;

      double sumw = 0;


      for(int k=0; k<period && (r-k)>=0; k++)

      {

         double weight = period-k;

                sumw  += weight;

                sum   += weight*iLwma_prices[r-k][forValue];  

      }             

   if (sumw!=0)

         return(sum/sumw);

   else  return(EMPTY_VALUE);

}


//

//

//

//

//


double iLwmp_prices[][3];

double iLwmp(double price, double period, int i,int forValue=0)

{

   if (ArrayRange(iLwmp_prices,0)!= Bars) ArrayResize(iLwmp_prices,Bars);

   

   //

   //

   //

   //

   //

   

   iLwmp_prices[r][forValue] = price;

      double sum  = 0;

      double sumw = 0;


      for(int k=0; k<period && (r-k)>=0; k++)

      {

         double weight = (period-k)*(period-k);

                sumw  += weight;

                sum   += weight*iLwmp_prices[r-k][forValue];  

      }             

   if (sumw!=0)

         return(sum/sumw);

   else  return(EMPTY_VALUE);

}


//

//

//

//

//


double iLsma(double price, double period, int i)

{

   return(3.0*iLwma(price,period,i)-2.0*iSma(price,period,i));

}


//

//

//

//

//


double iHma(double price, double period, int i)

{

   int HalfPeriod = MathFloor(period/2);

   int HullPeriod = MathFloor(MathSqrt(period));

            double price1 = 2.0*iLwma(price,HalfPeriod,i,0)-iLwma(price,period,i,1);

   return (iLwma(price1,HullPeriod,i,2));

}


//

//

//

//

//


double iTma(double price, double period, int i)

{

   double half = (period+1.0)/2.0;

   double sum  = 0;

   double sumw = 0;


   for(int k=0; k<period && (r-k)>=0; k++)

   {

      double weight = k+1; if (weight > half) weight = period-k;

             sumw  += weight;

             sum   += weight*workPrices[r-k];  

   }             

   if (sumw!=0)

         return(sum/sumw);

   else  return(EMPTY_VALUE);

}


//

//

//

//

//


#define Pi 3.14159265358979323846

double iSineWMA(double price, int period, int i)

{

   double sum  = 0;

   double sumw = 0;

  

   for(int k=0; k<period && (r-k)>=0; k++)

   { 

      double weight = MathSin(Pi*(k+1)/(period+1));

             sumw  += weight;

             sum   += weight*workPrices[r-k]; 

   }

   if (sumw!=0)

         return(sum/sumw);

   else  return(EMPTY_VALUE);

}


//

//

//

//

//


double iVolumeWMA(double price, int period, int i)

{

   double sum  = 0;

   double sumw = 0;

  

   for(int k=0; k<period && (r-k)>=0; k++)

   { 

      double weight = Volume[i+k];

             sumw  += weight;

             sum   += weight*workPrices[r-k]; 

   }

   if (sumw!=0)

         return(sum/sumw);

   else  return(EMPTY_VALUE);

}



//+------------------------------------------------------------------

//|                                                                  

//+------------------------------------------------------------------

//

//

//

//

//


#define _length  0

#define _len     1

#define _weight  2


#define numOfSeparateCalculations 1

double  nlm_values[3][numOfSeparateCalculations];

double  nlm_prices[ ][numOfSeparateCalculations];

double  nlm_alphas[ ][numOfSeparateCalculations];


//

//

//

//

//


double iNonLagMa(double price, int length, int i, int forValue=0)

{

   if (ArrayRange(nlm_prices,0) != Bars) ArrayResize(nlm_prices,Bars);

                               nlm_prices[r][forValue]=price;

   if (length<3 || r<3) return(nlm_prices[r][forValue]);

   

   //

   //

   //

   //

   //

   

   if (nlm_values[_length][forValue] != length)

   {

      double Cycle = 4.0;

      double Coeff = 3.0*Pi;

      int    Phase = length-1;

      

         nlm_values[_length][forValue] = length;

         nlm_values[_len   ][forValue] = length*4 + Phase;  

         nlm_values[_weight][forValue] = 0;


         if (ArrayRange(nlm_alphas,0) < nlm_values[_len][forValue]) ArrayResize(nlm_alphas,nlm_values[_len][forValue]);

         for (int k=0; k<nlm_values[_len][forValue]; k++)

         {

            if (k<=Phase-1) 

                 double t = 1.0 * k/(Phase-1);

            else        t = 1.0 + (k-Phase+1)*(2.0*Cycle-1.0)/(Cycle*length-1.0); 

            double beta = MathCos(Pi*t);

            double g = 1.0/(Coeff*t+1); if (t <= 0.5 ) g = 1;

      

            nlm_alphas[k][forValue]        = g * beta;

            nlm_values[_weight][forValue] += nlm_alphas[k][forValue];

         }

   }

   

   //

   //

   //

   //

   //

   

   if (nlm_values[_weight][forValue]>0)

   {

      double sum = 0;

           for (k=0; k < nlm_values[_len][forValue]; k++) sum += nlm_alphas[k][forValue]*nlm_prices[r-k][forValue];

           return( sum / nlm_values[_weight][forValue]);

   }

   else return(0);           

}



//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

//

//

//

//

//


string methodNames[] = {"SMA","EMA","SMMA","LWMA","LSMA","TriMA","SWMA","VWMA","HullMA","NonLagMA","LWM parabolic"};

string getAverageName(int& method)

{

   method=MathMax(MathMin(method,10),0); return(methodNames[method]);

}


//

//

//

//

//


void manageArrow(int i)

{

   if (ShowArrows)

   {

      deleteArrow(Time[i]);

      if (trend[i]!=trend[i+1])

      {

         if (trend[i] == 1) drawArrow(i,arrowsUpColor,221,false);

         if (trend[i] ==-1) drawArrow(i,arrowsDnColor,222,true);

      }

   }

}               


//

//

//

//

//


void drawArrow(int i,color theColor,int theCode,bool up)

{

   string name = arrowsIdentifier+":"+Time[i];

   double gap  = iATR(NULL,0,20,i);   

   

      //

      //

      //

      //

      //

      

      ObjectCreate(name,OBJ_ARROW,0,Time[i],0);

         ObjectSet(name,OBJPROP_ARROWCODE,theCode);

         ObjectSet(name,OBJPROP_COLOR,theColor);

  

         if (up)

               ObjectSet(name,OBJPROP_PRICE1,High[i]+gap);

         else  ObjectSet(name,OBJPROP_PRICE1,Low[i] -gap);

}


//

//

//

//

//


void deleteArrows()

{

   string lookFor       = arrowsIdentifier+":";

   int    lookForLength = StringLen(lookFor);

   for (int i=ObjectsTotal()-1; i>=0; i--)

   {

      string objectName = ObjectName(i);

         if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

   }

}


void deleteArrow(datetime time)

{

   string lookFor = arrowsIdentifier+":"+time; ObjectDelete(lookFor);

 
On the forum have the rules of the code of insertion.
 
It might be helpful if you use the SRC button to put the code in the message and also Note in the code what you changed.  like  // added this etc
Reason: