From f76b38d1f506ab480c5a4eb01955e5adf2e0060a Mon Sep 17 00:00:00 2001 From: zhiyong Date: Sun, 11 May 2025 21:05:48 +0800 Subject: [PATCH] feat: restart mini qmt software on working day --- src/config.py | 2 ++ src/trade_server.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/config.py b/src/config.py index 5e2ee0c..0c20e09 100644 --- a/src/config.py +++ b/src/config.py @@ -32,6 +32,8 @@ class Config: # XtQuant 相关配置 XT_ACCOUNT = "80391818" XT_PATH = r'C:\\江海证券QMT实盘_交易\\userdata_mini' + XT_LAUNCHER_PATH = r'C:\\江海证券QMT实盘_交易\\bin.x64\\XtItClient.exe' + XT_RESTART_TIME = "09:00" # 重连相关配置 XT_RECONNECT_INTERVAL = 3600 # 重连尝试间隔(秒) diff --git a/src/trade_server.py b/src/trade_server.py index ef66653..37a0a53 100644 --- a/src/trade_server.py +++ b/src/trade_server.py @@ -1,6 +1,8 @@ import schedule import threading import time +import subprocess +import os from real.xt_trader import XtTrader from flask import Flask, request, abort, jsonify from config import Config @@ -169,10 +171,46 @@ def logout_on_trading_day(): logger.info("今天不是交易日,跳过登出操作") +def restart_qmt(): + try: + # 检查QMT路径是否存在 + if not os.path.exists(Config.XT_LAUNCHER_PATH): + logger.error(f"QMT启动路径不存在: {Config.XT_LAUNCHER_PATH}") + return + + # 先关闭所有QMT进程(XtItClient.exe) + try: + # Windows下关闭进程 + kill_cmd = f'taskkill /F /IM XtItClient.exe' + result = subprocess.run(kill_cmd, shell=True, capture_output=True, text=True) + if result.returncode == 0: + logger.info("已关闭所有XtItClient.exe进程") + else: + logger.warning(f"关闭XtItClient.exe进程时返回码: {result.returncode}, 输出: {result.stdout}, 错误: {result.stderr}") + except Exception as e: + logger.error(f"关闭QMT进程时发生异常: {str(e)}") + + # 尝试启动QMT软件 + subprocess.Popen(Config.XT_LAUNCHER_PATH) + logger.info(f"已启动QMT软件: {Config.XT_LAUNCHER_PATH}") + except Exception as e: + logger.error(f"重启QMT软件时发生错误: {str(e)}") + +# 定时任务:在交易日重启QMT软件 +def restart_qmt_on_trading_day(): + """仅在交易日执行QMT软件重启操作""" + if BaseTrader.is_trading_date(): + logger.info("今天是交易日,执行QMT软件重启操作") + restart_qmt() + else: + logger.info("今天不是交易日,跳过QMT软件重启") + + def setup_scheduler(): # 设置每日任务,仅在交易日执行 schedule.every().day.at(Config.MARKET_OPEN_TIME).do(login_on_trading_day) schedule.every().day.at(Config.MARKET_CLOSE_TIME).do(logout_on_trading_day) + schedule.every().day.at(Config.XT_RESTART_TIME).do(restart_qmt_on_trading_day) # 启动调度线程 scheduler_thread = threading.Thread(target=_run_scheduler, daemon=True)