3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
针对您在使用 QMT 平台行情订阅接口时遇到的两个问题,详细解答如下:
1. 能否同时订阅全部沪深 A 股的 Tick 数据?
理论上可以,但强烈不建议这样做。
沪深 A 股目前有 5000 多只股票,Tick 数据(分笔数据)的推送频率极高(每 3 秒一次快照,甚至包含逐笔)。如果同时订阅全市场的 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() 返回的 DataFrame 中缺少 'volRatio'(量比)、'speed1Min'(1分钟涨速)、'speed5Min'(5分钟涨速)这三项,而 subscribe_quote 的回调数据中却包含它们。
原因解答:
get_market_data_ex() 主要用于获取标准的基础量价数据(如开盘价、最高价、最低价、收盘价、成交量、成交额等)。它读取的是本地落盘或内存中的标准 K 线/Tick 序列,数据结构是固定的。'volRatio'、'speed1Min'、'speed5Min' 属于行情主站实时计算的衍生指标。当您使用 subscribe_quote 订阅实时行情时,服务器推送的 Level-1/Level-2 快照包中直接附带了这些由服务器计算好的实时状态字段。get_market_data_ex() 提取时自然就没有这些字段。解决建议:
subscribe_quote 的 callback 函数中提取并使用这些字段。get_market_data_ex(),则需要根据获取到的基础量价数据(如过去几分钟的 close 和 volume),在 Python 代码中自行编写逻辑来计算量比和涨速。