)
QMT 策略禁止读写文件用 TCP 文件桥把磁盘 IO 代理出去附协议设计与测试体系一、问题定义大 QMT迅投 QMT 客户端策略内置 Python 环境对文件 IO 的限制在需要连续实盘运行时成为硬伤策略禁止读写外部文件国信 iQuant 平台实测约束——信号日志、股票池、状态文件全部无处安放即使平台放开策略进程直接写磁盘也存在路径失控问题文件散落在策略工作目录难以管理与审计与外部程序交换数据缺少受控通道同时QMT 内置 Python 可用能力受限仅标准库、Python 版本偏老无 f-string、源码要求 GBK 编码、exec 加载场景下不依赖__name__。任何方案必须在这些约束内工作。实测可行的进程间通道是本机 TCP策略端socket正常可用。于是方案收敛为——把磁盘 IO 代理给同机的一个普通 Python 服务端策略侧只保留一个粘贴即用的客户端。二、架构大QMT策略(内置Python) 普通Python服务端(同机) ┌────────────────────────────┐ TCP 51757 ┌───────────────────────────┐ │ qmt_file_bridge_client │ ────────────► │ qmt_file_bridge_server │ │ read_text / write_text /... │ 长度前缀JSON │ 白名单校验 → 真实文件读写 │ └────────────────────────────┘ ◄──────────── └───────────────────────────┘设计原则QMT 端零依赖仅 socket/json/base64/threading 标准库服务端持有全部磁盘权限与安全策略受控落盘文件统一落在服务端白名单目录内不对外暴露服务端只监听127.0.0.1三、协议设计字节级帧结构4 字节大端无符号长度UTF-8 JSON长度不含头自身单帧默认上限 512MB可调。请求帧: {id: 序号, op: 操作, ...参数} 响应帧: {id: 序号, ok: true, data: 结果} | {id: 序号, ok: false, error: 错误说明}操作集opop参数data 返回ping无{protocol, python, roots, allow_any, cwd}readpath, binary, encoding, newline文本:{binary:false, text}二进制:{binary:true, b64, size}writepath, data(文本或base64), binary, encoding, append, create_dirs{size, path, append}exists/size/stat/list/mkdir/deletepathbool/int/{exists,is_dir,is_file,size,mtime}/[{name,is_dir,size,mtime}]/truerenamesrc, dsttrue文本读写不做换行翻译写字节原样落盘读默认通用换行与内置open()一致newline可取与磁盘完全一致的内容。四、客户端可靠性设计实盘关键QMT 侧客户端粘贴进策略的qmt_file_bridge_client.pyGBK 编码处理了三类实盘会遇到的边界连接管理首次调用自动连接、断线自动重连、传输错误自动重试一次业务错误如路径未放行明确报错不重试——重试与报错的边界必须区分否则越权路径会被反复请求并发安全客户端内部加锁handlebar与run_time定时器并发调用安全兼容性无 f-string 等新语法兼容 QMT 老 Python、不依赖__name__exec 加载安全、自带ping()连通自检源码 GBK 保存含中文协议字符串的文件字节必须真是 GBK回环延迟实测约0.1ms/次 ping——对日频/小时级策略无感。五、安全模型文件桥的最大的风险是变成策略环境的全盘读写后门因此服务端安全约束是第一设计项白名单默认只放行服务端所在目录--root 目录可重复传追加--any全盘放行有风险慎用防穿越客户端必须传绝对路径服务端做realpath后按放行目录前缀校验最小破坏面只删文件不删目录rename目标已存在即拒绝路径含空字节拒绝网络面仅监听127.0.0.1--host可改但默认不对外六、测试体系QMT 端 16 项功能自测策略QMT文件转换器_QMT自测_v1.py连通、GBK/UTF-8 往返、二进制、追加、多级目录、改名删除、bridge_open、越权拒绝、并发、延迟等粘贴进 QMT 运行日志区逐条[PASS]末行 QMT端自测全部通过: 16/16 自测报告本身也经转换器写盘双重验证。服务端没启动时策略不崩日志给出检查清单。电脑端 20 项回归测试测试_转换器.py协议与服务端持续回归。值得强调的工程手段自测策略是自动拼装生成的生成QMT自测.py把客户端全文嵌入用例保证 QMT 端被测客户端与主文件零偏差——手工复制粘贴的测试文件迟早与主文件脱节。七、快速上手# 1) 服务端QMT 同机QMT文件转换器_v1.exe# 免安装 exeRelease 下载或:py-3.14qmt_file_bridge_server.py--rootD:\量化输出# 2) QMT 端# 新建策略把 qmt_file_bridge_client.py 全文粘贴到 #coding:gbk 之后# 3) 替换调用# 原来: f open(D:/out/信号日志.jsonl, a); f.write(line); f.close()append_text(D:/out/信号日志.jsonl, line)已验证环境服务端 Windows 10 x64 / Python 3.14PyInstaller 6.22 打包QMT 端大 QMT 内置 Python纯标准库。相关资源已开源MITGitHub 搜foxneet/qmt-file-bridge服务端/客户端/skill/全套测试Release 提供免安装 exe。同系列的跨机数据网关在foxneet/tq-relay大 QMT 调通达信 TQ 接口。作者的量化回测工具链在foxneet/quant-toolbox。免责声明本文为工程工具分享不构成投资建议。工具变更策略环境 IO 行为请遵守所在平台规则文件白名单按最小权限原则配置涉及实盘的资金安全自行负责。