3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
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 线。
你可以通过 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'。