Download MetaTrader 5

how do i draw default MA on chart

To add comments, please log in or register
Interested in MetaTrader 5 features? Learn more about them!
Nurudeen Amedu
41334
Nurudeen Amedu 2016.07.06 18:48 

am looking for code to either draw the default Moving Average or a custom moving average to chart

the most important thing is that i want to be able to choose applied price, PRICE_CLOSE, OPEN, HIGH & LOW

most custom moving average codes do not have this 

Marco vd Heijden
Moderator
4704
Marco vd Heijden 2016.07.06 19:28  
Modify one so that it can be selected ?
Michael Maggi
1404
Michael Maggi 2016.07.06 20:35  
You can set it up on the cart and make a template of it.
Nurudeen Amedu
41334
Nurudeen Amedu 2016.07.06 20:50  
Marco vd Heijden:
Modify one so that it can be selected ?
how do i add the modification
Marco vd Heijden
Moderator
4704
Marco vd Heijden 2016.07.06 22:02  
Nurudeen Amedu:
how do i add the modification
Do you have the code? of any you have in mind
Nurudeen Amedu
41334
Nurudeen Amedu 2016.07.06 22:17  
Marco vd Heijden:
Do you have the code? of any you have in mind
//+------------------------------------------------------------------+
//|                                       Custom Moving Averages.mq4 |
//|                   Copyright 2005-2015, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2015, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//--- indicator parameters
input int            InpMAPeriod=65;        // Period
input int            InpMAShift=0;          // Shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMA;  // Method
input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT;
input ENUM_APPLIED_PRICE MAPrice = PRICE_CLOSE;
input double PriceRange = 600;

input bool SoundAlert = true;
input bool SendEmail = true;
input bool PushNotification = true;
//--- indicator buffer
double ExtLineBuffer[], value;
double PickPrice;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
   int    draw_begin=InpMAPeriod-1;
//--- indicator short name
   switch(InpMAMethod)
     {
      case MODE_SMA  : short_name="SMA(";                break;
      case MODE_EMA  : short_name="EMA(";  draw_begin=0; break;
      case MODE_SMMA : short_name="SMMA(";               break;
      case MODE_LWMA : short_name="LWMA(";               break;
      default :        return(INIT_FAILED);
     }
   IndicatorShortName(short_name+string(InpMAPeriod)+")");
   IndicatorDigits(Digits);
//--- check for input
   if(InpMAPeriod<2)
      return(INIT_FAILED);
//--- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,InpMAShift);
   SetIndexDrawBegin(0,draw_begin);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
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[])
  {


  Comment(value, "  ", PriceRange*Point);
  
  
//--- check for bars count
if(IsNewCandle()){
   CheckMaAlert();
   }
   if(rates_total<InpMAPeriod-1 || InpMAPeriod<2)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtLineBuffer,false);
   ArraySetAsSeries(close,false);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
      ArrayInitialize(ExtLineBuffer,0);
//--- calculation


   switch(InpMAMethod)
     {

      case MODE_EMA:  CalculateEMA(rates_total,prev_calculated,close);        break;
      case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,close);       break;
      case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,close); break;
      case MODE_SMA:  CalculateSimpleMA(rates_total,prev_calculated,close);   break;
     }


//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
   
     {
      limit=InpMAPeriod;
      //--- calculate first visible value
      double firstValue=0;
      for(i=0; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
//|  exponential moving average                                      |
//+------------------------------------------------------------------+
void CalculateEMA(int rates_total,int prev_calculated,const double &price[])
  {
   int    i,limit;
   double SmoothFactor=2.0/(1.0+InpMAPeriod);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod;
      ExtLineBuffer[0]=price[0];
      for(i=1; i<limit; i++)
         ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
//---
  }
//+------------------------------------------------------------------+
//|  linear weighted moving average                                  |
//+------------------------------------------------------------------+
void CalculateLWMA(int rates_total,int prev_calculated,const double & price[])
  {
   int        i,limit;
   static int weightsum;
   double     sum;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      weightsum=0;
      limit=InpMAPeriod;
      //--- calculate first visible value
      double firstValue=0;
      for(i=0;i<limit;i++)
        {
         int k=i+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
     {
      sum=0;
      for(int j=0;j<InpMAPeriod;j++)
         sum+=(InpMAPeriod-j)*price[i-j];
      ExtLineBuffer[i]=sum/weightsum;
     }
//---
  }
//+------------------------------------------------------------------+
//|  smoothed moving average                                         |
//+------------------------------------------------------------------+
void CalculateSmoothedMA(int rates_total,int prev_calculated,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod;
      double firstValue=0;
      for(i=0; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
void CheckMaAlert(){
   value = iMA(Symbol(),TimeFrame,InpMAPeriod,InpMAShift,InpMAMethod,MAPrice,1);
      if(Bid>value)
      {
      if((Bid-value)<=(PriceRange*Point)){
      
         if(SoundAlert)Alert(StringConcatenate(TimeCurrent(), _Symbol,": Price is ", ((NormalizeDouble(Bid-value,5))*10000), " pips above Moving Average"));
         if(SendEmail)SendMail("MT4 Indicator Alert", StringConcatenate(TimeCurrent(), _Symbol,": Price is ", ((NormalizeDouble(Bid-value,5))*10000), " pips above Moving Average"));
         if(PushNotification)SendNotification(StringConcatenate(TimeCurrent(), _Symbol,": Price is ", ((NormalizeDouble(Bid-value,5))*10000), " pips above Moving Average"));
         }
      }
      
      if(value>Bid)
      {
         if ((value-Bid)<=(PriceRange*Point)){
         if(SoundAlert)Alert(StringConcatenate(TimeCurrent(), _Symbol,": Price is ", ((NormalizeDouble(value-Bid,5))*10000), " pips below Moving Average"));
         if(SendEmail)SendMail("MT4 Indicator Alert", StringConcatenate(TimeCurrent(), _Symbol,": Price is ", ((NormalizeDouble(value-Bid,5))*10000), " pips below Moving Average"));
         if(PushNotification)SendNotification(StringConcatenate(TimeCurrent(), _Symbol,": Price is ", ((NormalizeDouble(value-Bid,5))*10000), " pips below Moving Average"));
      }
   }



}

bool IsNewCandle()
{
      static int BarsOnChart=0;
      if (Bars == BarsOnChart)
      return (false);
      BarsOnChart = Bars;
      return(true);
 }
Marco vd Heijden
Moderator
4704
Marco vd Heijden 2016.07.06 22:21  
Nurudeen Amedu:
it's already there.
Osama Shaban
1448
Osama Shaban 2016.07.06 23:08  
Copy the code of the MA indicator, apply changes as your request, then merge it in the EA !!!
To add comments, please log in or register