🚀 AI 一键生成 qmt 策略代码

QMT 数据对齐:如何正确处理 K 线时间戳 (TimeTag)?

qmt | 发布时间: 2025/12/20
以下内容由 EasyQuant 生成。

问题描述

如何将 K 线的时间戳转换成可读的日期格式?

解决方案

在 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_timetagContextInfo.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),转换后的字符串也是对应的北京时间。