如何修复Pine4转Pine5时'obv'已定义的转换报错
报错根因
Pine Script v5 已内置官方OBV(能量潮)指标实现,内置函数的标识符就是obv(完整调用路径为ta.obv)。自动转换工具在处理v4脚本时,会优先加载v5的内置标识符,此时脚本中第16行自定义的同名obv变量就会和内置函数重名,触发'obv' is already defined报错,报错提示里提到的第10行是转换工具的行号映射偏差,和该行代码本身无关。
修复步骤
- 替换v4旧语法为v5规范:将
study()替换为indicator(),旧版input类型声明、所有内置技术指标函数都要适配v5的命名空间规则,移除废弃的transp透明度参数,改用color.new()控制颜色透明度。 - 解决重名冲突,两种方式二选一即可:
- 直接调用v5内置
ta.obv()函数替换自定义计算逻辑(计算结果和原脚本完全一致,是官方推荐写法) - 若要完全保留自定义计算逻辑,把自定义的
obv变量重命名为其他名称(例如obv_val),再同步替换脚本中所有引用该变量的位置。
- 直接调用v5内置
修复后可直接运行的Pine v5完整代码
//@version=5 //On Balance Volume by everget, Oct 29, 2018 //Copyright (c) 2018-present, Alex Orekhov (everget) //On Balance Volume script may be freely distributed under the MIT license. indicator("On Balance Volume", shorttitle="OBV", precision=0) showSignal = input.bool(title="Show Signal ?", defval=true) signalType = input.string(title="Signal Smoothing Type", defval="SMA", options=["EMA", "SMA"]) signalLength = input.int(title="Signal Smoothing Length", defval=21) highlightCrossovers = input.bool(title="Highlight Crossovers ?", defval=false) applyFilling = input.bool(title="Apply Ribbon Filling ?", defval=true) src = input.source(title="Source", defval=close) // 调用v5内置OBV函数,若要保留自定义计算可替换为 obv_val = ta.cum(math.sign(ta.change(src)) * volume) obv = ta.obv(src) ema_1 = ta.ema(obv, signalLength) sma_1 = ta.sma(obv, signalLength) signal = signalType == "EMA" ? ema_1 : sma_1 trendColor = obv > signal ? #0ebb23 : color.red obvColor = applyFilling ? trendColor : #0094ff signalColor = applyFilling ? trendColor : #ff6a00 obvPlot = plot(obv, title="OBV", linewidth=2, color=obvColor) signalPlot = plot(showSignal ? signal : na, title="Signal", color=signalColor) transparent = color.new(color.white, 100) fillColor = applyFilling ? trendColor : transparent fill(obvPlot, signalPlot, color=color.new(fillColor, 70)) plotshape(ta.crossover(obv, signal) and highlightCrossovers ? obv : na, title="Crossover", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0)) plotshape(ta.crossunder(obv, signal) and highlightCrossovers ? obv : na, title="Crossunder", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
注:如果要完全沿用原脚本的自定义计算逻辑,只需要把代码中
obv = ta.obv(src)这一行替换为注释里写的obv_val = ta.cum(math.sign(ta.change(src)) * volume),再把后面所有用到obv的变量引用替换成obv_val即可,运行效果和原v4脚本完全一致。
内容的提问来源于stack exchange,提问作者Help3924
相关产品推荐
相关产品推荐

