求助修正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
相关产品推荐
相关产品推荐

