3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
针对您在使用 QMT 平台 get_market_data_ex 函数时遇到的数据获取为空的问题,以下是详细的解答和排查指南:
get_market_data_ex 函数的数据获取机制取决于参数设置以及您请求的数据类型(历史数据 vs 实时数据):
subscribe 参数(默认为 True)。当 subscribe=True 时,函数会向服务器订阅该品种的实时行情,并在后续有新行情时更新数据;如果设置为 False,则只读取本地已有的数据,不会向服务器发起订阅。可以的。
在 A 股市场的集合竞价期间(9:15 - 9:25),交易所会定时推送行情快照(Tick 数据)。只要您的 QMT 客户端行情连接正常,使用 period='tick' 是可以获取到集合竞价期间的 Tick 数据的。需要注意的是,集合竞价期间的 Tick 推送频率与盘中连续竞价不同(通常是 3 秒一笔),且 9:25 会推送开盘集合竞价的最终结果。
如果您调用该函数返回空值,通常是由以下几个原因导致的,请逐一排查:
如果您在回测或盘中请求历史数据,但没有在 QMT 客户端下载数据,就会返回空值。
QMT 的 API 对股票代码格式有严格要求,必须包含市场后缀。
'000001', '600000''000001.SZ', '600000.SH'start_time 和 end_time 参数必须是特定格式的字符串。
'YYYYMMDD'(如 '20231001')或 'YYYYMMDDHHMMSS'(如 '20231001093000')。如果格式错误或时间范围设置不合理(例如 start_time 大于 end_time),将返回空值。请检查传入的 period 参数是否在官方支持的范围内。
'tick', '1m', '5m', '15m', '1d' 等。如果拼写错误(如写成 '1D' 大写),可能会导致解析失败。在实盘运行模式下,如果您的策略是逐 K 线运行的,建议在 ContextInfo.is_last_bar() 为 True 时才去获取最新的实时数据,否则在历史 Bar 回放阶段可能会因为时间戳不匹配或数据未准备好而获取异常。
def handlebar(ContextInfo):
# 确保只在最新的一根 K 线上获取实时数据
if not ContextInfo.is_last_bar():
return
# 获取沪深300指数的日线数据,确保代码带后缀,且 subscribe=True
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close'],
stock_code=['000300.SH'],
period='1d',
start_time='',
end_time='',
count=10, # 获取最近10条
dividend_type='front',
subscribe=True
)
print(data)
总结建议:先检查代码后缀是否带 .SH/.SZ,然后去 QMT 客户端手动补充一下该品种的数据,最后检查时间参数格式。通常这三步能解决 90% 以上返回空值的问题。