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

求助修正PineScript V2转V5后的脚本错误

PineScript v2转v5脚本修复方案

错误分析与修复

1. 自定义函数无法引用自身历史值

原脚本中ssFilter函数内的filt变量直接调用filt[1]、filt[2]获取历史值,但Pine Script v5的自定义函数是无状态的,无法保留历史计算结果,会触发编译错误。

修复方式:在函数内部用var关键字声明变量,专门存储前两次的滤波结果,以此维护函数的状态。

2. 除以0导致的无效值错误

当行情横盘时,highestRef与lowestRef数值相等,计算bullVector和bearVector的分母为0,会产生NaN无效值。

修复方式:用nz()函数给分母设置默认值1,避免出现除以0的情况。

修复后的完整代码

//@version=5
indicator(title="TESTING 1", shorttitle="TESTING 1", precision=0 )

src = close
vectorLen = input(34)
dispBull = input(false)
dispBear = input(false)
dispBullvsBear = input(true)
OS = -70.4
OB = 70.4

lowerBand = 10
PI = 3.14159265358979

ssFilter(price, lowerBand) =>
    angle = math.sqrt(2) * PI / lowerBand
    a1 = math.exp(-angle)
    b1 = 2 * a1 * math.cos(angle)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    
    // 用var变量保存历史滤波结果,维护函数状态
    var float filt_prev1 = na
    var float filt_prev2 = na
    
    filt = c1 * (price + nz(price[1])) / 2 + c2 * nz(filt_prev1) + c3 * nz(filt_prev2)
    
    // 更新历史变量
    filt_prev2 := filt_prev1
    filt_prev1 := filt
    filt

highestRef = ta.highest(src, vectorLen) 
lowestRef = ta.lowest(src, vectorLen)

// Bull Vector - 处理除以0的情况
bullVector = (src - lowestRef) * 100 / nz(highestRef - lowestRef, 1)
ssBullVector = ssFilter(bullVector, lowerBand)
bullVectorColor = ta.change(ssBullVector) >= 0 ? color.lime : color.green
plot(dispBull ? ssBullVector * 2 - 100 : na, color = bullVectorColor, linewidth = 2)

// Bear Vector - 处理除以0的情况
bearVector = (highestRef - src) * 100 / nz(highestRef - lowestRef, 1)
ssBearVector = ssFilter(bearVector, lowerBand)
bearVectorColor = ta.change(ssBearVector) >= 0 ? color.red : color.maroon
plot(dispBear ? ssBearVector * 2 - 100 : na, color = bearVectorColor, linewidth = 2)

bullVSbear = bullVector - bearVector
ssBullVSBear = ssFilter(bullVSbear, lowerBand)

bullVSBearHist = ta.change(ssBullVSBear, 1)
plot(dispBullvsBear ? ssBullVSBear : na, linewidth = 2, color = bullVSBearHist >= 0 ? color.green : color.red)
top = hline(110, color = color.red, linestyle = line.style_dotted)
bottom = hline(-110, color = color.lime, linestyle = line.style_dotted)
obLvl = hline(OB, color = color.red, linestyle = line.style_dotted)
hline(0, color = color.gray, linestyle = line.style_dotted)
osLvl = hline(OS, color = color.lime, linestyle = line.style_dotted)
fill(obLvl, top, color = color.red, transp = 80)
fill(osLvl, bottom, color = color.lime, transp = 80)

修复细节说明

  • 函数状态问题:通过var float filt_prev1和var float filt_prev2存储前两次的滤波结果,每次计算后更新这两个变量,替代原脚本中直接引用filt[1]、filt[2]的写法,符合v5的函数规则。
  • 除以0问题:在计算bullVector和bearVector时,用nz(highestRef - lowestRef, 1)确保分母不会为0,避免产生NaN值。

内容的提问来源于stack exchange,提问作者LJ2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:32:10