部署到云上的mini-qmt策略脚本如何保证稳定运行

mini-qmt常驻内存带来的问题
上一篇文章我说到,将mini-qmt启动后,才能正确执行策略脚本。xtquant 只是一个客户端 SDK,它本身不包含任何数据和交易能力,必须连接到正在运行的 miniQMT 进程才能工作。
但是只要有一些开发经验的同学就会想到,一个常驻内存而又没守护进程的程序,很难保证不会崩溃。实际上我就遇到几次,收盘后上券商APP,发现逆回购并没有成交,登录到云服务器才发现,mini-qmt客户端崩了,只好手动重启。
有没有办法让它不死呢?
有的。
就是在它自己死掉或者被操作系统杀掉之前,先给它杀了,先下手为强,再重启。

如何执行脚本启动mini-qmt
上一篇文章我说到,将mini-qmt启动后,才能正确执行策略脚本。xtquant 只是一个客户端 SDK,它本身不包含任何数据和交易能力,必须连接到正在运行的 miniQMT 进程才能工作。
杀掉mini-qmt的进程很简单,但是启动就很麻烦。因为需要在mini-qmt启动窗口输入账号密码,shell或者bat脚本就很难完成任务。这时我们就要用到AutoIt。
简单地说,AutoIt是一个让电脑自动"假装人在操作鼠标和键盘"的工具。
打个比方:
你每天上班要做一件重复的事——打开某个软件,点几下按钮,填一些表格,再保存。这件事要做100遍。
你不想自己做,但又没人帮你写复杂的程序。
这时候你用 AutoIt 写几行简单的脚本:
点击桌面上的"XXX软件"图标
等待它打开
在"姓名"框里输入"张三"
点击"保存"按钮
然后运行它,电脑就会自动替你做完这100遍,跟真人操作一模一样。
明白了吧?我们需要设置一个windows任务计划,在每天交易时间之前,任务计划执行AutoIt脚本,像真人一样打开mini-qmt客户端,输入账号密码登录,然后执行一天的交易。最后在收盘后,结束mini-qmt进程。第二天重复同样的操作,周而复始。这样就会避免因为mini-qmt常驻内存造成意外退出。
执行AutoIt脚本的前提是需要AutoIt运行环境,从AutoIt官网下载,目前最新版本是3.3.18.0 Released。
脚本的编写可以求助AI。

一个坑:本地运行和云服务器运行AutoIt脚本的区别
在测试时,我发现本地运行良好的脚本,在云服务器上无法正确启动mini-qmt客户端。脚本的执行很玄学,有时候能正常登录mini-qmt,有时候用户名那栏输入的是密码,有时候没反应。
一顿搜索问AI后,找到了原因。
这是经典的云服务器GUI自动化时序问题,本质原因有三层:
1. 渲染延迟比本地慢得多
云服务器走 RDP/VNC,窗口"标题出现" ≠ "控件已可交互"。输入框可能还没渲染完,Send方法就已经打出去了——打到了空气里,或者打到了上一个焦点控件上。
2. Send方法依赖焦点,云环境焦点极不稳定RDP 会话切换、UAC、后台服务抢焦点都会导致Send方法打偏。account → TAB → password
序列,如果 TAB 切换时焦点已经跑掉,密码就会填进账号框。
3. 没有控件级定位,全靠键盘盲打
本地肌肉记忆式的Send TAB键
在云上就纯粹靠运气了,有一定概率会失焦。

核心思路:
放弃Send盲打,改用ControlSetTex 直接操作控件,同时加入健壮的等待和验证逻辑。
按照豆包给出的新代码,需要用 Au3Info.exe 在云桌面上查出账号、密码框的实际CLASS和INSTANCE。但我发现我找不到mini-qmt登录框的CLASS和INSTANCE!可以看到下图中红框里面Basic Control Info是空的。


继续拷问AI,回复说mini-qmt是基于Qt5框架开发的,Qt5的输入框对 AutoIt的控件探测完全不透明,ControlSetText 不会生效。
于是它给出了第三种方法:窗口相对坐标点击法。
其实就是一点一点试出填写用户名和密码还有登录案件的坐标在哪。
还是上一张图中,下面的Position是mini-qmt登录框左上角的坐标。所以在新的脚本中,先是调用WinGetPos方法获取登录框左上角的坐标,然后设置一个大概的偏移量,先执行一下看看能不能捕捉到登录框、密码框和登录按键,多试几次就能成功。


当然这种方法也不是没有缺点,如果云服务器的分辨率有变化,或者mini-qmt的登录框布局变了,就要修改脚本。如果很多人用这个脚本,就会带来很大的维护压力。
但是,如果关掉远程桌面,这个脚本还有用吗?

第二个坑:退出云服务器的远程桌面连接(RDP)导致AutoIt脚本失效
我们不能一直开着云服务的远程桌面连接(RDP),一旦关掉RDP,脚本就失效了,mini-qmt客户端会停在登录界面。
RDP连接中 → Session处于 Active 状态 → 有虚拟显示器 → AutoIt GUI正常
RDP断开后 → Session变为 Disconnected → 虚拟显示器消失 → 窗口无法渲染/激活 → MouseClick/Send 失效
一劳永逸的办法是安装虚拟显示器驱动,但不知道是我选择的云服务器的问题还是Windows Server 2016的问题,我装了几个虚拟显示器驱动程序都没用,只能放弃。
最终解决方案
写一个批处理脚本,脚本的作用是断开 RDP 前,执行一条命令把会话转移到控制台,让它保持Active而非Disconnecte。


然后将这个脚本设置为Windows任务计划程序,在AutoIt脚本执行之前1分钟执行。
执行后,tscon把会话转移到console,RDP连接会断开。这样对于AutoIt脚本来说,显示器并没有关掉,桌面还在,就能找到用户/密码框和登录按钮了。
虽然市面上有些方案推荐安装虚拟显示器驱动,但这往往伴随着驱动兼容性风险。相比之下,我更倾向于这个tscon批处理脚本。它极其轻量,0安装,只需在你关闭RDP前双击这个bat文件,它就能优雅地把你当前的活动会话移交给系统的控制台,然后自动断开你的连接。对于追求系统洁癖的开发者来说,这就是一个完美的轻量级方案。
发表时间 2026-04-27 11:21     来自北京

赞同来自: 海浪9999

0

均金无忌 - 旅居泰国的退休工人

赞同来自:

还是 在 本地机器上 跑跑 安心。
2026-04-28 01:31 来自美国 引用
1

boeing767

赞同来自: 海浪9999

Pywinauto+ddddocr就行了,autoit估计不如按键精灵好用
2026-04-27 22:36 来自北京 引用
0

南天门下

赞同来自:

@quantech
miniqmt自动登录
http://book.piginzoo.com/knowledge/develope/miniqmt.html#xtminiqmt%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95
我目测了一下,登录时的确有这个文件然后马上被删除。但只有第一次登录的时候才有,退出后再登录就没了
2026-04-27 15:22 来自北京 引用
0
2026-04-27 14:46 来自北京 引用
0

伟博秀图

赞同来自:

破解客户端登录协议,才能稳定!
2026-04-27 14:39 来自广东 引用
0

南天门下

赞同来自:

@伽南
不用mini-qmt,直接用qmt不可以吗?qmt不是自带编程环境吗?
qmt自带的线上编程环境没有断点调试和版本管理。非交易时间还可能登不上去。
mini-qmt更符合程序员的开发习惯,在熟悉的开发环境,开发调试更自由一些。
2026-04-27 14:47修改 来自北京 引用
0

南天门下

赞同来自:

@国金证券
每天重启了?
不知道什么时候会异常退出,只好每天重启一下了
2026-04-27 14:26 来自北京 引用
0

国金证券 - 证券优惠开户 - - 国金证券是头部互联网券商,极优惠佣金及利率,专业程序化交易、期权、减持税务咨询、企业投融资等服务

赞同来自:

每天重启了?
2026-04-27 13:43 来自四川 引用
0

伽南

赞同来自:

不用mini-qmt,直接用qmt不可以吗?qmt不是自带编程环境吗?
2026-04-27 12:45 来自四川 引用

要回复问题请先登录注册

发起人

问题状态

  • 最新活动: 2026-04-28 01:31
  • 浏览: 622
  • 关注: 16