问题描述
index = ContextInfo.barpos
realtimetag = ContextInfo.get_bar_timetag(index)
返回的都是错误时间, 不是设置的回测时间
解决方案
在 QMT 平台的分钟级别回测模式下,您使用 ContextInfo.get_bar_timetag(index) 获取到的其实并不是“错误时间”,而是一个 13位的毫秒级时间戳(例如 1512748800000)。如果您直接打印或使用这个数值,它看起来并不像标准的时间格式。
要获取正确且可读的当前 K 线时间,您需要结合 QMT 提供的内置时间转换函数 timetag_to_datetime(),将毫秒时间戳转换为标准的日期时间字符串。
正确获取并转换时间的方法
请在您的 handlebar 函数中使用以下代码结构:
#coding:gbk
def init(ContextInfo):
# 设置回测的股票池和时间等
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 1. 获取当前 K 线的索引
index = ContextInfo.barpos
# 2. 获取当前 K 线对应的毫秒级时间戳
realtimetag = ContextInfo.get_bar_timetag(index)
# 3. 将毫秒时间戳转换为可读的日期时间格式(例如:YYYY-MM-DD HH:MM:SS)
current_time = timetag_to_datetime(realtimetag, '%Y-%m-%d %H:%M:%S')
# 打印输出查看正确的时间
print(f"当前K线索引: {index}, 对应时间: {current_time}")
核心函数解析
-
ContextInfo.get_bar_timetag(index)- 释义:获取当前 K 线对应时间的时间戳。
- 返回:
number(毫秒级时间戳)。
-
timetag_to_datetime(timetag, format)- 释义:将毫秒时间转换成日期时间字符串。
- 参数:
timetag:毫秒时间戳(即上一步获取的realtimetag)。format:格式字符串,如'%Y-%m-%d %H:%M:%S'或'%Y%m%d %H:%M:%S'。
- 返回:
str(格式化后的时间字符串)。
注意事项
- 分钟级别回测时,
handlebar会在每一根分钟 K 线上触发一次,转换后的时间即为该分钟 K 线的具体时间。 - 如果您需要提取特定的小时或分钟进行逻辑判断(例如判断是否在 14:55 之后),可以将 format 设置为
'%H%M%S',然后转换为整数进行比较:int_time = int(timetag_to_datetime(realtimetag, '%H%M%S')) if int_time >= 145500: print("临近尾盘")