问题描述
【国金证券 QMT】
使用原生 python 时,我发现在开着 miniQMT 不关的情况下,第二天即使先 xtdata.unsubscribe_quote 取消所有当前订阅再 xtdata.subscribe_whole_quote 重新订阅,也收不到任何数据。这个时候如果重启 miniQMT 客户端才可以恢复正常,重新收到数据。
原先的 xtdata.subscribe_quote 订阅单个行情的时候,好像保持 miniQMT 一直开着就可以每天都正常收到数据。
所以我现在有以下几个疑问:
(1)正常使用 miniQMT 时,可以长期开着不关吗?如果可以的话,那为啥第二天 xtdata.subscribe_whole_quote 就收不到数据了呢?
(2)如果日常使用就是要每天重启 miniQMT 的话,官方有没有推荐的脚本可以实现免密码登录呢?
希望能有 QMT PM 或其他大佬解答下,谢谢
解决方案
针对您在使用 miniQMT 时遇到的 subscribe_whole_quote 隔日断流问题,以下是详细的解答和解决方案:
1. 正常使用 miniQMT 时,可以长期开着不关吗?
强烈建议每天定时重启,不要长期开着不关。
原因分析:
- 券商服务器夜间清算: 券商柜台和行情服务器在夜间(通常是晚上到凌晨)会进行日终清算和系统维护。在这个过程中,服务器会主动断开所有的客户端连接。
- 全推行情的特殊性:
subscribe_whole_quote(全市场行情推送)占用极大的内存和网络带宽。当夜间连接断开后,虽然底层的xtdata可能会尝试重连,但全推行情的底层状态机、内存缓存往往无法完美恢复,导致第二天即使重新调用订阅接口,也无法正常接收数据。而单只股票的订阅(subscribe_quote)由于数据量小、状态简单,重连恢复的成功率较高。 - 内存泄漏风险: 长期运行全推行情容易在本地积累大量缓存,导致 miniQMT 客户端内存占用过高甚至卡死。
最佳实践: 每天早上(如 8:30 左右)通过脚本自动关闭并重新启动 miniQMT 客户端,以确保获取到最新、最稳定的行情和交易连接。
2. 官方有没有推荐的脚本可以实现免密码登录?
出于资金安全和合规的考虑,官方没有提供直接绕过密码登录的 API 接口。但是,量化开发者通常会使用 Python 的 UI 自动化库(如 pyautogui 或 pywinauto)配合 Windows 任务计划程序来实现自动登录。
以下是一个基于 pyautogui 的自动化登录脚本示例思路:
自动化登录脚本示例 (Python)
首先,需要安装依赖库:
pip install pyautogui
然后编写自动启动并登录的脚本 auto_login.py:
import os
import time
import pyautogui
import subprocess
def restart_miniqmt():
# 1. 杀掉旧的 miniQMT 进程
print("正在关闭旧的 miniQMT 进程...")
os.system("taskkill /F /IM XtQuantClient.exe") # 请根据实际进程名修改
time.sleep(3)
# 2. 启动 miniQMT 客户端
qmt_path = r"D:\国金证券QMT交易端\XtQuantClient.exe" # 替换为你的实际路径
print("正在启动 miniQMT...")
subprocess.Popen(qmt_path)
# 3. 等待登录界面加载 (根据电脑性能调整等待时间)
time.sleep(15)
# 4. 模拟输入密码并登录
# 假设启动后焦点默认在密码输入框
password = "YourPassword123" # 替换为你的实际密码
print("正在输入密码...")
pyautogui.typewrite(password, interval=0.1)
time.sleep(1)
# 模拟按下回车键登录
pyautogui.press('enter')
print("登录指令已发送!")
if __name__ == "__main__":
restart_miniqmt()
部署建议:
- 保存密码: 大部分券商的 QMT 客户端登录界面有“记住账号”的选项,请勾选该选项,这样脚本启动时只需要输入密码即可。
- Windows 任务计划程序: 打开 Windows 的“任务计划程序”,创建一个基本任务,设置为每天早上(例如 08:40)执行上述 Python 脚本。
- 焦点问题: 使用
pyautogui时,请确保脚本运行时电脑没有被其他全屏程序占用焦点,否则密码可能会输入到错误的地方。如果需要更稳定的后台点击,可以学习使用pywinauto库通过窗口句柄(Handle)来发送文本。
通过每天盘前自动重启 miniQMT,可以彻底解决 subscribe_whole_quote 隔日断流的问题,同时保证交易系统的稳定性。