如何在PineScript中获取bar_index+1对应的时间(支持休市场景)
在PineScript中跨休市获取下一根K线时间的方法
你当前使用的time + ta.change(time)仅能计算连续K线的时间差,无法识别交易所休市导致的时间跳变场景。以下是两种可靠的实现方案:
方法一:用request.security直接获取(推荐)
这是准确率最高的方式,request.security会自动适配当前品种的交易时段、休市规则,直接返回下一根K线的时间:
//@version=5 indicator("获取下一根K线时间", overlay=true) // 获取下一根bar的时间:针对实时最后一根bar取当前time,历史bar取下一根的time nextBarTime = request.security(syminfo.tickerid, timeframe.period, time[barstate.islast ? 0 : -1]) // 实时最后一根bar显示下一根时间 if barstate.islast label.new(bar_index, high, str.tostring(nextBarTime, "yyyy-MM-dd HH:mm"), color=color.blue)
原理说明
syminfo.tickerid指定当前交易品种,timeframe.period沿用当前图表周期- 实时行情的最后一根bar,
time[0]就是即将生成的下一根bar时间;历史bar则通过time[-1]获取下一根的实际时间 - 自动跳过周末、每日休市时段,比如周五收盘的最后一根bar,返回的会是周一开盘时间
方法二:自定义交易时段计算(特殊场景用)
如果需要手动控制交易规则(比如自定义开盘/收盘时间),可以通过日期和时段判断来计算:
//@version=5 indicator("自定义时段计算下一根K线时间", overlay=true) // 定义自定义交易时段:开盘03:00,收盘18:55 openH = 3 openM = 0 closeH = 18 closeM = 55 // 解析当前bar的时间信息 currTime = time currY = year(currTime) currM = month(currTime) currD = dayofmonth(currTime) currHour = hour(currTime) currMin = minute(currTime) // 计算下一个交易日 nextD = currD nextY = currY nextM = currM // 周五则直接跳3天到周一 if dayofweek(currTime) == dayofweek.friday nextD += 3 else nextD += 1 // 处理月份/年份进位 if nextD > ta.daysinmonth(currY, currM) nextD -= ta.daysinmonth(currY, currM) nextM += 1 if nextM > 12 nextM = 1 nextY += 1 // 判断是否为当日最后一根bar isDailyLastBar = currHour == closeH and currMin == closeM // 计算下一根时间 nextBarTime = na if isDailyLastBar // 当日收盘,下一根为次日开盘时间 nextBarTime = timestamp(nextY, nextM, nextD, openH, openM) else // 非收盘时段,用常规周期差计算 nextBarTime = currTime + ta.change(time) // 实时最后一根bar显示结果 if barstate.islast label.new(bar_index, high, str.tostring(nextBarTime, "yyyy-MM-dd HH:mm"), color=color.red)
注意事项
- 自定义方法需要提前明确品种的交易时段、周末规则,若要处理节假日还需额外添加判断逻辑
- 灵活性高但维护成本大,仅适合非标准交易时段的特殊场景
内容的提问来源于stack exchange,提问作者TheFieryTortoise
相关产品推荐
相关产品推荐

