10月23日QMT会封了哪些功能?写个内置Python 探针,跑一遍就知道

说明:本文代码只用于检测大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 模块未安装或未配置。

  1. 只有 BLOCK 才说明功能被拦。 WARN 最常见的是局域网那台设备不在线、或者目标 IP 不通;SKIP 是你的 Python 环境里没装这个库。把这两种当成封禁,会得出完全错误的结论——尤其别因为 requests 显示 SKIP 就以为网络被封了。
  2. 先看 H1/H2 两行。 正常应该是 open 来自 _io.open、socket.socket 来自 socket。如果这里出现券商自己的模块名,说明做了替换:后面的 BLOCK 是「被 hook 抛异常」,性质上是策略层的拦截,而不是 Windows 不让你访问磁盘。
  3. PASS 不等于能用。 import 成功只说明文件在硬盘上;真正的判据是 F 组和 N 组的实际调用结果。
  4. 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 一页说明,含排查清单 随便

三步:

  1. 解压,把 qmt-capability-probe.py 全选,粘进「内置 Python 策略」
  2. 另外四个文件(helper + 三个样例)放进同一个目录。不确定是哪个,就先跑一次,看日志 H4 那行打印的 策略目录=...,再把文件丢进去重跑
  3. 保存(编辑器问编码就选 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 目标不可达

五、跑之前六件事

  1. 用模拟账号(模拟模式)跑。虽然不下单,但避免误触实盘
  2. 只跑一次。RUN_ONCE 别改,探针里有网络请求,每根 bar 都跑会把客户端拖慢
  3. 超时给 3 秒。TIMEOUT 调大会让整个探针卡住,调到 1 秒又容易误判成 WARN
  4. 知道它会留下什么:TEST_DIR 下会建一个 sub 目录;工作目录(多半是 bin.x64)会留下 qmt_probe_rel.txt / .csv / .db(测完自删,F3 失败时可能残留);服务端会多两个键 qmt_probe_v1 和 qmt_probe_v1_big。你放进去的四个配套文件不会被改、也不会被删——探针只读它们。想清 KV,重跑一次并把值写成空串即可
  5. 整段日志截图存档。客户端升级后再跑一次,两张图对比,能看出券商这次到底关了什么
  6. 别把探针和实盘策略写在同一个文件里。探针是工具,跑完就撤

写在最后

探针的价值不是「测出被封」,而是把「听说」变成「测过」。

这套接口还会继续变:接入规范在收紧、机房的局域网接入已经改成广域网、内置策略的沙箱只会更封闭。与其每次等通知、猜影响,不如留一个十分钟能跑完的工具——客户端一升级,跑一遍,看差异。 你手上那测试结果,比群里的传言可信得多。


⚠️ 免责声明

本文代码仅用于技术自检,不构成任何投资建议:

  • 代码由AI生成,可能存在错误或不完整的地方,请自行检查验证
  • 各券商功能限制范围、时间节点不同,以开户券商官方通知与实际客户端行为为准
  • 探针结果只代表执行当时的环境,客户端升级、权限变更后需重测
  • 请勿将本代码用于绕过券商或监管的功能限制;因使用本文代码造成的任何直接或间接损失,由使用者自行承担

赞赏作者

赞赏码

本页面赞赏完全自愿,属于读者无偿鼓励,不提供任何商品、服务、答疑、内容解锁等对价。您可随意选择是否赞赏以及赞赏金额。

微信二维码 Share