说明:本文代码只用于检测大QMT客户端的能力边界,不下单、不改账户、不读写交易数据。各券商的调整范围与进度并不一致,一切以您开户券商的官方通知为准。本文包含 AI 创作内容,请自行判断是否适用,不构成任何投资建议。
券商通知对大QMT客户端文件访问和网络连接功能限制前一篇把影响面拆了一遍,但拆解只能告诉你「可能封什么」,告诉不了你「你手上这个客户端现在到底封了什么」。由于券商不同,他们对于客户端的管控程度和管控方式必然存在差异。还有的可能升级分批推、你收到通知但客户端还没更新。
自己手上的客户端到底封了什么?靠猜会浪费一整晚,测一遍只要几分钟。
所以这篇不谈政策,给一个能跑的东西:一个内置 Python 策略,把八组共 73 项能力逐项试一遍,结果直接打进 QMT 日志。跑完你手上就有一张自己客户端的「能力清单」,可以截图问客服,也可以据此决定策略怎么改。
一、探针测什么
八组,从「运行痕迹」到「基线」:
| 组 | 项数 | 测什么 |
|---|---|---|
| H 运行痕迹 | 4 | open / socket.socket 来自哪个模块、工作目录、策略目录与 sys.path |
| F 文件 | 17 | 绝对路径读写、相对路径读写、列目录、建目录、重命名删除、pathlib、json、csv×2、xlsx、xls、同目录自定义模块 import、同目录 txt / csv / json 读取 |
| N 网络 | 13 | DNS、TCP 公网 / 本机回环、UDP 发送 / 回环、HTTP(urllib / requests)、WebSocket 本机 / 公网、ZeroMQ inproc / tcp、局域网、ssl |
| D 数据库 | 5 | SQLite 内存库 / 文件库(绝对)/ 文件库(相对)、MySQL、Redis |
| K 服务端 KV | 4 | save_py_key / get_py_key、读不存在的键、超长 value |
| P 子进程 | 2 | subprocess、os.system |
| I 第三方库 | 26 | requests、pandas、talib、websocket、zmq、openpyxl 等能否 import |
| B 原生 API | 2 | get_market_data_ex、ContextInfo 属性 |
二、结果怎么读
四种状态,五条规矩。
状态:PASS 可用;BLOCK 被拦截或未知异常;WARN 目标不可达 / 路径不存在;SKIP 模块未安装或未配置。
- 只有 BLOCK 才说明功能被拦。
WARN最常见的是局域网那台设备不在线、或者目标 IP 不通;SKIP是你的 Python 环境里没装这个库。把这两种当成封禁,会得出完全错误的结论——尤其别因为requests显示 SKIP 就以为网络被封了。 - 先看 H1/H2 两行。 正常应该是
open 来自 _io.open、socket.socket 来自 socket。如果这里出现券商自己的模块名,说明做了替换:后面的 BLOCK 是「被 hook 抛异常」,性质上是策略层的拦截,而不是 Windows 不让你访问磁盘。 - PASS 不等于能用。 import 成功只说明文件在硬盘上;真正的判据是 F 组和 N 组的实际调用结果。
- F14 才是「自定义库能不能用」的真判据。 I 组 import 只说明库在硬盘上;F14 是去策略目录里 import 一个你自己写的
qmt_probe_helper.py,再把里面的add/mean真调一遍——文件和函数都通,才算数。它 PASS,你才敢把策略拆成多个文件维护。F15~F17 测的是另一件事:目录里已经存在的数据文件读不读得动。很多券商关的是「写」不是「读」,这三项 PASS 而 F2/F3 BLOCK 是常见组合,意味着你还能读外部给的持仓表,但不能把结果落盘。
三、代码在哪拿
不贴在正文里,原因有三个——不是藏私:
- 主程序八百多行,粘进网页会断行、会吃掉缩进。
#coding:gbk那种靠缩进活着的代码,断一次就没法跑 - 它不是一个文件。同目录还必须有
qmt_probe_helper.py和三个样例数据文件,import那一项才测得出来——这些文件靠正文复制粘贴是实现不了的 - GBK 文件在网页上复制,经过剪贴板很容易变成 UTF-8,粘进 QMT 中文日志直接乱码
获取方式:
我用夸克网盘给你分享了「qmt-probe-kit」,点击链接或复制整段内容,打开「夸克APP」即可获取。
链接:https://pan.quark.cn/s/ac36fae721ac
提取码:GmYn
免费下载。
包里 7 个文件:
| 文件 | 干什么 | 放哪 |
|---|---|---|
qmt-capability-probe.py |
主程序,粘进 QMT 的就是它 | 策略编辑器 |
qmt-capability-probe-utf8.py |
同一份代码的 UTF-8 版,只方便你读和改,别直接粘 | 留着看 |
qmt_probe_helper.py |
同目录自定义模块。F14 靠 import 它判断「券商让不让你加库」 | 策略目录 |
probe_sample.txt / .csv / .json |
三个同目录样例数据,F15~F17 读它们 | 策略目录 |
README.md |
一页说明,含排查清单 | 随便 |
三步:
- 解压,把
qmt-capability-probe.py全选,粘进「内置 Python 策略」 - 另外四个文件(helper + 三个样例)放进同一个目录。不确定是哪个,就先跑一次,看日志 H4 那行打印的
策略目录=...,再把文件丢进去重跑 - 保存(编辑器问编码就选 GBK)→ 编译 → 运行(选模拟账号)→ 看日志面板
按迅投社区公告,2.1.32 以后的客户端把内置解释器从 3.6.8 升到了 3.12,所以代码里刻意不用 f-string,两个版本都能跑。
配套文件漏放不会让程序崩,只会让 F14~F17 显示 WARN 或 SKIP。那不是封禁——先回去确认文件放对没有。
四、结果组合
跑完不用自己推理,对着下表看:
| 现象 | 结论 |
|---|---|
| F 全 PASS、N 全 BLOCK | 只封网络 |
| F 写 BLOCK、读 PASS | 只读沙箱 |
| F2 BLOCK、F3 PASS | 只拦绝对路径 |
| F2、F3 都 BLOCK、K 全 PASS | 文件封了,服务端 KV 还在 |
| K 全 SKIP | 客户端没有这两个函数 |
| F、N 全 BLOCK | 全封闭沙箱 |
| F14 BLOCK、I 组全 PASS | 库都在,但不能自己加 |
| F15~F17 全 WARN、F1~F13 正常 | 配套文件没放对,不是封禁 |
| F2/F3 BLOCK、F15~F17 PASS | 能读不能写 |
| D1 PASS、D2 BLOCK | sqlite 模块还在,文件被拦 |
| N6 PASS、N7 BLOCK | 标准库没封、requests 被封 |
| N8 PASS、N9 SKIP | ws 协议栈能用,只是没配目标 |
| N10 PASS、N11 SKIP/BLOCK | zmq 能用,但 tcp transport 不通 |
| I 组大面积 SKIP | 环境缺库 |
| B 组有 FAIL | 不是沙箱问题 |
| N2 WARN 但 N1 PASS | 目标不可达 |
五、跑之前六件事
- 用模拟账号(模拟模式)跑。虽然不下单,但避免误触实盘
- 只跑一次。
RUN_ONCE别改,探针里有网络请求,每根 bar 都跑会把客户端拖慢 - 超时给 3 秒。
TIMEOUT调大会让整个探针卡住,调到 1 秒又容易误判成 WARN - 知道它会留下什么:
TEST_DIR下会建一个sub目录;工作目录(多半是bin.x64)会留下qmt_probe_rel.txt/.csv/.db(测完自删,F3 失败时可能残留);服务端会多两个键qmt_probe_v1和qmt_probe_v1_big。你放进去的四个配套文件不会被改、也不会被删——探针只读它们。想清 KV,重跑一次并把值写成空串即可 - 整段日志截图存档。客户端升级后再跑一次,两张图对比,能看出券商这次到底关了什么
- 别把探针和实盘策略写在同一个文件里。探针是工具,跑完就撤
写在最后
探针的价值不是「测出被封」,而是把「听说」变成「测过」。
这套接口还会继续变:接入规范在收紧、机房的局域网接入已经改成广域网、内置策略的沙箱只会更封闭。与其每次等通知、猜影响,不如留一个十分钟能跑完的工具——客户端一升级,跑一遍,看差异。 你手上那测试结果,比群里的传言可信得多。
⚠️ 免责声明
本文代码仅用于技术自检,不构成任何投资建议:
- 代码由AI生成,可能存在错误或不完整的地方,请自行检查验证
- 各券商功能限制范围、时间节点不同,以开户券商官方通知与实际客户端行为为准
- 探针结果只代表执行当时的环境,客户端升级、权限变更后需重测
- 请勿将本代码用于绕过券商或监管的功能限制;因使用本文代码造成的任何直接或间接损失,由使用者自行承担