Pine Script编写双超级趋势指标报错:未声明标识符'trend'
修复Pine Script双超级趋势指标的“Undeclared identifier 'trend'”错误
错误原因
你的supertrend函数中,trend变量在赋值语句里提前引用了自身的上一根K线值trend[1],但此时trend还未被声明;同时Pine Script函数内的普通变量不会保留上一根K线的状态,必须用var关键字初始化才能实现状态延续。另外函数内直接使用全局的close[1]会导致传入日线数据时逻辑错误,应该改用传入的src参数的前值。
修复方案
- 用
var关键字在函数内初始化trend变量,确保它能保留上一根K线的数值 - 调整趋势判断逻辑,先获取上一根K线的趋势值(用
nz处理初始空值),再计算当前趋势 - 将函数内的
closeValue = close[1]改为closeValue = src[1],让函数适配不同数据源
修复后的完整代码
//@version=5 indicator("Dual SuperTrend", shorttitle="DST", overlay=true) // Function to calculate SuperTrend supertrend(src, length, multiplier) => var float trend = na // 初始化持久化趋势变量 atrValue = ta.atr(length) upTrend = src + multiplier * atrValue downTrend = src - multiplier * atrValue closeValue = src[1] // 使用传入数据源的前值,而非全局close // 先获取上一根K线的趋势值,处理初始空值 prev_trend = nz(trend[1], upTrend) // 计算当前趋势 if closeValue > prev_trend trend := closeValue > upTrend[1] ? upTrend : downTrend else if closeValue < prev_trend trend := closeValue < downTrend[1] ? downTrend : upTrend else trend := prev_trend // 价格未突破时延续之前的趋势 // 返回趋势线和颜色 [trend, closeValue > trend ? color.new(color.green, 0) : color.new(color.red, 0)] // Fetch daily data using security function dailyClose = request.security(syminfo.tickerid, "D", close) // Calculate SuperTrend with daily data [dailyST, dailyColor] = supertrend(dailyClose, 14, 1.0) // Calculate SuperTrend with chart's timeframe [chartST, chartColor] = supertrend(close, 14, 1.0) // Plot SuperTrend on the chart plot(dailyST, color=dailyColor, title="Daily SuperTrend", linewidth=2) plot(chartST, color=chartColor, title="Chart SuperTrend", linewidth=2)
关键修改说明
var float trend = na:var关键字让变量在指标运行期间只初始化一次,后续K线会保留上一次的赋值,解决了趋势状态延续的问题。closeValue = src[1]:确保当函数处理日线数据时,使用的是日线的前收盘价,而非当前图表时间框架的收盘价,逻辑更准确。- 拆分趋势判断逻辑:把原来的三元表达式拆分为if-else结构,可读性更强,同时避免了未声明变量的问题。
内容的提问来源于stack exchange,提问作者bforblack
相关产品推荐
相关产品推荐

