3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中使用 get_market_data_ex 或 get_local_data 时,如果遇到“实盘客户端正常,模拟客户端只能取到极少量(如9条)数据”的情况,通常不是代码逻辑的问题,而是底层数据环境与订阅机制导致的。主要原因包括以下几点:
QMT 的实盘客户端和模拟客户端是两个独立的程序,它们的本地数据目录是完全隔离的。你在实盘客户端下载或补充的历史数据,模拟客户端是无法读取到的。如果模拟客户端没有完整的数据,get_local_data 或未开启订阅的 get_market_data_ex 就只能取到内存中缓存的极少量最新 K 线(例如你提到的9条)。
根据 QMT API 文档,get_market_data_ex 有一个重要参数 subscribe(默认为 True)。
subscribe=False,函数只会读取本地已有的数据。如果本地没下载,就会返回空或极少量数据。subscribe=True,系统会尝试向服务器订阅并拉取数据。但如果请求的数据量过大或网络/数据源节点异常,可能会导致拉取失败,退而返回本地缓存的少量数据。手动补充数据时,如果补充的周期(如日线)与代码中请求的周期(如 period='1m')不一致,或者补充的时间段没有覆盖代码请求的时间段,依然会取不到数据。
请按照以下步骤在模拟客户端中进行排查和修复:
由于数据隔离,必须在模拟客户端中进行数据下载:
1d,就必须勾选日线;如果是 1m,必须勾选1分钟线)。确保在调用 get_market_data_ex 时,参数设置正确,特别是 count 和 subscribe 参数:
def handlebar(ContextInfo):
# 确保在最后一根K线执行,避免盘中频繁调用导致卡顿
if not ContextInfo.is_last_bar():
return
# 正确调用示例
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close'],
stock_code=['000300.SH'],
period='1d',
start_time='',
end_time='',
count=-1, # -1 表示根据时间范围取,或者取全部本地数据
dividend_type='none',
fill_data=True,
subscribe=True # 确保开启订阅
)
print(data)
如果你一次性传入了大量的股票代码(例如全市场5000只股票),可能会触发订阅数量限制或导致内存/网络超时。建议:
get_local_data 或将 subscribe 设为 False 来纯读取本地数据。如果上述步骤都确认无误但依然无效,可能是模拟客户端的本地数据文件损坏或索引错乱:
userdata_mini 或 datadir 文件夹(具体视券商版本而定),清理相关品种的缓存数据。