本文对应平台文章https://quantkt.com/forumDetail?id=201172
本文只针对部分没有MiniQMT并且大QMT的读写IO功能被禁的券商,提出了一些曲线救国方案。
且只供量化技术爱好者用于知识学习与技术研究。
如你的QMT没有被禁IO或者本身就有MiniQMT或者用的是Ptrade等其它量化软件,则不需要使用下文介绍的技术。
关于什么是ban IO
IO 是 Input/Output 的缩写,翻译为 “输入 / 输出”,本质是程序与外部环境之间的数据交换。
Input(输入):外部环境把数据传给程序(比如读取文件内容、从键盘输入文字、从网络获取数据);
Output(输出):程序把数据传给外部环境(比如写入文件、打印到控制台、发送网络请求)
ban IO即券商禁止用户把QMT与QMT系统外部进行信息通信,只希望用户把各类代码逻辑层面都写入QMT内部,防止用户拿QMT做纯粹的下单器,这样对很多券商的各类管理是方便了,但是对于很多有特定需求的客户就会变得不方便。
具体表现:
比如直接使用QMT进行open文件进行read操作时QMT会显示Foribdden FileIO,如果使用socket通信则会显示不允许使用socket库。

一般这个ban IO并没有特别彻底,存在较多的解决方案,即对于真正有一定技术的其实是拦不住的。
一些解决方案:
1.直接在代码中硬编码(Hard Coding/Hardcoding),本地输出需要的股票池,每天人工放入大QMT脚本中,这个方法适用于低频策略,好处是学习起来很方便,基本没有什么技术门槛,缺点是需要人工操作,本质还是没有完全自动化。
2.用pyautogui库,用本地python脚本,使用pyautogui模拟键盘和鼠标,把文件单复制至大QMT脚本中,优点是由于涉及的是外部物理层面(某种意义上相当于雇了个人帮忙点鼠标),所以无论QMT将来怎么禁,本身这个操作来自于外端系统操作,此方法可认为是万能的,想ban掉基本无解,缺点是开发学习起来稍微需要些调试,且及时性并没有特别好。
过去没有QMT和ptrade的上古时期,那个时候很多人弄量化会使用同花顺或一些券商下单软件,也是采用类似的仿真技术来模拟鼠标键盘下单,不过这样的方式下单速度肯定会有影响,毕竟物理层面的操作总有极限。
3.用os.dirlist方法,因为os库还是默认存在的,这个方法可以自行理解进行操作实践,本质还是起了信息传递的作用。
关于Output操作,这个需求一般还好,因为大多数人用QMT更在意的是读入信号,对于输出信号其实并不是刚需,不过为了未来可靠性还有及时通信要求最好还是做一些监测手段来确保各系统正常运行。
注意这类券商大QMT对于直接发送钉钉消息或者对文件进行覆盖写这个操作一般也是禁的。
一些解决方案:
1.QMT内置会把内部输出写到\userdata\log的日志中,直接用python脚本读里面的内容,如果只是想监测QMT脚本是否在正常运行,用os.path.getmtime看一下对应文件的最新修改时间,即可了解QMT是否中断或者有异常导致没有在运行。
2.QMT 对文件 IO 的限制存在 “新建允许、覆盖禁止” 的特殊规则,需要通过规避直接覆盖写、改用临时文件 / 内存缓存 + 批量写入,其实就是不要对单文件进行覆盖写,而是在后面比如加上时间戳等方法,进行新文件的生成,由于每次都是生成新文件,并没有进行相同文件的覆盖,即可绕过新建允许、覆盖禁止的设定,然后再写些脚本查看最新时间戳的信息进行转发或者后续处理即可。
各类代码教程与视频演示放于本人长期维护的量化平台 https://quantkt.com
现阶段粉丝开户福利(万0.8,etf万0.5)解锁平台会员,获取所有量化教程与框架(25年末活动,26年1月后下架此活动)



研报速递
发表评论
发表评论: