问题描述
请求的是6月7号上午,返回的是6月6号下午,还没有错误信息,就算我写校验,那如果返回来的永远是错的也没意义啊?
所以应该怎么正确请求“批量实时分钟k线”?文档没找到
解决方案
为什么 get_market_data 会拿到旧数据?
在 QMT 平台中,你遇到的“请求今天上午的数据却返回昨天下午的数据”的问题,根本原因在于 get_market_data 接口的底层机制主要依赖于本地数据缓存。如果你的客户端没有实时接收到最新的行情包,或者本地数据没有及时刷新,该接口就会直接返回本地数据库中最后一条可用的数据(即昨天下午的数据),且不会报错。
官方文档已经明确指出:
ContextInfo.get_market_data该接口已不建议使用,建议使用ContextInfo.get_market_data_ex。
正确的替代方案:使用 get_market_data_ex
为了解决缓存不同步和批量获取实时数据的问题,QMT 提供了升级版的接口 get_market_data_ex。这个接口增加了一个非常关键的参数:subscribe=True。
当 subscribe=True 时,接口不仅会读取本地数据,还会主动向服务器订阅缺失的数据,从而保证你拿到的是最新的实时 K 线。
如何正确请求“批量实时分钟K线”?
你可以通过 get_market_data_ex 接口,传入股票列表和周期参数(如 '1m')来实现批量获取。以下是标准的 Python 代码示例:
#coding:gbk
def init(ContextInfo):
# 设置你需要批量获取的股票池
ContextInfo.set_universe(['000001.SZ', '600000.SH', '000300.SH'])
def handlebar(ContextInfo):
# 确保只在最新的 K 线上执行,避免历史回测时重复打印
if not ContextInfo.is_last_bar():
return
# 获取股票池
stock_list = ContextInfo.get_universe()
# 批量获取实时 1 分钟 K 线数据
# count=1 表示获取最新的一根 K 线,如果需要多根可以设置为更大的数值
# subscribe=True 是关键,确保数据实时更新
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=stock_list,
period='1m',
start_time='',
end_time='',
count=1,
dividend_type='none',
fill_data=True,
subscribe=True
)
# 打印返回的数据
for code, df in data.items():
print(f"股票代码: {code}")
print(df)
参数详解:
fields: 需要获取的字段列表,如['open', 'high', 'low', 'close']。stock_code: 股票代码列表,支持批量传入多个代码。period: 周期,分钟线可以填'1m','5m','15m'等。count: 获取的数据条数。-1表示不限制,1表示只取最新的一根。subscribe: 必须设置为True。设置为False时不做数据订阅,只读取本地已有数据(这就会导致你之前遇到的缓存问题)。
额外注意事项:
- 盘前数据补充:虽然
subscribe=True会订阅实时数据,但如果你需要获取较长周期的历史分钟线(比如count=1000),请务必在每天开盘前通过 QMT 客户端的【数据管理】手动或自动补充一次分钟线数据,以保证本地基础数据的完整性。 - 时间格式:如果你需要指定
start_time和end_time,请使用'YYYYMMDDHHMMSS'格式,例如'20230607093000'。