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

TradingView Pine Script自定义时段最后K线检测异常

异常产生原因

原代码存在两处核心逻辑缺陷,在节假日早收盘场景下会触发误判:

  • 时间比对基准混乱:代码中用来匹配的hour、minute、second内置变量,返回的是当前图表设置时区的时间,而非函数传入的自定义会话时区(本例为UTC-4)的时间,时区偏移会直接导致时间匹配错位。
  • 缓存校验逻辑缺失:原代码仅缓存上一次检测到的会话结束bar的时分秒值,既没有绑定对应的交易日信息,也没有排除盘中临时休市、节假日提前收盘的异常场景:
    1. 2022年7月5日是美国独立日(7月4日)的补休交易日,COMEX黄金(GC1!)当日常规交易提前90分钟收盘,并未交易到UTC-4 16:00。
    2. 当日收盘时,原代码检测到「当前bar不在会话内、前一根bar在会话内」,就会把提前收盘时点的最后一根K线时间,错误缓存为通用的「会话最后一根K线时间」。
    3. 后续恢复正常交易的交易日中,代码不会校验当前bar所属的交易日期、也不会校验当前是否真的到达常规会话的结束边界,只要bar的时分秒和之前缓存的错误值匹配,就会误判为时段最后一根K线,最终出现比预期15:45提前90分钟标红的问题。
    4. 除了节假日早收盘,期货盘中休市、行情临时中断等场景,也会触发同样的缓存错误,导致后续识别持续偏移。
修正方案

修正时需要统一时间基准、改用时间戳做全量匹配、增加休市场景过滤,修正后代码如下:

//@version=5
indicator("last session bar fixed",overlay = true)

IsLastBarSession(sessionTime, sessionTimeZone=syminfo.timezone) =>
    // 统一基于传入的会话时区计算会话时间,不受图表时区设置干扰
    sessionTs = time(timeframe.period, sessionTime, sessionTimeZone)
    inSession = not na(sessionTs)
    // 缓存完整时间戳而非仅时分秒,避免跨交易日、跨时段误匹配
    var int lastSessionBarTs = na
    // 增加连续会话校验,排除盘中临时休市、短时间中断导致的错误缓存
    if not inSession and inSession[1] and inSession[2]
        lastSessionBarTs := sessionTs[1]
    
    // 当前bar会话时间戳与缓存的最后bar时间戳完全一致时,判定为时段最后K线
    sessionTs == lastSessionBarTs

// 为UTC-4时区09:30-16:00时段的最后一根K线绘制红色背景
bgcolor(IsLastBarSession("0930-1600", "UTC-4") ? 
     color.new(color.red, 80) : na)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:57:19