为何Pine Script内置atr函数表现与文档公式不一致?
Pine Script内置ATR函数与手动复现结果差异的原因
核心问题:混淆了TR与ATR的定义
内置atr()函数返回的是真实波幅(TR)序列的RMA(相对移动平均)值,而你手动计算的只是单根K线的TR值,两者完全不是同一个指标:
- 真实波幅(TR):单根K线的瞬时波动幅度,公式为
max(high - low, abs(high - close[1]), abs(low - close[1])),每根K线都对应一个独立的TR值 - ATR:是对TR序列进行指定周期(你用的是22期)的RMA平滑后的结果,反映的是一段周期内的平均波动水平
你的代码错误点
- 第一段代码中使用
high[length]等偏移量,相当于取了22根K线之前的单根TR值,和当前周期的ATR(22期平均波动)没有可比性 - 第二段代码去掉偏移后,得到的是当前K线的TR值,这只是ATR计算的第一步,没有完成后续的RMA平滑步骤,因此和内置
atr()的结果必然差异极大
正确的手动复现代码
要完全复现内置atr()的结果,需要先计算每根K线的TR序列,再对该序列做RMA计算:
length = input(title="ATR Period", type=input.integer, defval=22) // 计算每根K线的真实波幅TR tr = max(high - low, abs(high - close[1]), abs(low - close[1])) // 对TR序列执行RMA平滑,得到手动复现的ATR atr_manual = ta.rma(tr, length) // 对比内置ATR与手动复现结果 plot(atr(length), color=color.blue, title="内置ATR") plot(atr_manual, color=color.red, title="手动复现ATR", style=plot.style_circles)
运行这段代码后,两个指标曲线会完全重合,说明复现正确
内容的提问来源于stack exchange,提问作者stas stas
相关产品推荐
相关产品推荐

