上手 ③:信号中转站配置及测试教程
建通道、取接入代码与跟单包、配好服务端风控,并用四层测试确认链路与权限都正常。
这一篇解决什么
在中转站上建好一条通道,拿到两样东西:给聚宽用的接入代码、给 QMT 用的跟单包。然后确认这条通道真的能通。
中转站为什么要存在
因为聚宽和你的 QMT 之间没有直连通道。
聚宽在云的这头,你的 QMT 在你自己的电脑上。聚宽推完信号就不管了(它也不知道你的电脑开没开机),而你的电脑在 NAT / 防火墙后面,聚宽也没法主动连过来。
所以中间必须站一个双方都能访问到的固定地址:
聚宽策略 ──①推送信号──▶ 中转站(排队、校验、留存)
▲
│②主动来领
│③回报结果
│④心跳
QMT 策略(在你自己电脑上)
关键在方向:QMT 是主动「去领」的那一方。它只发出站请求,不开端口、不需要多线程。这个设计不是随便定的 —— QMT 自带的 Python 不支持多线程和多进程,所有策略共享同一个线程;如果反过来让 QMT 开个端口等人连,负责接收连接的代码永远拿不到调度,症状是「端口开着、TCP 握手成功、但客户端等 5 秒后 Read timed out」,极难定位。
中转站顺带还解决三件事:
- 排队:QMT 没开机,信号也不会丢,等你开机再领。
- 幂等:每条信号带唯一 ID,重复推送只执行一次。
- 风控:金额、股数、时段、价格偏离、日内亏损都能在这里先卡一道。
第 1 步:注册并登录
打开中转站首页 → 右上角「用户中心」→ 注册。
建议用常用邮箱注册并记好密码 —— 后面找回密码、接收通知都靠它。部分站点开启了邮箱验证,按提示收信激活即可。
第 2 步:开通权益(拿到建通道的额度)
通道不是随便建的,需要先有权益。开通路径:
- 导航栏进 「官网策略」,挑一个策略,先看它的逻辑、适用环境、回测资料与风险说明。
- 在策略详情页选择 手动版 或 QMT 自动版,用积分开通。
- 只有「QMT 自动版」才会给你通道额度 —— 它对应「信号自动投递到你的 QMT」;手动版是给你看信号、自己下单。
积分从哪来:用户中心 →「积分钱包」→「充值积分」,用兑换码充值。如果站点已开通在线支付,也可以直接扫码充值。
权益到期会怎样:通道停止接收新信号,续费后自动恢复。历史数据不会删。
第 3 步:创建通道
用户中心 →「我的服务」→ 通道概览 → 创建通道(或「管理通道」)。
填一个好认的名字。这个名字就是你这条链路的 ID,后面会出现在:
- 工作台信号列表
- QMT 参数面板里的「QMT 策略名」
- 下载的跟单包文件名
建议命名格式:
策略名-用途,例如双均线ETF-实盘、小市值轮动-测试。 服务端会把非法字符清洗掉再作为文件名,所以中文、空格都能用,但不要用纯符号。一条通道 = 一套完整链路。 一个策略一条通道,不要两个策略共用一条 —— 共用会让工作台分不清信号是谁发的,还会触发「N 个客户端」的告警(多个 QMT 进程抢同一串令牌)。
创建后会得到一个 通道 ID 和 通道令牌(Token)。
第 4 步:从通道工作台拿走两样东西
点进通道 → 进入通道工作台。你要从这里取走:
| 要拿的东西 | 给谁用 | 在哪儿拿 |
|---|---|---|
| 聚宽接入代码 | 粘贴到聚宽策略最前面 | 「复制聚宽代码」区 → 一键复制聚宽代码 |
| QMT 跟单包 | 解压后放进 QMT | 「下载QMT跟单包」→ 下载 |
两样都已经按你的通道预填好了地址和令牌,不需要手工改任何内容。
接入代码里也带一个「复制自检代码」按钮 —— 那是给聚宽研究环境做三段式测试用的,见第 ② 篇。
工作台的「接入信息」区会一直显示这几个值,随时可以核对:
| 字段 | 说明 |
|---|---|
| 中转站地址 | 就是 base_url,不要以斜杠结尾 |
| 信号接口 | 聚宽推送的目标地址 |
| 通道 ID | 通道的内部编号 |
| 通道 Token | 你的钥匙,不要截图外发 |
| QMT 资金账号 | 你填的,心跳上来后会被 QMT 的真实账号覆盖 |
| QMT 策略名 | QMT 侧策略的名字 |
| 下单价格类型 | 当前生效的报价方式 |
第 5 步:在工作台把「执行参数」配好
这是服务端这一层的风控与行为参数。改完点「保存执行参数」,下一次心跳(≤30 秒)自动生效,QMT 机器上的文件一个字都不用动。
| 参数 | 作用 | 建议 |
|---|---|---|
| QMT 资金账号 | 你 QMT 登录的资金账号 | 必须与 QMT 当前登录的账号一致,填错的表现是「信号在领、单下不出去」 |
| QMT 策略名 | QMT 侧策略名 | 与跟单包文件名保持一致 |
| 下单价格类型 | 报价方式 | 默认对手价;盘口薄的标的可考虑限价 |
| 价格笼子比例 | 最终限价被夹在最新价 ±该比例内 | 默认 2%。这是防打飞的关键参数,不要放大到 10% 以上 |
| 单笔金额上限 | 超过直接拒单 | 按你的资金量先设小,跑顺了再放宽 |
| 日委托笔数上限 | 当日委托笔数上限 | 与你在券商报备的「单日最高申报笔数」口径保持一致 |
| 单票集中度 | 单只标的持仓占比上限 | 默认按资金量设 |
| 总仓位上限 | 总持仓占比上限 | 同上 |
| 日内亏损熔断 | 当日亏损超过该值停止开仓 | 强烈建议设置,这是程序化交易最后一道保险 |
| 价格偏离校验 | 信号价偏离市价超该比例就拒 | 防止错价打飞 |
| 持仓同步 | 让 QMT 上报持仓与权益 | 打开,工作台的持仓与权益曲线才有数据 |
两层风控是互补的,不是重复的: 服务端管「这条信号该不该发」;QMT 侧的参数面板管「以我现在的持仓和资金,这单到底下多少」。 两边都要设,不要指望一层兜住。
第 6 步:四层测试(从松到紧,全部打通再上实盘)
工作台上有四个「测试」入口,用途完全不同。别只做第一个就以为通了。
| 入口 | 会真实报单吗 | 任何时间可点 | 验的是什么 |
|---|---|---|---|
| 发送测试信号 | 不会 | 是 | 「中转站 → QMT」这一段 |
| 一键全链路测试 | 不会 | 是 | 完整三跳「聚宽 → 中转站 → QMT」 |
| 买卖预检 | 不会 | 是 | 「以 QMT 现在的持仓和资金,这一单能不能下」 |
| 实盘下单(100股) | 会 | 否,需带精确价格 | passorder 那一段到底通不通 |
第 1 层:发送测试信号
点「发送测试信号」。这是链路探针 —— QMT 收到后会直接回报,不取价、不调 passorder(),所以收盘后 / 周末 / 节假日点都一样有效,不用先开测试模式。
回显按三态着色:
| 颜色 | 含义 | 该做什么 |
|---|---|---|
| 绿 | 已收到,通道可用 | 继续下一层 |
| 红 | 没收到(会带原因) | 看原因,多半是 QMT 策略没在运行 |
| 琥珀 | 还在等 | 检查 QMT 侧策略是否点了【运行】 |
⚠ 这一层只验了「中转站 → QMT」 —— 探针是从中转站内部注入的,压根没经过聚宽。 第一跳「聚宽 → 中转站」是另一件事,用第 2 层补验。
第 2 层:一键全链路测试
点「一键全链路测试」→ 点 「复制自检代码」 → 粘到聚宽「研究环境」里运行。
它会打完完整三跳并逐跳打印结果,结果也会同步回工作台,不用手抄:
1 聚宽 → 中转站 [OK] 已入库 23:45:01
2 中转站 → QMT [OK] (+3.1s)
3 QMT 回报 [OK] (+3.2s)
结论:全链路通,三跳全部走通。
三跳全 [OK] 才叫链路真的通了。
第 3 层:买卖预检(下单前先问一句「能不能下」)
点 「卖单预检(不下单)」 或「预检·买入」。
它会让 QMT 侧先检查一遍(持仓够不够、可用资金够不够、有没有被冻结、有没有超上限),把结论回报上来,但不真的下单。
回报会翻译成人话,例如:
预检·卖出 159981.SZ | 时段 盘中 | 价格 1.6800 | 数量 5700 股
| 持仓 合计5700 / 可用5700 | 可用资金 15077 | 结论 可执行
| 执行端 v3.0.8 / 账户 31709472
几个关键结论要学会读:
| 结论 | 真实含义 |
|---|---|
可执行 | 这一单能下 |
可执行(数量会被压到 N 股) | 能下,但数量会被限额或整手取整压缩 |
会被拒 · 无该标的持仓 | 账户读取正常,只是没有这只票 |
会被拒 · 本机一条持仓都读不到 | 账户数据不可读(未登录 / 账号不对),不是真的没持仓 —— 这两种是完全不同的故障 |
会被拒 · 有持仓但可用为 0 | T+1 未解冻,或被在途委托占用 |
会被拒 · 资金不足一手 | 钱不够 |
会被拒 · 超过 MAX_ORDER_AMOUNT | 撞到 QMT 侧的单笔股数上限 |
预检的结论只说明「闸门会放行」。如果服务端的紧急制动(dry_run)开着,真实信号仍然只会被 ack、不会下单 —— 预检回报里会专门提这一句。
第 4 层:实盘下单(100 股)
这是唯一会真实报单的测试。 会以固定 100 股、走完整风控链路下一笔真实委托。
⚠ 必须手动填一个大于 0 的精确价格,这是强制的,不带价的下单请求会被直接拒收。 填得离谱的价会被柜台做成废单(低于跌停 / 高于涨停),而废单不会出现在有效委托列表里 —— 表现就是「工作台说已提交,QMT 委托列表里什么都没有」。服务端会在入口就拦下出界的价格并提示「超出当日涨跌停区间」。
下单后去 QMT 的委托列表核对方向、价格、数量,核对完自行撤单。
第 7 步:认识「最近策略信号」这张表
这是你日常盯得最多的一张表。每条信号的状态会沿着这条路径推进:
待领取 ──▶ 已领取 ──▶ 已完成
│ │
│ └──▶ 执行失败(回报里带原因)
└──▶ 已拒绝(风控拦截,带具体规则)
几个高频状态的含义:
| 现象 | 含义 |
|---|---|
| 一直「待领取」不动 | QMT 策略没在运行,或通道令牌不一致 |
| 「已领取」但迟迟不推进 | QMT 领走了但没回报,多半是策略卡住或电脑断网;租约到期会自动放回「待领取」 |
| 「已完成」但委托列表没单 | QMT 侧空跑模式还开着(只写日志不报单) |
| 重复推送只出现一条 | 幂等生效,这是正确行为 |
租约机制值得单独说:QMT 领走信号时会写一个租约(lease_id + lease_until),到期没回报就自动放回「待领取」。所以中途关掉 QMT 不会丢信号,重开后会把没回报的继续领走。
第 8 步:安全与日常运维
令牌泄露怎么办
工作台 → 更换 Token。换完后:
- 重新下载跟单包,把
.py和.xml两个文件在 QMT 里重新放一次; - 重新复制聚宽接入代码,在聚宽策略里整段替换。
换令牌不会影响历史信号和订单记录。
三条安全红线
- 通道令牌等同于钥匙 —— 它在 QMT 参数面板和策略文件里都是明文,不要截图外发。
- 只连你自己配置的中转站地址,不要用来路不明的地址。
- 保持「单笔金额上限」和「单笔股数上限」为有限值 —— 它们是跟单链路上最后一道闸。填 0 表示不限制,别填。
服务端的紧急制动
服务端有一个 RELAY_DRY_RUN 开关。打开后,它会在每一条下发的信号上盖一个 dry_run=true 的标记,跟单策略收到后只回报、不调 passorder() —— 等效于「远程把每台 QMT 的空跑模式打开」。
出问题时的第一动作就是打开它,比一台台跑去关 QMT 快得多。恢复正常:把开关关掉,QMT 侧不用重启,下一拍心跳会在日志里打 server brake OFF。
两个前提要记住: ① 跟单包必须是 v3.0.1 或更高。老包不认这个字段,服务端盖了章它照样下单。版本可以在 QMT 参数面板或工作台通道页看到。 ② 制动只拦下单,不拦撤单 —— 一键停机的同一时刻,你还得能把挂出去的仓位收回来。
常见问题
Q:工作台显示「离线」,但 QMT 明明开着? A:心跳没打出去。检查中转站地址是否公网可达、令牌对不对;重开 QMT 后看日志里有没有连接失败的行。
Q:出现「⚠ N 个客户端」的黄牌? A:同一个通道令牌被多个 QMT 进程同时拉取。最常见的是同一个策略文件被加载成了两条同名模型,或旧进程没杀干净。多出来的那个若跑在回测 / 模拟模式,会把信号抢走并给出「已提交」的假象,实际不产生任何委托。 处理:去 QMT「模型交易」数一数同名策略有几条,只保留一条实盘实例;停掉后回来看黄牌是否消失(约 35 秒后刷新)。
Q:信号被拦截,原因写「信号未携带价格」? A:服务端强制要求真实下单必须带精确价格。聚宽接入代码取不到该标的行情(停牌 / 冷门 LOF / 非交易时段)时就会这样。重新复制一次最新的聚宽接入代码,并确认标的当时有行情。
Q:提示权益已到期? A:去「积分钱包 / 权益兑换」续费即可,续费后通道自动恢复,历史数据不删。
Q:能改通道名字吗? A:能。工作台「修改通道名称」。但注意:已经下载出去的跟单包里,策略名是旧的 —— 改名后要重新下载跟单包并重新放文件,否则 QMT 里还是老名字。
Q:能删通道吗? A:能。但关联的历史信号和订单记录会一起处理掉,且不可恢复。确认不再使用再删。
Q:中转站必须上 HTTPS 吗? A:对公网暴露就必须要。 通道令牌是明文传输的,HTTP 等于把钥匙挂在网上。自己用的内网环境可以例外,但只要有公网入口就必须上 TLS。
Q:服务器时间不准会怎样? A:信号带 created_at 时间戳,跟单策略按它判断是否过期(默认 120 秒)。服务器时间偏了,信号会被批量误判为过期或永不过期。给服务器配好 NTP 时间同步。
本篇检查单
- [ ] 已注册并登录中转站
- [ ] 已开通「QMT 自动版」策略权益(拿到了通道额度)
- [ ] 已创建通道,名字好认
- [ ] 已从工作台复制聚宽接入代码
- [ ] 已从工作台下载 QMT 跟单包
- [ ] 工作台「执行参数」已按资金量设好单笔金额上限 / 日委托笔数上限 / 日内亏损熔断
- [ ] 「发送测试信号」回显变绿
- [ ] 「一键全链路测试」三跳全
[OK] - [ ] (可选)「买卖预检」结论符合预期
- [ ] (可选)「实盘下单」真实下过一笔,并在 QMT 委托列表核对无误
- [ ] 中转站地址是 HTTPS
- [ ] 服务器时间已同步(
date命令核对)
下一篇:④ QMT 侧配置及测试教程 —— 把跟单包放进 QMT,让它真的把单子发出去。
