我的 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 个收盘价:
- 下午 3:00 - 241.30 美元
- 下午 2:59 - 241.01 美元
- 下午 2:58 - 241.04 美元
- 下午 2:57 - 241.01 美元
- 下午 2:56 - 241.00 美元
- 下午 2:55 - 241.15 美元
- 下午 2:54 - 241.47 美元
- 下午 2:53 - 241.35 美元
- 下午 2:52 - 241.61 美元
- 下午 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 方程,但我没能找到它。
任何帮助或想法将不胜感激!
TradingView provide a weighted moving average(WMA) 的财务图表基于一系列过去的股票价格。
我已经编写了一个 C# 方法(如下所示)来计算这些 WMA 值,因此在给定相同股票价格数据的情况下,它们与 TradingView 上的结果完全相同。
测试我的脚本后,我相信我正在正确计算 WMA,并在 another online WMA calculator.
上验证了我的结果我的问题是我的结果与 TradingView 的结果略有不同,通常在每个 WMA 值的小数点后第三位精度上有所不同。
为了给你一个真实的例子,这里有一组 Apple 自 2020 年 4 月 1 日起的 10 个收盘价:
- 下午 3:00 - 241.30 美元
- 下午 2:59 - 241.01 美元
- 下午 2:58 - 241.04 美元
- 下午 2:57 - 241.01 美元
- 下午 2:56 - 241.00 美元
- 下午 2:55 - 241.15 美元
- 下午 2:54 - 241.47 美元
- 下午 2:53 - 241.35 美元
- 下午 2:52 - 241.61 美元
- 下午 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 方程,但我没能找到它。
任何帮助或想法将不胜感激!