2025-12-19 14:11:32 +08:00
|
|
|
|
@echo off
|
2026-01-04 23:11:15 +08:00
|
|
|
|
chcp 65001 >nul
|
2025-12-19 14:11:32 +08:00
|
|
|
|
setlocal enabledelayedexpansion
|
|
|
|
|
|
|
2026-01-04 22:43:13 +08:00
|
|
|
|
:: ================= 配置选项 =================
|
2026-01-04 23:11:15 +08:00
|
|
|
|
:: 1. 自动获取当前脚本所在目录
|
2026-01-04 22:43:13 +08:00
|
|
|
|
set "WORK_DIR=%~dp0"
|
2026-01-27 00:52:35 +08:00
|
|
|
|
|
2026-01-04 23:11:15 +08:00
|
|
|
|
:: 2. 设置启动文件
|
2026-01-04 22:43:13 +08:00
|
|
|
|
set "SCRIPT_NAME=run.py"
|
2026-01-27 00:52:35 +08:00
|
|
|
|
|
|
|
|
|
|
:: 3. 是否使用 uv 管理器 (1=是, 0=否)
|
|
|
|
|
|
set USE_UV=1
|
|
|
|
|
|
|
|
|
|
|
|
:: 4. 显示输出到屏幕还是日志文件 (1=屏幕, 0=日志文件)
|
|
|
|
|
|
set SHOW_OUTPUT=1
|
|
|
|
|
|
|
|
|
|
|
|
:: 5. 失败重启配置
|
2026-01-04 22:43:13 +08:00
|
|
|
|
set MAX_RETRIES=10
|
2025-12-19 14:11:32 +08:00
|
|
|
|
set RETRY_COUNT=0
|
2026-01-27 00:52:35 +08:00
|
|
|
|
set RETRY_WAIT=10
|
|
|
|
|
|
|
2026-01-28 00:22:01 +08:00
|
|
|
|
:: 6. 是否使用 Conda 环境 (1=是, 0=否)
|
|
|
|
|
|
set USE_CONDA=0
|
|
|
|
|
|
|
|
|
|
|
|
:: 7. 日志目录 (仅在 SHOW_OUTPUT=0 时生效)
|
2026-01-04 22:43:13 +08:00
|
|
|
|
set "LOG_DIR=%WORK_DIR%logs\launcher"
|
2025-12-19 14:11:32 +08:00
|
|
|
|
:: ===========================================
|
|
|
|
|
|
|
2026-01-28 00:22:01 +08:00
|
|
|
|
:: 解析命令行参数
|
|
|
|
|
|
:PARSE_ARGS
|
|
|
|
|
|
if "%~1"=="" goto :END_ARGS
|
|
|
|
|
|
if /i "%~1"=="--conda" set USE_CONDA=1
|
|
|
|
|
|
if /i "%~1"=="-c" set USE_CONDA=1
|
|
|
|
|
|
shift
|
|
|
|
|
|
goto :PARSE_ARGS
|
|
|
|
|
|
:END_ARGS
|
|
|
|
|
|
|
2025-12-19 14:11:32 +08:00
|
|
|
|
cd /d "%WORK_DIR%"
|
2026-01-27 00:52:35 +08:00
|
|
|
|
title QMT 自动化交易系统 [准备中]
|
2025-12-19 14:11:32 +08:00
|
|
|
|
|
2026-01-28 00:22:01 +08:00
|
|
|
|
:: 激活 Conda 环境
|
|
|
|
|
|
if "%USE_CONDA%"=="1" (
|
|
|
|
|
|
echo [%time%] 正在激活 Conda 环境 [stock]...
|
|
|
|
|
|
call conda activate stock
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
:: 构建启动命令前缀
|
|
|
|
|
|
if "%USE_UV%"=="1" (
|
|
|
|
|
|
set "CMD_PREFIX=uv run python"
|
|
|
|
|
|
) else (
|
|
|
|
|
|
set "CMD_PREFIX=python"
|
|
|
|
|
|
)
|
2025-12-19 14:11:32 +08:00
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
:: 日志与日期初始化
|
|
|
|
|
|
if "%SHOW_OUTPUT%"=="0" (
|
|
|
|
|
|
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
|
|
|
|
|
|
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a"
|
|
|
|
|
|
set "TODAY=!dt:~0,4!-!dt:~4,2!-!dt:~6,2!"
|
|
|
|
|
|
set "LOG_FILE=%LOG_DIR%\!TODAY!.log"
|
|
|
|
|
|
)
|
2025-12-19 14:11:32 +08:00
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
:START_LOOP
|
2026-01-04 22:43:13 +08:00
|
|
|
|
cls
|
2025-12-19 14:11:32 +08:00
|
|
|
|
echo ==================================================
|
2026-01-04 22:43:13 +08:00
|
|
|
|
echo QMT 交易系统守护进程启动
|
|
|
|
|
|
echo 工作目录: %WORK_DIR%
|
2026-01-27 00:52:35 +08:00
|
|
|
|
echo 启动命令: %CMD_PREFIX% %SCRIPT_NAME%
|
|
|
|
|
|
if "%SHOW_OUTPUT%"=="0" (
|
|
|
|
|
|
echo 输出模式: [日志文件] %LOG_FILE%
|
|
|
|
|
|
echo 注意: 窗口将不会显示运行日志,请查看上方文件。
|
|
|
|
|
|
echo 提示: 如需停止,建议直接关闭窗口。
|
|
|
|
|
|
) else (
|
|
|
|
|
|
echo 输出模式: [屏幕控制台]
|
|
|
|
|
|
echo 提示: 按 Ctrl+C 可终止程序。
|
|
|
|
|
|
)
|
2025-12-19 14:11:32 +08:00
|
|
|
|
echo ==================================================
|
|
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
:LOOP_BODY
|
2025-12-19 14:11:32 +08:00
|
|
|
|
if %RETRY_COUNT% GEQ %MAX_RETRIES% (
|
2026-01-27 00:52:35 +08:00
|
|
|
|
if "%SHOW_OUTPUT%"=="0" echo [%time%] !!! 达到最大重试次数 !!! >> "%LOG_FILE%"
|
2026-01-04 22:43:13 +08:00
|
|
|
|
color 0C
|
2026-01-27 00:52:35 +08:00
|
|
|
|
echo.
|
|
|
|
|
|
:: 【修复】将圆括号改为中括号,防止 if 块被提前截断
|
|
|
|
|
|
echo [错误] 达到最大重试次数 [%MAX_RETRIES%],系统停止重启。
|
|
|
|
|
|
echo 请检查代码或环境配置。
|
|
|
|
|
|
title QMT 系统 - 已停止
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
2025-12-19 14:11:32 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
title QMT 系统 [运行中] - 重试: %RETRY_COUNT%
|
2025-12-19 14:11:32 +08:00
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
echo [%time%] 正在启动交易引擎...
|
|
|
|
|
|
if "%SHOW_OUTPUT%"=="0" (
|
|
|
|
|
|
echo [%time%] ^>^>^> 启动子进程 >> "%LOG_FILE%"
|
|
|
|
|
|
%CMD_PREFIX% -u "%SCRIPT_NAME%" >> "%LOG_FILE%" 2>&1
|
|
|
|
|
|
) else (
|
|
|
|
|
|
%CMD_PREFIX% -u "%SCRIPT_NAME%"
|
|
|
|
|
|
)
|
2025-12-19 14:11:32 +08:00
|
|
|
|
|
2026-01-04 22:43:13 +08:00
|
|
|
|
set EXIT_CODE=%errorlevel%
|
2026-01-27 00:52:35 +08:00
|
|
|
|
|
|
|
|
|
|
:: 判断退出原因
|
2026-01-04 22:43:13 +08:00
|
|
|
|
if %EXIT_CODE% EQU 0 (
|
2026-01-27 00:52:35 +08:00
|
|
|
|
echo.
|
|
|
|
|
|
:: 【修复】将圆括号改为中括号
|
|
|
|
|
|
echo [%time%] 程序正常结束 [Exit Code: 0]。
|
|
|
|
|
|
if "%SHOW_OUTPUT%"=="0" echo [%time%] 程序正常结束。 >> "%LOG_FILE%"
|
|
|
|
|
|
title QMT 系统 - 已完成
|
2026-01-04 23:11:15 +08:00
|
|
|
|
pause
|
|
|
|
|
|
exit /b 0
|
2026-01-27 00:52:35 +08:00
|
|
|
|
) else if %EXIT_CODE% EQU -1073741510 (
|
|
|
|
|
|
echo.
|
|
|
|
|
|
:: 【修复】将圆括号改为中括号
|
|
|
|
|
|
echo [%time%] 检测到用户手动中断 [Ctrl+C]。守护进程将停止。
|
|
|
|
|
|
exit /b 0
|
2026-01-04 23:11:15 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
set /a RETRY_COUNT+=1
|
2026-01-27 00:52:35 +08:00
|
|
|
|
title QMT 系统 [等待重启] - 倒计时
|
|
|
|
|
|
|
|
|
|
|
|
echo.
|
2026-01-04 23:11:15 +08:00
|
|
|
|
echo --------------------------------------------------
|
2026-01-27 00:52:35 +08:00
|
|
|
|
echo [%time%] 警告: 进程意外崩溃! [Code: %EXIT_CODE%]
|
|
|
|
|
|
echo [%time%] 将在 %RETRY_WAIT% 秒后尝试第 %RETRY_COUNT%/%MAX_RETRIES% 次重启...
|
2026-01-04 23:11:15 +08:00
|
|
|
|
echo --------------------------------------------------
|
|
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
if "%SHOW_OUTPUT%"=="0" (
|
|
|
|
|
|
echo [%time%] 异常退出 Code:%EXIT_CODE%,%RETRY_WAIT%秒后重启... >> "%LOG_FILE%"
|
|
|
|
|
|
)
|
2026-01-04 23:11:15 +08:00
|
|
|
|
|
2026-01-27 00:52:35 +08:00
|
|
|
|
timeout /t %RETRY_WAIT% >nul
|
|
|
|
|
|
goto LOOP_BODY
|