CCI指标计算数值异常求助:Pine Script代码逻辑排查
排查你的CCI指标计算异常问题
我帮你找出了代码里导致CCI数值异常的几个关键问题,咱们一步步来修正:
错误点分析
- 移动平均计算错误:你在计算SMt时,错误地把
ta.sma(mt, length)除以了24,这完全违背了CCI的定义——正确的SMt就是典型价格(mt)的length周期简单移动平均,不需要额外做除法。 - 平均偏差(Mean Deviation)逻辑错误:
你现在的代码只是累加了过去length个周期典型价格的绝对值,这不对!平均偏差应该是每个周期的典型价格与移动平均的差值的绝对值的平均值。
另外你的循环范围只覆盖了length-1个周期,少了当前周期(i=0),导致样本数量不足。 - 冗余计算:你重复定义了
mt和typ,其实它们是同一个值,完全可以复用mt来减少冗余。
修正后的Pine Script代码
indicator('Commodity Channel Index', shorttitle='CCI', overlay=false) length = input.int(24, minval=1) // 典型价格 (Typical Price) mt = (high + low + close) / 3 // 典型价格的简单移动平均 (SMt) smt = ta.sma(mt, length) // 平均偏差 (Mean Deviation) md = 0.0 for i = 0 to length - 1 md += math.abs(mt[i] - smt) md /= length // CCI计算:(典型价格 - 移动平均) / (0.015 * 平均偏差) cci = (mt - smt) / (0.015 * md) plot(cci, color=color.new(color.blue, 0), title='CCI', linewidth=1)
验证说明
修正后的代码完全遵循CCI的官方计算公式:
CCI = (Typical Price - SMA(Typical Price, length)) / (0.015 * Mean Deviation)
其中Mean Deviation是过去length个周期内,每个Typical Price与SMA差值的绝对值的平均值。
这样计算出来的CCI数值就会符合标准指标的范围(通常在-100到+100之间波动,超出则视为超买超卖),不会出现异常值了。
内容的提问来源于stack exchange,提问作者Swann Ashworth
相关产品推荐
相关产品推荐

