You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助解决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函数重绘核心规则(翻译)

  1. 禁用前瞻引用:必须设置lookahead=barmerge.lookahead_off,前瞻模式会让函数获取当前未完成K线的未来数据,是重绘的主要诱因。
  2. 仅获取已收盘数据:确保从更高时间框架获取的数据是已收盘的K线结果,而非实时更新的未完成数据。
  3. 锁定历史计算值:使用var变量或ta.valuewhen等工具,将关键计算结果固定在特定时点(如开盘时),防止后续K线生成时修改之前的结果。
  4. 谨慎处理barmerge参数:根据品种特性选择barmerge.gaps_on或barmerge.gaps_off,避免跳空导致的数据衔接问题。

针对你的问题的解决方案
  1. 关闭前瞻引用:将代码中的lookahead=barmerge.lookahead_on改为lookahead=barmerge.lookahead_off,彻底禁用前瞻数据获取。

  2. 开盘时锁定区间数值:不要实时获取当日的高低位,而是在新交易日开盘后的第一根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)
  1. 检查adr_levels函数逻辑:确保该函数仅基于已收盘的日线数据计算区间,比如用前N日的平均波幅推导当日区间,而非直接引用当日实时的high/low。如果函数包含当日实时行情数据,即便修改security参数,数值仍会随盘中行情漂移。

  2. 调整barmerge参数(可选):若交易品种存在频繁跳空,可将barmerge.gaps_on改为barmerge.gaps_off,确保数据衔接的一致性。

关键逻辑

重绘的本质是脚本在后续K线生成时,修改了之前K线的计算结果。通过var变量锁定开盘时的初始计算值,配合禁用前瞻引用,就能确保盘中绘制的水平位不再随实时行情漂移,始终保持开盘时的计算结果。

内容的提问来源于stack exchange,提问作者Ajit Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:05:32