Мой результат C# Weighted Moving Average отличается от результата TradingView. Как TradingView рассчитывает WMA?

Финансовые графики в TradingView содержат значение взвешенной скользящей средней (WMA), основанное на ряде прошлых цен на акции.

Я написал метод C# (показанный ниже) для расчета этих значений WMA, чтобы они были точно такими же, как результаты в TradingView, с учетом тех же данных о ценах на акции.

После тестирования моего скрипта я поверил, что вычисляю WMA правильно, и проверил свои результаты на еще один онлайн-калькулятор WMA.

Моя проблема в том, что мои результаты немного отличаются от результатов TradingView, обычно отличаясь точностью до третьего десятичного знака для каждого значения WMA.

Чтобы дать вам реальный пример, вот набор из 10 цен закрытия для Apple с 1 апреля 2020 года:

  1. 3:00 PM - $241.30
  2. 2:59 PM - $241.01
  3. 2:58 PM - $241.04
  4. 2:57 PM - $241.01
  5. 2:56 PM - $241.00
  6. 2:55 PM - $241.15
  7. 2:54 PM - $241.47
  8. 2:53 PM - $241.35
  9. 2:52 PM - $241.61
  10. 2:51 PM - $241.57

Они входят в мой скрипт через объект «Цены» (который может содержать больше ценовых значений, чем на самом деле необходимо, поэтому дополнительные параметры «startIndex» и «howManyPeriods»):

 public static decimal WeightedMovingAverage(Prices prices, int startIndex = 0, decimal howManyPeriods = -1)
    {
        // Get the correct number of periods
        if (howManyPeriods < 1) howManyPeriods = prices.Count - startIndex;

        // Loop through calculations for the WMA
        decimal numerator = 0, denominator = 0;
        for (int i = 0; i < howManyPeriods; i++)
        {
            Price price = prices[i + startIndex];
            numerator += price.Value * (howManyPeriods - i);
            denominator += i + 1;
        }
        return numerator / denominator;
    }

В этом примере эти 10 значений дают результат WMA 241,16272727.

Функция TradingView wma Pine возвращает 241.16324727

Это небольшая разница 0,00052 ... но для меня это большая проблема, потому что я использую этот результат для других математических операций, и разница становится увеличенной и, следовательно, непригодной для использования.

Я не могу найти объяснение этой разнице, и это привело меня в ступор.

Я сомневаюсь, что в Pine это ошибка округления, поскольку их руководство пользователя указывает:

Внутренняя точность поплавков в Pine составляет 1e-10.

Единственная документация, которую я нашел на TradingView или Pine о том, как именно они считают, что их WMA идеально соответствует моему сценарию, поэтому у меня нет идей, и я ищу помощи. Надеюсь, я просто пропустил что-то очевидное!

Я думаю, что у Pine есть альтернативное уравнение WMA, но я не смог его найти.

Будем признательны за любую помощь или идеи!


person pedroballgame    schedule 02.04.2020    source источник


Ответы (1)


См. расчет версии 4: https://www.tradingview.com/pine-script-reference/v4/#fun_wma

person PineCoders-LucF    schedule 03.04.2020
comment
Это было то, что я искал, большое спасибо за ответ. Оказалось, что мой скрипт соответствует формуле TradingView, поэтому я обнаружил, что проблема в том, что данные TradingView имеют более высокую точность, чем я ожидал или мог увидеть, поэтому 3 из 10 моих тестовых цен были округлены до 2 разрядов вместо 4. С тех пор я обнаружил, что в TradingView, чтобы отображать более точные цены акций. - person pedroballgame; 04.04.2020
comment
Pine использует внутренние поплавки IEEE 754-1985. - person PineCoders-LucF; 04.04.2020