Pine Script 3转5报错:未声明标识符SmoothedTrueRange,如何解决?
Pine Script 3转5的错误修复方案
你遇到的Undeclared identifier SmoothedTrueRange错误,核心原因是Pine Script 5是强类型语言,要求变量必须先声明才能使用,而你原Pine Script 3的代码直接使用未声明的变量进行赋值,这在v5里不被允许。
具体修改步骤:
- 用
var float声明三个平滑计算的变量,var关键字确保变量仅在脚本首次运行时初始化一次,后续K线会保留上一次的值,和你原代码的逻辑完全一致。 - 声明完成后,再用
:=更新变量值,保留原有的平滑计算逻辑不变。
修正后的完整代码:
//@version=5 indicator("转换后的DM/ATR计算", overlay=false) len = input.int(14, title="周期长度") // 补充len变量定义,原代码中应存在该变量,避免新的未声明错误 TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0 // 先声明三个平滑变量,初始值设为0 var float SmoothedTrueRange = 0.0 var float SmoothedDirectionalMovementPlus = 0.0 var float SmoothedDirectionalMovementMinus = 0.0 // 更新变量值,保留原计算逻辑 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus // 可选:输出变量查看结果 plot(SmoothedTrueRange, color=color.blue, title="平滑真实波幅") plot(SmoothedDirectionalMovementPlus, color=color.green, title="+DI平滑值") plot(SmoothedDirectionalMovementMinus, color=color.red, title="-DI平滑值")
额外说明:
- 补充了
len变量的输入定义,原代码中应该存在这个变量,否则会触发新的未声明错误。 - 完全保留了你原有的平滑计算逻辑(类RMA算法),确保转换后脚本的计算结果和原Pine Script 3版本一致。
内容的提问来源于stack exchange,提问作者Hadi Sharghi
相关产品推荐
相关产品推荐

