部署到云上的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     来自北京

赞同来自: commontiger 海浪9999

0

samurai

赞同来自:

好高级呀
2026-05-10 10:09 来自河南 引用
0

南天门下

赞同来自:

@X2735
应该买一台云电脑可以解决吧?真实的那种,不是VM的
如果买一台专用PC放家里007的跑,这些都不是问题。但不是所有人都有条件的,所以就有了这篇文章供大家讨论。
2026-05-10 09:04 来自北京 引用
0

X2735

赞同来自:

应该买一台云电脑可以解决吧?真实的那种,不是VM的
2026-05-10 07:59 来自广东 引用
0

南天门下

赞同来自:

@定投4638
这个把!
我现在用的是2.0.8.300
2026-04-28 21:02 来自北京 引用
0

定投4638

赞同来自:

这个把!
2026-04-28 12:22 来自广东 引用
1

takeedge

赞同来自: 南天门下

我的miniqumt运行在云服务器上也比较稳定,可以一个月都不用重启它。
所以,我使用miniqumt其实不需要UIA,远程登录一下就不用管它了。
但在用pywinauto做另一个UIA程序时,遇到了楼主所有的问题。
核心问题就是远程桌面断开后没有活动桌面可用的问题,无法直接操作鼠标和键盘,控件会失去焦点等。
试过安装虚拟显示器,但没有走通。
tscon切会话也试过,但是切换会话后,桌面会变成基础显示器的分辨率(800*600)再加上系统缩放比例200%,实际窗口将变得极小,而qt5程序在控件不可见时可能根本不会生成这个控件,或者模拟点击会失败。
我当前方案就是全部采用静默模式,不直接操作鼠标和键盘,控件占击直接调用invoke,文本框输入通过sendmessage+坐标,向父窗口发送鼠标点击该控件的消息,再用sendmessage+按键来模拟输入。
这种方式基本可行,但是目标程序自动锁定(长时间未使用)后再解锁时却经常出错,明明输入了密码点击了按钮却不能解锁。可能加上一个定时操作不让他锁定能解决这个问题,还没试。
2026-04-28 12:17 来自四川 引用
0

commontiger

赞同来自:

@定投4638
我上云看了一下,我的现在是3月3日跑的,现在都4月28日了,快两个月了,但是一般还建议1个月重启一下吧!我都快两个月么有重启过。
你这是哪个版本?这么稳定,还能安装在C盘。我运行的版本只能装D盘,每天到了晚上必定连结出问题。
2026-04-28 10:41 来自江苏 引用
0

南天门下

赞同来自:

@定投4638
到底有没有跑过的,明显问题复杂化了。
miniqmt登录几个月都不会异常崩溃,足够稳定,既然是小概率事情你把他变成每天登录,把小概率问题编变成大概率问题了。
那么崩溃怎么做呢?在客户端监视链接,miniqmt崩溃了,链接会被断开异常了,通知你去检查一下环境即可,这个才是容错设计。而不是没有问题被你折腾出问题了。
还有每次发单,成交回报都通过微信通知你,到底是成功失败不就一目了然吗?
您说的有道理,只要不是高频交易,把每次交易记录发到微信确实可以监控miniqmt的运行。
但是从软件开发和维护的角度,我认为任何常驻内存的程序都是要警惕的,即使再健壮的程序,理论上也迟早会崩溃。与其这样,还不如用Windows原生的任务计划程序管理我要跑的脚本,定时启停。再配合你说微信通知,多重保证程序稳定运行。
2026-04-28 10:19 来自北京 引用
0

南天门下

赞同来自:

@commontiger
Linkmini的方法以前用过,不稳定,废弃了。

如果你把mini运行在内网机器,云服务器只用来做内网穿透,那你前面最开始的方案就很好的解决问题了,在云服务器上遇到的麻烦事都可以避免了。
其实是可以的,但我想不是每个人家里都能有一个24小时开机的PC,所以就把mini部署到云上
2026-04-28 09:56 来自北京 引用
0

程序猿清丰

赞同来自:

每个券商都不一样,例如江海稳定的一批估计用的人少?
2026-04-28 09:28 来自北京 引用
0

lothric

赞同来自:

原来各家券商都不一样啊,开始还纳闷为什么这么麻烦,直到看见系统登陆截图。我用的某家有选项记住密码和自动登陆,就是只有qmt,不让个人申请miniqmt,不过差别不大,反正只用来通信做执行,主要代码都外面处理。
2026-04-28 09:12 来自移动 引用
0

zkguest

赞同来自:

我在云端运行几个月miniqmt都不用重启的。
2026-04-28 08:49 来自重庆 引用
0

定投4638

赞同来自:

我上云看了一下,我的现在是3月3日跑的,现在都4月28日了,快两个月了,但是一般还建议1个月重启一下吧!我都快两个月么有重启过。
2026-04-28 08:35 来自广东 引用
0

趋势交易者

赞同来自:

@定投4638
到底有没有跑过的,明显问题复杂化了。miniqmt登录几个月都不会异常崩溃,足够稳定,既然是小概率事情你把他变成每天登录,把小概率问题编变成大概率问题了。那么崩溃怎么做呢?在客户端监视链接,miniqmt崩溃了,链接会被断开异常了,通知你去检查一下环境即可,这个才是容错设计。而不是没有问题被你折腾出问题了。还有每次发单,成交回报都通过微信通知你,到底是成功失败不就一目了然吗?
可能是启用了定时重启
2026-04-28 08:06 来自上海 引用
2

定投4638

赞同来自: X2735 趋势交易者

到底有没有跑过的,明显问题复杂化了。
miniqmt登录几个月都不会异常崩溃,足够稳定,既然是小概率事情你把他变成每天登录,把小概率问题编变成大概率问题了。
那么崩溃怎么做呢?在客户端监视链接,miniqmt崩溃了,链接会被断开异常了,通知你去检查一下环境即可,这个才是容错设计。而不是没有问题被你折腾出问题了。
还有每次发单,成交回报都通过微信通知你,到底是成功失败不就一目了然吗?
2026-04-28 08:04 来自广东 引用
0

趋势交易者

赞同来自:

mark
2026-04-28 07:22 来自上海 引用
0

commontiger

赞同来自:

Linkmini的方法以前用过,不稳定,废弃了。

如果你把mini运行在内网机器,云服务器只用来做内网穿透,那你前面最开始的方案就很好的解决问题了,在云服务器上遇到的麻烦事都可以避免了。
2026-04-28 07:13 来自江苏 引用
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 来自四川 引用
1

伽南

赞同来自: 趋势交易者

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

要回复问题请先登录注册

发起人

问题状态

  • 最新活动: 2026-05-10 10:09
  • 浏览: 3189
  • 关注: 39