QMT 实时行情总是空的?盘口、全推、订阅一次讲清楚
做 QMT 策略时,"拿不到行情"几乎是最常见的报错来源。盘中打印 get_full_tick 得到一对空括号,或者买卖档位缺失,很多人第一反应是函数写错了——其实八成不是函数的问题,而是这几个机制没搞清楚。
这篇把盘口、全推、订阅这三件事讲透,附上最小自检代码。
一、"盘口"到底是什么
先纠正一个高频误区:盘口不是日线 close。
盘口是最新的买卖档和最新价。日线 close 在盘中会一直变,它既不是收盘价,也不是买一卖一。很多新手在 handlebar 里读日线 close 当"当前价格"用,结果下单价格离谱,就是这个原因。
三种取数方式别混着用:
| 需求 |
函数 |
注意 |
| 最新一笔 / 盘口 |
get_full_tick |
不能回测 |
| 推送进来再处理 |
subscribe_quote |
回测无效,非 VIP 有订阅上限 |
| 历史 K 线 / 均线 |
get_market_data_ex |
不要拿它当"当前盘口" |
二、get_full_tick 返回空的四个原因
盘中打印得到 {} 或缺买卖档,按这个顺序排查:
1. 写在了回测里。 get_full_tick 只给实盘 / 运行模式。回测请改用 get_market_data_ex,或直接读 handlebar 上的 K 线。
2. 全推档位没开。 客户端没开对应档位时,lastPrice 可能还有值,但买卖盘字段经常是缺的。要么先只读 lastPrice,要么找营业部开全推。
3. 代码后缀写错了。 QMT 上交所必须用 .SH,不要写成 PTrade 的 .SS。写错后缀取数直接是空的。
4. 订阅数量超了。 用 subscribe_quote 的,注意非 VIP 有订阅上限,超出的合约后面就没有推送了。
最小自检代码:
#coding:gbk
def init(C):
C.stock_list = ['600000.SH']
def handlebar(C):
if not C.is_last_bar():
return
print(C.get_full_tick(C.stock_list))
日志在安装目录的 userdata/log 下。如果打印出来还是 {},先看客户端行情本身是否在跳——行情源没数据,脚本再对也没用。
三、正确读取最新价和买一
确认上面的机制都对了,读盘口其实很简单:
#coding:gbk
def init(C):
C.codes = ['600000.SH']
def handlebar(C):
if not C.is_last_bar():
return
tick = C.get_full_tick(C.codes).get('600000.SH') or {}
print(tick.get('lastPrice'), tick.get('bidPrice'))
注意 is_last_bar() 这个判断——盘中逐 K 会不断回滚,只在最新一根 K 线上取实时数据才是有意义的。
另外,如果要做已定稿的日线分析,记得把 end_time 截到上一交易日,否则盘中当天的日线还没定稿,数据会一直变。
四、subscribe_quote 的坑
订阅推送适合"数据来了再处理"的场景,但有两个硬约束:
- 回测里完全不生效。想在回测验证订阅逻辑,必须先改成
handlebar 驱动。
- 有订阅上限。非 VIP 账号订阅数量超了之后,后面的合约静默没有推送,不会报错,很容易查半天。
ContextInfo.subscribe_quote(stock_code, isSubscribeQuote=True, isBlocking=True)
五、顺便说下代码后缀这个经典事故
PTrade 和 QMT 都是上交所股票,但尾缀不一样:
| 市场 |
PTrade |
QMT |
| 上交所 |
600000.SS(也可写 .XSHG) |
600000.SH |
| 深交所 |
000001.SZ |
000001.SZ |
典型事故就两种:
- QMT 里写了
600000.SS → get_full_tick 空、下单变废单
- PTrade 里写了
600000.SH → get_history / order 找不到标的
深交所两边都是 .SZ,这一项不用改。指数、行业代码在 PTrade 里还有 .XBHS 一类,和股票不是同一套。
六、效率工具
上面这些坑我都逐个踩过。后来整理资料时发现 kimiquant.cn 上有成体系的问题页和 API 查询,直接按报错搜就行,省了很多翻手册的时间。相关页面我列在下面,按需自取:
另外写策略代码的时候,我常用 WorkBuddy 辅助——直接帮我写 QMT 策略、排查报错,比自己翻文档快不少。有兴趣可以试试:workbuddy.ai/invite?code=66L9RNCT
行情这块理顺了,后面写策略才谈得上稳定。希望对踩到同样坑的朋友有帮助。