如何在Pine Script中检查未来时段是否为有效常规交易时段?
在Pine Script中预判休市时段并检查未来K线交易有效性
问题概述
我需要使用box.new()在未来绘制箱体(例如从最后一根K线起3小时开始,延伸10个周期),但部分市场(如外汇)存在休市时段(例:周五16:00至周日16:00),TradingView图表会自动跳过这些时段,未来K线占位符直接从周五16:00跳转到周日16:00。
目前已能通过session.ismarket()检查当前K线是否处于交易时段,但无法直接检查未来K线。理想方案是有类似session.ismarket(timestamp)的方法验证自定义时间戳的有效性,同时需要解决一个已知bug:在休市时段绘制箱体时,仅左边缘会错误显示在后续的有效K线占位符上(如绘制周六08:00-18:00的箱体,实际左边缘会出现在周日16:00的K线位置),因此需要判断未来时间是否为有效交易时段,来调整箱体位置或取消绘制。
解决方案
方法1:通过时间戳映射验证有效交易时段
Pine Script没有直接的session.ismarket(timestamp)函数,但可以通过生成未来时间戳,反向匹配图表的time序列来判断该时段是否有效:
- 先计算目标未来时间戳:基于当前最后一根K线的
time,加上对应周期的时长(单位为毫秒,公式:timeframe.multiplier * 60000,再乘以要跳转的周期数)。 - 检查该时间戳是否存在于
time序列中——TradingView的time序列仅包含有效交易时段的K线时间,不存在则说明处于休市。
示例代码:
//@version=5 indicator("未来交易时段验证", overlay=true) // 定义要跳转的未来周期数 futureStartPeriods = 3 boxLengthPeriods = 10 // 计算箱体起始的未来时间戳 futureStartTime = time + futureStartPeriods * timeframe.multiplier * 60000 // 验证该时间戳是否属于有效交易时段 isValidSession = ta.barssince(time == futureStartTime) != na // 仅在有效时段绘制箱体 if isValidSession box.new( left=bar_index + futureStartPeriods, top=high, right=bar_index + futureStartPeriods + boxLengthPeriods, bottom=low, color=color.new(color.blue, 80) )
方法2:手动编写市场休市规则校验
如果明确目标市场的休市规则,可以直接通过时间戳的星期、小时信息判断是否处于休市:
- 用
dayofweek()、hour()函数提取时间戳对应的日期和小时信息。 - 编写条件判断逻辑,针对特定市场的休市时段进行过滤。
示例代码(针对外汇周五16:00-周日16:00休市):
//@version=5 indicator("手动校验休市时段", overlay=true) // 判断时间戳是否处于外汇休市时段 isInOffHours(ts) => dow = dayofweek(ts) hr = hour(ts) (dow == dayofweek.friday and hr >= 16) or dow == dayofweek.saturday or (dow == dayofweek.sunday and hr < 16) // 计算箱体起始的未来时间戳 futureStartTime = time + 3 * timeframe.multiplier * 60000 // 验证是否为有效交易时段 isValid = not isInOffHours(futureStartTime) // 仅在有效时段绘制箱体 if isValid box.new( left=bar_index + 3, top=high, right=bar_index + 13, bottom=low, color=color.new(color.red, 80) )
方法3:跨周期数据验证
通过request.security()请求更高时间框架的K线数据,间接判断未来时段是否存在有效交易K线:
- 例如当前为1小时周期,请求4小时周期的未来K线时间,若对应时段无数据,则说明处于休市。
关键注意事项
- 方法1的可靠性完全依赖TradingView的
time序列,该序列自动跳过休市时段,因此不存在的时间戳必然对应休市。 - 方法2需要针对不同市场编写定制化规则,通用性较弱,但灵活性更高。
- 通过
isValid条件控制box.new()的执行,可以避免休市时段箱体仅显示左边缘的bug。
内容的提问来源于stack exchange,提问作者Jona Rodrigues
相关产品推荐
相关产品推荐

