🚀 AI 一键生成 qmt 策略代码

QMT API:如何订阅全市场 Tick 数据及 get_market_data_ex 字段差异解答

qmt | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

关于xtdata.subscribe_quote(stock_code,period = 'tick')求解

问题一:

xtdata.subscribe_quote(stock_code,period = 'tick')可以将全部沪深 A 股同时订阅吗?在做循环时最小间隔是多少?demo 中是按照 1 秒延时等待

问题二:

利用 xtdata.get_market_data_ex()获取的数据与 subscribe_quote(callback=on_data)数据回调时不太一致,发现用 get_market_data_ex()返回的 DataFrame 中没有

'volRatio': 0.0, 'speed1Min': 0.0, 'speed5Min': 0.0}

这三项

解决方案

针对您在使用 QMT 平台行情订阅接口时遇到的两个问题,详细解答如下:

问题一:关于全市场订阅与循环间隔

1. 能否同时订阅全部沪深 A 股的 Tick 数据?

理论上可以,但强烈不建议这样做。
沪深 A 股目前有 5000 多只股票,Tick 数据(分笔数据)的推送频率极高(每 3 秒一次快照,甚至包含逐笔)。如果同时订阅全市场的 Tick 数据:

  • 网络带宽压力:瞬间的数据吞吐量极大,可能导致网络拥堵。
  • 客户端性能瓶颈:QMT 客户端需要消耗大量的 CPU 和内存来解析和分发这些回调数据,极易导致客户端卡顿、数据延迟处理甚至崩溃。
  • 建议方案:量化策略通常不需要全市场所有股票的实时 Tick。建议按需订阅(如仅订阅股票池、持仓股或特定板块的股票)。如果确实需要全市场扫描,建议使用 ContextInfo.get_full_tick() 接口进行定时轮询获取全市场快照,而不是使用高频的异步回调订阅。

2. 循环订阅的最小间隔是多少?

如果您需要批量订阅多只股票,建议将股票代码放入一个列表中,直接将列表传给 stock_code 参数进行一次性订阅,而不是在 for 循环中一只一只地调用 subscribe_quote。例如:

stock_list = ['000001.SZ', '600000.SH', ...]
ContextInfo.subscribe_quote(stock_list, period='tick', callback=on_data)

如果必须使用循环分批订阅,为了防止瞬间向服务器发送过多请求导致限流,可以设置微小的延时(如 time.sleep(0.05)0.1 秒)。Demo 中设置 1 秒延时通常是为了演示效果,确保连接建立和数据初始化完成,实际应用中不需要这么长。


问题二:关于 get_market_data_ex 与回调数据字段不一致

现象分析:
您发现 get_market_data_ex() 返回的 DataFrame 中缺少 'volRatio'(量比)、'speed1Min'(1分钟涨速)、'speed5Min'(5分钟涨速)这三项,而 subscribe_quote 的回调数据中却包含它们。

原因解答:

  1. 数据性质不同get_market_data_ex() 主要用于获取标准的基础量价数据(如开盘价、最高价、最低价、收盘价、成交量、成交额等)。它读取的是本地落盘或内存中的标准 K 线/Tick 序列,数据结构是固定的。
  2. 衍生字段的来源'volRatio''speed1Min''speed5Min' 属于行情主站实时计算的衍生指标。当您使用 subscribe_quote 订阅实时行情时,服务器推送的 Level-1/Level-2 快照包中直接附带了这些由服务器计算好的实时状态字段。
  3. 底层存储机制:为了节省本地存储空间和提高读取效率,QMT 本地数据库通常只存储基础的量价数据,不会将这些动态变化的衍生指标(如涨速)持久化存储。因此,通过 get_market_data_ex() 提取时自然就没有这些字段。

解决建议:

  • 如果您在盘中策略里强依赖量比和涨速指标,请直接在 subscribe_quotecallback 函数中提取并使用这些字段。
  • 如果您必须使用 get_market_data_ex(),则需要根据获取到的基础量价数据(如过去几分钟的 closevolume),在 Python 代码中自行编写逻辑来计算量比和涨速。