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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:05