Pine Script中security请求设置咨询:如何避免信号重绘?
消除Pine Script重绘的request.security最优设置方案
问题1:布尔语句定义在security外部与内部的差异
两种写法逻辑结果完全一致,仅代码组织方式不同:
- 外部定义变量再传入函数:可读性更强,适合拆分复杂逻辑,方便单独调试变量值;
- 内部直接写布尔表达式:代码更紧凑,适合简单逻辑。
无论哪种写法,函数内的变量(如close、open)都会在request.security指定的目标时间周期上下文里计算,不会使用当前图表周期的数据。
问题2:1分钟图表判断最后1分钟K线是否高于最后5分钟K线开盘价的结果一致性
两种实现方式的最终结果完全一致。
核心逻辑都是获取5分钟周期已闭合K线的开盘价(open[1]),再和1分钟周期已闭合K线的收盘价(close)对比。只要在判断时加上barstate.isconfirmed,确保只在1分钟K线完全闭合后触发判断,就能避免盘中波动导致的信号变化。
问题3:barmerge.gaps_off + barmerge.lookahead_on是否会引发重绘
会引发重绘,问题出在barmerge.lookahead_on:
- 这个参数会让
request.security提前获取目标周期的未闭合K线数据,当目标周期K线还在运行时,数据会随行情实时更新,导致1分钟图表上的信号来回变化(重绘); barmerge.gaps_off仅用于处理数据缺口,和重绘无直接关联。
问题4:不同数据获取方式的结果差异
差异取决于具体的参数设置和判断逻辑:
- 布尔语句外部/内部定义:结果无差异,仅代码结构不同;
barmerge.lookahead参数:lookahead_on:提前获取未闭合数据,信号出现早但必然重绘;lookahead_off:仅获取目标周期已闭合数据,无重绘但信号会延迟(需等目标周期K线闭合);
- 是否使用
barstate.isconfirmed:- 不加:盘中信号会随行情波动变化;
- 加:仅在当前周期K线闭合后确认信号,避免虚假信号。
最优无重绘设置方案
- 必须将
barmerge.lookahead_on改为barmerge.lookahead_off,彻底禁用提前获取未闭合数据的功能; - 在使用
request.security返回的数据触发信号时,配合barstate.isconfirmed,确保只在当前周期K线闭合后执行判断; - 代码组织优先选择可读性高的方式,复杂逻辑拆分到外部变量方便调试。
修正后的无重绘代码示例
// 示例1:无重绘版本 f_get_SR2() => [close>open, close<open[1], open[1]] // 使用lookahead_off禁用提前数据 [M5_Bullish , M5_Ab_Last_Open, m5_Lastopen] = request.security(syminfo.tickerid, '5' , f_get_SR2() , barmerge.gaps_off, barmerge.lookahead_off) // 仅在1分钟K线闭合后判断信号 M5_Ab_Last_Open_Confirmed = close>m5_Lastopen and barstate.isconfirmed // 示例2:无重绘版本 f_get_tf4() => [(k[1]<k[2] or macd[1]<macd[2]) and hist[1]<hist[2], k[1]<k[2]] [TF4_L_SellSig_NR, TF4_lastk_Dn] = request.security(syminfo.tickerid, '60', f_get_tf4(), barmerge.gaps_off, barmerge.lookahead_off) // 无重绘的2%上涨判断 Up_2perc = (close>(open*0.98)) [Hour_Up_2 ] = request.security(syminfo.tickerid, '60', Up_2perc, barmerge.gaps_off, barmerge.lookahead_off) // 仅在K线闭合后开仓 if Hour_Up_2 and barstate.isconfirmed strategy.entry('Long', strategy.long)
内容的提问来源于stack exchange,提问作者Juz
相关产品推荐
相关产品推荐

