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;
}