问题描述
用下面代码
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_time 和 end_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)
总结:请首先修正代码中 5m 和 15m 不一致的问题,然后确保在【数据管理】中或通过代码将对应周期的历史数据补充完整,夜盘数据即可正常获取。