TradingView Pine Script security函数if内调用报错修复方案
问题修复方案
错误原因
Pine Script明确限制security()、financial()这类全局计算函数不能在if、for等分支/循环代码块内调用,这类函数需要在每根K线的全局上下文完成计算,条件分支会破坏其计算逻辑导致报错。
修复思路
将security()调用移到全局作用域预先计算,再通过三元运算符根据判断条件选择对应取值即可,无需把函数调用放到if分支内。
修复后完整代码
var float close_lock = na var float open_lock = na var float high_lock = na var float low_lock = na var bool normal_ticker_check = syminfo.type != 'spread' // 全局预先计算security取值,不放在if块内 _sec_close = security(syminfo.prefix+":"+syminfo.ticker , timeframe.period , close ,barmerge.gaps_off, barmerge.lookahead_on) _sec_open = security(syminfo.prefix+":"+syminfo.ticker , timeframe.period , open ,barmerge.gaps_off, barmerge.lookahead_on) _sec_high = security(syminfo.prefix+":"+syminfo.ticker , timeframe.period , high ,barmerge.gaps_off, barmerge.lookahead_on) _sec_low = security(syminfo.prefix+":"+syminfo.ticker , timeframe.period , low ,barmerge.gaps_off, barmerge.lookahead_on) // 用三元运算符替代if分支完成赋值 close_lock := normal_ticker_check ? _sec_close : close open_lock := normal_ticker_check ? _sec_open : open high_lock := normal_ticker_check ? _sec_high : high low_lock := normal_ticker_check ? _sec_low : low
改动说明
- 把原if块内的4个
security()调用全部移到全局作用域预先计算,存储到临时变量中 - 去掉原if/else分支逻辑,改用三元运算符
条件 ? 符合条件取值 : 不符合条件取值完成变量赋值,逻辑和原代码完全一致,同时符合Pine Script语法要求 - 优化了
normal_ticker_check的赋值逻辑,直接在var定义时赋值,无需重复计算
内容的提问来源于stack exchange,提问作者rohan sawant
相关产品推荐
相关产品推荐

