如何解决security函数不能使用可变变量作为参数的报错问题
报错原因
Pine Script 中 security() 函数存在限制,不允许传入使用 := 赋值的可变变量作为其第三个参数(即跨周期获取的计算表达式)。你当前代码中的 DIPlus、DIMinus 依赖了逐 bar 迭代计算的平滑可变变量,因此触发该报错。
解决方法
将 DI 相关的完整计算逻辑封装为独立的自定义函数,直接在 security() 的第三个参数位置调用该函数,让指标计算在目标周期的上下文内独立执行,避免引用当前周期的可变变量。
修改后可用代码
//@version=4 study("跨周期ADX获取", overlay=false) res4 = input(title="time frame", type=input.resolution, defval="240") len = input(14) th = input(20) // 封装DI计算逻辑为自定义函数,返回需要的两个DI值 get_di_values(len) => TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 [DIPlus, DIMinus] // 跨周期调用,直接传入函数调用作为参数 [DIPlus4H, DIMinus4H] = security("USDCAD", res4, get_di_values(len)) // 示例:绘制指标 plot(DIPlus4H, color=color.new(color.green, 0), title="+DI 4H") plot(DIMinus4H, color=color.new(color.red, 0), title="-DI 4H")
如果使用的是 Pine Script v5 版本,只需要对应调整输入、函数定义的语法规范即可,核心逻辑完全一致。
内容的提问来源于stack exchange,提问作者cdestatte0
相关产品推荐
相关产品推荐

