Exponential Moving Average Indicator in MQL5

 

Hello,

Can someone please refer me to a plain and straightforward exponential moving average (EMA) indicator written in MQL5. As I am currently learning the ins and outs of the MQL5 language, I believe it would be beneficial to study and understand how things work with this specific type of indicator.

Researching online, I have come across numerous resources, but most of them provide complex moving average indicators or expert advisors.

Thanks!

Codemq

 
codemq: Can someone please refer me to a plain and straightforward exponential moving average (EMA) indicator written in MQL5. As I am currently learning the ins and outs of the MQL5 language, I believe it would be beneficial to study and understand how things work with this specific type of indicator. Researching online, I have come across numerous resources, but most of them provide complex moving average indicators or expert advisors.

Did you run a search in the CodeBase before posting?

If you had you would have found this ...

Code Base

Exponential moving average

Mladen Rakic, 2019.03.22 16:40

Exponential moving average
 
Fernando Carreiro #:

Did you run a search in the CodeBase before posting?

If you had you would have found this ...

But this doesn't include source code.
 
@Yashar Seyyedin #: But this doesn't include source code.

How can you state that? Of course it does — its from the CodeBase.

Download it and try it for yourself.

 
Fernando Carreiro #:

Did you run a search in the CodeBase before posting?

If you had you would have found this ...

After searching, I couldn't find a plain exponential moving average. The one mentioned in your reply changes color according to the direction of the trend. What I'm seeking is a basic exponential moving average without any additional features or enhancements.

 

Also, if you want to the learn the maths, read the following ...

 
codemq #: After searching, I couldn't find a plain exponential moving average. The one mentioned in your reply changes color according to the direction of the trend. What I'm seeking is a basic exponential moving average without any additional features or enhancements.

It is in the code. It even has a class implementation of the EMA which you can reuse in your own code.

The colour change is irrelevant and is not even part of the class. Just remove the colour change if you don't want it (it is just one line).

 
Fernando Carreiro #:

It is in the code. It even has a class implementation of the EMA which you can reuse in your own code.

The colour change is irrelevant and is not even part of the class. Just remove the colour change if you don't want it (it is just one line).

//+------------------------------------------------------------------
#property copyright   "© mladen, 2019"
#property link        "mladenfx@gmail.com"
#property description "Exponential Moving Average"
//+------------------------------------------------------------------
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_label1  "EMA"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrDeepSkyBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//
//
//

input int                inpPeriod   =  14;         // Period
input ENUM_APPLIED_PRICE inpPrice    = PRICE_CLOSE; // Price

double val[],valc[];

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//

int OnInit()
{
   SetIndexBuffer(0,val,INDICATOR_DATA);
   SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX);
         _ema.init(inpPeriod);
   IndicatorSetString(INDICATOR_SHORTNAME,"Exponential Moving Average ("+(string)inpPeriod+")");
   return (INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//

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=prev_calculated-1; if (i<0) i=0; for (; i<rates_total && !_StopFlag; i++)
   {
      val[i]  = _ema.calculate(getPrice(inpPrice,open,high,low,close,i),i,rates_total);
      valc[i] = 0;
   }
   return (i);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//

class CEma
{
   private :
         double m_period;
         double m_alpha;
         double m_array[];
         int    m_arraySize;
   public :
      CEma() : m_period(1), m_alpha(1), m_arraySize(-1) { return; }
     ~CEma()                                            { return; }
     
     //
     //---
     //
     
     void init(int period)
      {
            m_period = (period>1) ? period : 1;
            m_alpha  = 2.0/(1.0+m_period);
      }
      double calculate(double value, int i, int bars)
      {
        if (m_arraySize<bars)
          { m_arraySize=ArrayResize(m_array,bars+500); if (m_arraySize<bars) return(0); }

            //
            //
            //

            if (i>0)
                    m_array[i] = m_array[i-1]+m_alpha*(value-m_array[i-1]); 
            else    m_array[i] = value;
            return (m_array[i]);
         }   
};
CEma _ema;

//
//---
//

template <typename T> 
double getPrice(ENUM_APPLIED_PRICE tprice, T& open[], T& high[], T& low[], T& close[], int i)
{
   switch(tprice)
   {
         case PRICE_CLOSE:     return(close[i]);
         case PRICE_OPEN:      return(open[i]);
         case PRICE_HIGH:      return(high[i]);
         case PRICE_LOW:       return(low[i]);
         case PRICE_MEDIAN:    return((high[i]+low[i])/2.0);
         case PRICE_TYPICAL:   return((high[i]+low[i]+close[i])/3.0);
         case PRICE_WEIGHTED:  return((high[i]+low[i]+close[i]+close[i])/4.0);
   }
   return(0);
}
//------------------------------------------------------------------
Thank you for your feedback! I have made some modifications to the code.
 
Yashar Seyyedin #:
But this doesn't include source code.

Sorry! You are right.

 
Gerard Willia G J B M Dinh Sy #:
Hello. 
Try this
Thanks