Forex_Strategy_Builder.Indicator.MovingAverage C# (CSharp) Method

MovingAverage() protected static method

Calculates a Moving Average
protected static MovingAverage ( int period, int shift, MAMethod maMethod, double adSource ) : double[]
period int Period
shift int Shift
maMethod MAMethod Method of calculation
adSource double
return double[]
        protected static double[] MovingAverage(int period, int shift, MAMethod maMethod, double[] adSource)
        {
            double[] adTarget = new double[Bars];

            if (period <= 1 && shift == 0)
            {   // There is no smoothing
                return adSource;
            }

            if (period > Bars || period + shift <= 0 || period + shift > Bars)
            {   // Error in the parameters
                return null;
            }

            for (int bar = 0; bar < period + shift - 1; bar++)
            {
                adTarget[bar] = 0;
            }

            double sum = 0;
            for (int bar = 0; bar < period; bar++)
            {
                sum += adSource[bar];
            }

            adTarget[period + shift - 1] = sum / period;

            // Simple Moving Average
            if (maMethod == MAMethod.Simple)
            {
                for (int bar = period; bar < Math.Min(Bars, Bars - shift); bar++)
                {
                    adTarget[bar + shift] = adTarget[bar + shift - 1] + adSource[bar] / period - adSource[bar - period] / period;
                }
            }

            // Exponential Moving Average
            else if (maMethod == MAMethod.Exponential)
            {
                double pr = 2d / (period + 1);

                for (int bar = period; bar < Math.Min(Bars, Bars - shift); bar++)
                {
                    adTarget[bar + shift] = adSource[bar] * pr + adTarget[bar + shift - 1] * (1 - pr);
                }
            }

            // Weighted Moving Average
            else if (maMethod == MAMethod.Weighted)
            {
                double dWeight = period * (period + 1) / 2d;

                for (int bar = period; bar < Math.Min(Bars, Bars - shift); bar++)
                {
                    sum = 0;
                    for (int i = 0; i < period; i++)
                    {
                        sum += adSource[bar - i] * (period - i);
                    }

                    adTarget[bar + shift] = sum / dWeight;
                }
            }

            // Smoothed Moving Average
            else if (maMethod == MAMethod.Smoothed)
            {
                for (int bar = period; bar < Math.Min(Bars, Bars - shift); bar++)
                {
                    adTarget[bar + shift] = (adTarget[bar + shift - 1] * (period - 1) + adSource[bar]) / period;
                }
            }

            for (int bar = Bars + shift; bar < Bars; bar++)
            {
                adTarget[bar] = 0;
            }

            return adTarget;
        }