问题描述
解决方案
在 QMT 量化交易平台中,K 线的时间戳通常以毫秒级数值形式存在。要将其转换为可读的日期时间字符串,可以使用平台内置的全局函数 timetag_to_datetime。
以下是具体的实现方法和代码示例。
核心函数说明
timetag_to_datetime(timetag, format)
- 功能:将毫秒时间戳转换成指定格式的日期时间字符串。
- 参数:
timetag(int/float):毫秒级时间戳(例如:1512748800000)。通常通过ContextInfo.get_bar_timetag(index)或ContextInfo.get_tick_timetag()获取。format(str):格式化字符串(例如:'%Y-%m-%d %H:%M:%S')。遵循 Python 标准的strftime格式规范。
- 返回值:字符串 (str)。
代码实现示例
以下策略代码展示了如何在 handlebar 函数中获取当前 K 线的时间戳并将其转换为可读格式:
# -*- coding: gbk -*-
def init(ContextInfo):
# 初始化函数,此处无需特殊设置
pass
def handlebar(ContextInfo):
# 1. 获取当前 K 线的索引位置
index = ContextInfo.barpos
# 2. 获取当前 K 线对应的毫秒级时间戳
# 注意:get_bar_timetag 返回的是毫秒
timetag = ContextInfo.get_bar_timetag(index)
# 3. 使用 timetag_to_datetime 进行转换
# 格式示例 1: 标准日期时间
datetime_str = timetag_to_datetime(timetag, '%Y-%m-%d %H:%M:%S')
# 格式示例 2: 紧凑格式 (常用于文件名或特定数据索引)
compact_str = timetag_to_datetime(timetag, '%Y%m%d')
# 4. 打印结果
print(f"K线索引: {index}")
print(f"原始时间戳: {timetag}")
print(f"转换后时间: {datetime_str}")
print(f"日期格式: {compact_str}")
print("-" * 30)
常用格式化符号参考
在 format 参数中,您可以根据需求组合以下符号:
%Y:4位年份 (2023)%m:月份 (01-12)%d:日期 (01-31)%H:小时 (00-23)%M:分钟 (00-59)%S:秒 (00-59)
Q&A
Q: ContextInfo.get_bar_timetag 和 ContextInfo.get_tick_timetag 获取的时间戳有什么区别?
A: get_bar_timetag(index) 获取的是指定 K 线(Bar)的开始时间或结束时间(取决于周期定义),适用于历史回测或 K 线驱动的策略。get_tick_timetag() 获取的是当前最新分笔(Tick)行情的发生时间,适用于高频或实时盘口策略。两者单位均为毫秒,都可以使用 timetag_to_datetime 进行转换。
Q: 如果我直接使用 Python 的 datetime 库转换可以吗?
A: 可以,但需要注意单位换算。QMT 的时间戳是毫秒,而 Python 标准库 datetime.datetime.fromtimestamp() 通常接受秒。如果使用标准库,需要先将 QMT 的时间戳除以 1000。使用 QMT 内置的 timetag_to_datetime 则无需手动除以 1000,更加方便。
Q: 转换后的时间是北京时间吗?
A: 是的,QMT 平台返回的时间戳通常基于北京时间(CST),转换后的字符串也是对应的北京时间。