Простой ответ заключается в том, что код не вычисляет скользящее среднее, поскольку код суммирования не ссылается на значения из предыдущих строк.
Сначала просмотрите этот код:
dblWeightSum = intPeriods * (intPeriods + 1) / 2
Это просто сумма целых чисел от 1 до intPeriods, например 1 + 2 + 3 + ... + intPeriods
.
Теперь перейдите к коду
dblTempSum = 0
k = 0
...
For j = i - intPeriods + 1 To i
k = k + 1
dblTempSum = dblTempSum + .Fields(0) * k
Next j
arrWMA(i) = dblTempSum / dblWeightSum
Первое замечание, что нет предыдущихзначения, добавленные к сумме. Другими словами, она вообще не включает предыдущее значение.Нет ссылок на предыдущие значения.Следовательно, это не может быть скользящим средним для нескольких строк.
Далее, учтите, что общее число итераций цикла - просто intPeriods.k
эффективно начинается с 1, затем считается от 1 до intPeriods.Каждые итерации цикла умножают одно и то же текущее значение .Fields(0)
на текущее значение k.В целом цикл выдает сумму, переписанную следующим образом:
dblTempSum = .Fields(0) * (1 + 2 + 3 + ... + intPeriods)
Это выглядит знакомо?Это должно произойти, поскольку он содержит ту же сумму, что и в dblWeightSum
, как объяснено ранее.
Следовательно, последняя строка кода из приведенного выше фрагмента в итоге уменьшается, как показано ниже ...
arrWMA(i) == dblTempSum / dblWeightSum
== .Fields(0) * (1 + 2 + 3 + ... + intPeriods) / (1 + 2 + 3 + ... + intPeriods)
== .Fields(0)
Значение arrWMA(i)
- это то, что обновляет поле ForecastUnits
в следующем коде.Таким образом, поле, предназначенное для скользящей средней, вместо этого заканчивается исходным одиночным значением из той же строки ... как вы уже видели.
Извините, но я не могу опубликоватьправильный взвешенный код скользящего среднего прямо сейчас.Однако ключ заключается в том, чтобы заменить текущий цикл из приведенного выше фрагмента суммой текущего взвешенного значения минус предыдущая взвешенная сумма.Чтобы сделать это правильно, я думаю, что вам нужен как минимум еще один массив для хранения взвешенной суммы И вы должны вычесть значения из существующей суммы, которые выходят за пределы размера скользящего периода (intPeriod).Для точных шагов просмотрите проверенный алгоритм.