我的 C# 加权移动平均结果与 TradingView 的结果不同,TradingView 如何计算 WMA?

My C# Weighted Moving Average result is different than TradingView's, how does TradingView calculate WMA?

TradingView provide a weighted moving average(WMA) 的财务图表基于一系列过去的股票价格。

我已经编写了一个 C# 方法(如下所示)来计算这些 WMA 值,因此在给定相同股票价格数据的情况下,它们与 TradingView 上的结果完全相同。

测试我的脚本后,我相信我正在正确计算 WMA,并在 another online WMA calculator.

上验证了我的结果

我的问题是我的结果与 TradingView 的结果略有不同,通常在每个 WMA 值的小数点后第三位精度上有所不同。

为了给你一个真实的例子,这里有一组 Apple 自 2020 年 4 月 1 日起的 10 个收盘价:

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

它们通过 "Prices" 对象进入我的脚本(它可以包含比实际需要更多的价格值,因此额外的 '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 松函数 returns 241.16324727

0.00052 的差别很小 ...但这对我来说是个大问题,因为我将这个结果用于其他数学运算,差异被放大,因此无法使用。

我无法找到差异的解释,这让我陷入停顿。

我怀疑这是 Pine 中的舍入错误,因为他们的 user manual 指定:

The internal precision of floats in Pine is 1e-10

我从 TradingView 或 Pine 找到的唯一 documentation 关于他们计算 WMA 的确切方法似乎完全符合我的脚本,所以我没有想法并正在寻求帮助。希望我只是遗漏了一些明显的东西!

我最好的猜测是 Pine 有一个替代的 WMA 方程,但我没能找到它。

任何帮助或想法将不胜感激!

计算见v4 refman:https://www.tradingview.com/pine-script-reference/v4/#fun_wma