🚀 AI 一键生成 qmt 策略代码

QMT 交易时间模拟运行 get_market_data_ex 获取 K 线少一根是怎么回事?

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

交易时间模拟运行,get_market_data_ex获取的K线少一根是什么原因?

策略模拟运行模式,取小时K线,在交易时间获取的就会少一根,现在盘后了再运行,就能得到预期的数量,请问这是为什么?因为最后一根K还没走完?

解决方案

您的猜测非常准确!在 QMT 平台的模拟运行或实盘运行模式下,盘中调用 get_market_data_ex 获取 K 线数据时“少一根”,核心原因正是因为当前周期的最后一根 K 线尚未走完(未闭合)

以下是详细的机制解释以及相应的解决方法:

1. 为什么盘中会少一根 K 线?

  • 历史数据与实时数据的差异:QMT 底层的数据存储机制中,历史 K 线数据通常是指已经走完并闭合的 K 线。在交易时间(盘中),当前正在进行的小时 K 线(或日线、分钟线)处于不断接收 Tick 数据并动态更新的状态,尚未作为一条完整的历史记录“落盘”。
  • 盘后数据的完整性:当交易时间结束(盘后),最后一根 K 线彻底闭合,系统会将其写入历史数据库。因此,您在盘后再次运行策略时,就能获取到包含最后一根在内的预期数量的 K 线。

2. 如何在盘中获取包含最新状态的完整数据?

如果您在策略逻辑中,必须在盘中获取包含当前未走完 K 线的最新状态(例如需要最新的收盘价/最新价来计算实时指标),可以通过以下几种方式解决:

方法一:确保开启数据订阅 (subscribe=True)

在使用 get_market_data_ex 时,确保 subscribe 参数为 True(该参数默认为 True)。开启订阅后,系统会尝试将最新的实时行情推送到数据集中。

data = ContextInfo.get_market_data_ex(
    fields=['open', 'high', 'low', 'close'], 
    stock_code=['000300.SH'], 
    period='1h', 
    count=10, 
    subscribe=True # 确保开启订阅
)

方法二:结合实时 Tick 数据手动拼接(推荐用于高精度计算)

如果 get_market_data_ex 依然无法满足对当前未闭合 Bar 的实时性要求,最严谨的做法是:获取已闭合的历史 K 线,然后通过 get_full_tick 获取当前最新的 Tick 数据,将最新价(lastPrice)作为当前未闭合 K 线的 close 价格进行逻辑计算。

def handlebar(ContextInfo):
    # 1. 获取历史已闭合的 K 线
    hist_data = ContextInfo.get_market_data_ex(['close'], ['000300.SH'], period='1h', count=10)
    
    # 2. 获取当前最新的 Tick 数据
    tick_data = ContextInfo.get_full_tick(['000300.SH'])
    
    if '000300.SH' in tick_data:
        latest_price = tick_data['000300.SH']['lastPrice']
        # 将 latest_price 作为当前未闭合 Bar 的最新价参与您的策略计算
        # ...

方法三:利用 handlebar 的驱动机制

在实盘/模拟盘中,handlebar 是由行情 Tick 驱动的。您可以通过 ContextInfo.is_last_bar() 判断当前是否运行到了最新的一根 K 线。在最新 K 线上,您可以直接使用 ContextInfo.get_market_dataContextInfo.get_market_data_ex 获取当前时间点的数据切片。

总结

盘中少一根 K 线是量化平台处理**“已闭合历史数据”“未闭合实时数据”**时的正常现象。理解这一机制后,您可以根据策略对实时性的要求,选择依赖订阅机制或手动结合 Tick 数据来完善您的策略逻辑。