You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:33:23