Download MetaTrader 5

how do i draw default MA on chart

To add comments, please log in or register
Nurudeen Amedu
52609
Nurudeen Amedu  

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
6138
Marco vd Heijden  
Modify one so that it can be selected ?
Michael Maggi
1674
Michael Maggi  
You can set it up on the cart and make a template of it.
Nurudeen Amedu
52609
Nurudeen Amedu  
Marco vd Heijden:
Modify one so that it can be selected ?
how do i add the modification
Marco vd Heijden
Moderator
6138
Marco vd Heijden  
Nurudeen Amedu:
how do i add the modification
Do you have the code? of any you have in mind
Nurudeen Amedu
52609
Nurudeen Amedu  
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
6138
Marco vd Heijden  
Nurudeen Amedu:
it's already there.
Osama Shaban
1584
Osama Shaban  
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