//+------------------------------------------------------------------+ //| MovingAverages.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Simple Moving Average | //+------------------------------------------------------------------+ double SimpleMA(const int position,const int period,const double &price[]) { double result=0.0; //--- check period if(period>0 && period<=(position+1)) { for(int i=0; i0) { double pr=2.0/(period+1.0); result=price[position]*pr+prev_value*(1-pr); } return(result); } //+------------------------------------------------------------------+ //| Smoothed Moving Average | //+------------------------------------------------------------------+ double SmoothedMA(const int position,const int period,const double prev_value,const double &price[]) { double result=0.0; //--- check period if(period>0 && period<=(position+1)) { if(position==period-1) { for(int i=0; i0 && period<=(position+1)) { double sum =0.0; int wsum=0; for(int i=period; i>0; i--) { wsum+=i; sum +=price[position-i+1]*(period-i+1); } result=sum/wsum; } return(result); } //+------------------------------------------------------------------+ //| Simple moving average on price array | //+------------------------------------------------------------------+ int SimpleMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[]) { //--- check period if(period<=1 || period>(rates_total-begin)) return(0); //--- save as_series flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_buffer=ArrayGetAsSeries(buffer); ArraySetAsSeries(price,false); ArraySetAsSeries(buffer,false); //--- calculate start position int start_position; if(prev_calculated==0) // first calculation or number of bars was changed { //--- set empty value for first bars start_position=period+begin; for(int i=0; i(rates_total-begin)) return(0); //--- save and clear 'as_series' flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_buffer=ArrayGetAsSeries(buffer); ArraySetAsSeries(price,false); ArraySetAsSeries(buffer,false); //--- calculate start position int start_position; double smooth_factor=2.0/(1.0+period); if(prev_calculated==0) // first calculation or number of bars was changed { //--- set empty value for first bars for(int i=0; i(rates_total-begin)) return(0); //--- save as_series flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_buffer=ArrayGetAsSeries(buffer); ArraySetAsSeries(price,false); ArraySetAsSeries(buffer,false); //--- calculate start position int i,start_position; if(prev_calculated<=period+begin+2) // first calculation or number of bars was changed { //--- set empty value for first bars start_position=period+begin; for(i=0; i(rates_total-begin)) return(0); //--- save as_series flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_buffer=ArrayGetAsSeries(buffer); ArraySetAsSeries(price,false); ArraySetAsSeries(buffer,false); //--- calculate start position int start_position; if(prev_calculated==0) // first calculation or number of bars was changed { //--- set empty value for first bars start_position=period+begin; for(int i=0; i(rates_total-begin)) return(0); //--- save as_series flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_buffer=ArrayGetAsSeries(buffer); ArraySetAsSeries(price,false); ArraySetAsSeries(buffer,false); //--- calculate start position int start_position; if(prev_calculated==0) // first calculation or number of bars was changed { //--- set empty value for first bars start_position=period+begin; for(int i=0; i