求助解决Pine Script重绘问题:日线区间点位漂移
问题
想在市场开盘时算出日线区间并绘制水平位,初始运行正常,但盘中绘制的高低位会持续漂移,直到收盘才固定为当日高低点。使用request.security函数尝试避免重绘,但因调用的source为series float类型,问题未解决。
涉及代码:
[day_adr, day_adr_high, day_adr_low] = request.security(syminfo.tickerid, 'D', adr_levels(daily_adr_length), barmerge.gaps_on, lookahead=barmerge.lookahead_on)
已参考PineCoders关于security函数避免重绘的英文FAQ,现将该FAQ核心规则翻译如下,并结合你的问题给出解决方案:
PineCoders避免security函数重绘核心规则(翻译)
- 禁用前瞻引用:必须设置
lookahead=barmerge.lookahead_off,前瞻模式会让函数获取当前未完成K线的未来数据,是重绘的主要诱因。 - 仅获取已收盘数据:确保从更高时间框架获取的数据是已收盘的K线结果,而非实时更新的未完成数据。
- 锁定历史计算值:使用
var变量或ta.valuewhen等工具,将关键计算结果固定在特定时点(如开盘时),防止后续K线生成时修改之前的结果。 - 谨慎处理barmerge参数:根据品种特性选择
barmerge.gaps_on或barmerge.gaps_off,避免跳空导致的数据衔接问题。
针对你的问题的解决方案
关闭前瞻引用:将代码中的
lookahead=barmerge.lookahead_on改为lookahead=barmerge.lookahead_off,彻底禁用前瞻数据获取。开盘时锁定区间数值:不要实时获取当日的高低位,而是在新交易日开盘后的第一根K线就计算并固定结果,后续不再更新。使用
var变量存储数值:
// 判断是否进入新交易日(UTC时区,可根据交易品种调整为对应时区) is_new_day = ta.change(time('D')) // 用var变量存储开盘时的ADR区间值,仅在新交易日更新一次 var float locked_adr = na var float locked_adr_high = na var float locked_adr_low = na if is_new_day [locked_adr, locked_adr_high, locked_adr_low] = request.security(syminfo.tickerid, 'D', adr_levels(daily_adr_length), barmerge.gaps_on, lookahead=barmerge.lookahead_off) // 绘制水平位时使用锁定后的变量,而非实时计算的数值 plot(locked_adr_high, "ADR High", color=color.red) plot(locked_adr_low, "ADR Low", color=color.green)
检查
adr_levels函数逻辑:确保该函数仅基于已收盘的日线数据计算区间,比如用前N日的平均波幅推导当日区间,而非直接引用当日实时的high/low。如果函数包含当日实时行情数据,即便修改security参数,数值仍会随盘中行情漂移。调整barmerge参数(可选):若交易品种存在频繁跳空,可将
barmerge.gaps_on改为barmerge.gaps_off,确保数据衔接的一致性。
关键逻辑
重绘的本质是脚本在后续K线生成时,修改了之前K线的计算结果。通过var变量锁定开盘时的初始计算值,配合禁用前瞻引用,就能确保盘中绘制的水平位不再随实时行情漂移,始终保持开盘时的计算结果。
内容的提问来源于stack exchange,提问作者Ajit Shah
相关产品推荐
相关产品推荐

