为何CCI指标计算公式出错?TradingView结果与本地计算不符
问题原因及解决方法
你的Pine Script代码和Excel/自研程序的sum结果不一致,主要是以下几个原因:
1. SMA的提前计算逻辑差异
TradingView的sma()函数在图表bar数量不足设定的length时,会自动计算已有bar的平均值。比如设置length=10,当图表只有5个bar时,ma会是这5个bar的src平均值;而你的Excel或自研程序可能只在bar数达到10个后才开始计算完整的10期SMA,前期bar不生成有效值,这直接导致了sum结果在前期bar的差异。
2. 数据范围与索引对齐问题
- 确认TradingView和本地计算使用的K线数据完全一致:包括周期(1分钟/1小时等)、起始时间、是否包含未闭合的当前bar(TradingView实时图表会显示未闭合bar,而Excel通常只用已闭合数据)。
- Pine Script中
src[0]是当前bar的数值,src[1]是前一个bar,循环i=0 to length-1取的是**最近length个bar(含当前)**的数值。如果你的本地计算是取前length个已闭合bar(不含当前),sum的计算对象就会不同,结果自然不一致。
3. 精度差异
TradingView的价格数据精度(如小数点后位数)可能和本地数据源不同,累加后误差被放大,也会导致sum结果出现细微差异。
修正后的CCI代码(完全匹配官方公式)
//@version=4 study(title="Commodity Channel Index", shorttitle="CCI", format=format.price, precision=2, resolution="") length = input(10, minval=1) src = input(hlc3, title="Source") // 对应公式中的TP=(High+Low+Close)/3 // 计算n期TP的简单移动平均,仅当bar数足够时生效 ma = bar_index >= length - 1 ? sma(src, length) : na // 计算MDn对应的绝对值总和 sum_abs = 0.0 if bar_index >= length - 1 for i = 0 to length - 1 sum_abs := sum_abs + abs(src[i] - ma) // 计算MDn和最终CCI md = sum_abs / length cci = (src - ma) / (0.015 * md) plot(cci, "CCI", color=#996A15) plot(sum_abs, "Sum of Abs Differences", color=#FF0000) // 用于对比sum结果
内容的提问来源于stack exchange,提问作者Veta STAR
相关产品推荐
相关产品推荐

