🚀 AI 一键生成 qmt 策略代码

为什么QMT获取不到期货夜盘K线数据?

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

问题描述

期货为什么下载不了夜盘数据?

用下面代码
xtdata.download_history_data2(code, '5m', start_time='20250120143000', end_time='', incrementally=None)
df = xtdata.get_market_data_ex(stock_list=A.STOCK_LIST, period='15m', start_time='20250122141500',
end_time='')

取不到夜盘的 k 线数据,日盘数据里也只有一个 close 值,请问这是为什么?

解决方案

在 QMT 平台中获取期货夜盘数据失败,或者发现 K 线数据不完整(如只有一个 close 值),通常是由以下几个原因导致的:

1. 下载周期与读取周期不匹配(最常见原因)

观察您提供的代码:

xtdata.download_history_data2(code, '5m', ...)
df = xtdata.get_market_data_ex(..., period='15m', ...)

您**下载的是 5m(5分钟)的数据,但读取的是 15m(15分钟)**的数据。QMT 的本地数据是按周期分别存储的,如果您没有提前下载 15m 的数据,本地数据库中就没有完整的 15 分钟 K 线,从而导致读取不到数据或数据字段缺失(只返回最新缓存的 close 值)。

解决方法:保持下载和读取的周期一致,或者先下载 15m 数据。

2. 期货夜盘的“交易日”归属问题

在国内期货市场规则中,夜盘(通常为 21:00 至次日凌晨)属于下一个交易日的第一节。例如,1月20日晚上的夜盘,在数据记录上属于 1月21日 的行情。
如果您在请求数据时,时间范围(start_timeend_time)设置得过于严格,可能会因为交易日归属的错位而漏掉夜盘数据。

3. 字段未完全指定或本地数据缺失

如果本地数据未下载完整,或者在调用 get_market_data_ex 时未指定 fields,在某些情况下可能只会返回默认的收盘价。


正确的代码示例

如果您使用的是独立版 xtdata

请确保下载和读取的周期完全一致,并指定需要的字段:

# 1. 下载 15分钟 数据
xtdata.download_history_data2(code, '15m', start_time='20250120143000', end_time='') 

# 2. 读取 15分钟 数据,建议明确指定 fields
df = xtdata.get_market_data_ex(
    fields=['open', 'high', 'low', 'close', 'volume'], 
    stock_list=A.STOCK_LIST, 
    period='15m', 
    start_time='20250122141500', 
    end_time=''
)
print(df)

如果您使用的是 QMT 内置策略(ContextInfo):

在 QMT 客户端内部编写策略时,建议使用 ContextInfo.get_market_data_ex,它支持自动订阅和本地数据读取:

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    # 获取 15分钟 K线数据
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close', 'volume'], 
        stock_code=['IF00.IF'], # 替换为您的期货代码
        period='15m',
        start_time='20250120143000', 
        end_time='', 
        count=-1,
        subscribe=True # 开启订阅,确保获取最新数据
    )
    print(data)

总结:请首先修正代码中 5m15m 不一致的问题,然后确保在【数据管理】中或通过代码将对应周期的历史数据补充完整,夜盘数据即可正常获取。