3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
针对您在使用 QMT 平台 API 时遇到的行情获取与订阅问题,以下是详细的解答与最佳实践建议:
get_market_data 缓存机制与数据准确性问题原因分析:
get_market_data 接口确实是优先从本地缓存或本地已下载的数据中读取。如果您请求了 14:30 的数据,但返回的是 13:xx 的数据,通常是因为本地没有最新的分钟线数据缓存。QMT 默认不会自动在后台为您未订阅或未在主图打开的股票补充所有周期的实时 K 线。
解决方案:
get_market_data_ex:官方文档已明确建议弃用 get_market_data,改用 ContextInfo.get_market_data_ex。新接口提供了一个关键参数 subscribe=True。当设置为 True 时,如果本地缓存没有最新的数据,系统会自动向服务器发起订阅并拉取最新数据,从而保证数据的准确性。speed1min 和 speed5min 字段字段解析:
是的,speed1min 和 speed5min 代表的是1分钟涨速和5分钟涨速。它们反映了标的在过去1分钟或5分钟内的价格变化百分比。
数值表现:
对于几百只股票的分钟K线数据,核心诉求是“快”和“准”。推荐以下两种方案,具体取决于您的策略是“定时轮询”还是“事件驱动”:
get_market_data_ex)如果您是在 handlebar 中每分钟触发一次,或者使用定时器定期去拉取截面数据:
def handlebar(ContextInfo):
# 确保只在K线走完时获取
if not ContextInfo.is_last_bar():
return
stock_list = ContextInfo.get_universe() # 假设这里有几百只股票
# 使用 get_market_data_ex 批量获取,开启 subscribe=True 保证数据最新
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close'],
stock_code=stock_list,
period='1m',
count=10, # 获取最近10根
subscribe=True
)
# 处理 data 字典
优点:代码逻辑简单,一次性返回所有请求股票的 DataFrame 字典,适合横向截面计算(如多因子排序)。
subscribe_quote)如果您希望数据一有更新就立刻计算,而不是被动等待主图 K 线驱动:
def on_quote(datas):
# datas 包含最新推送的 K 线或 Tick 数据
print("收到行情更新:", datas)
def init(ContextInfo):
stock_list = ['000001.SZ', '600000.SH', ...] # 几百只股票
for stock in stock_list:
# 批量订阅1分钟线,数据更新时自动回调 on_quote
ContextInfo.subscribe_quote(stock, period='1m', dividend_type='none', callback=on_quote)
优点:极大地降低了无效的轮询开销,实时性最高(“快”)。只要服务器有新的 1 分钟 K 线生成,就会立刻推送到 on_quote 回调函数中。
总结建议:
get_market_data_ex (subscribe=True)。subscribe_quote 效率最高。