@echo off chcp 65001 >nul setlocal enabledelayedexpansion :: ================= 配置选项 ================= :: 1. 自动获取当前脚本所在目录 set "WORK_DIR=%~dp0" :: 2. 设置启动文件 set "SCRIPT_NAME=run.py" :: 3. 是否使用 uv 管理器 (1=是, 0=否) set USE_UV=1 :: 4. 显示输出到屏幕还是日志文件 (1=屏幕, 0=日志文件) set SHOW_OUTPUT=1 :: 5. 失败重启配置 set MAX_RETRIES=10 set RETRY_COUNT=0 set RETRY_WAIT=10 :: 6. 日志目录 (仅在 SHOW_OUTPUT=0 时生效) set "LOG_DIR=%WORK_DIR%logs\launcher" :: =========================================== cd /d "%WORK_DIR%" title QMT 自动化交易系统 [准备中] :: 构建启动命令前缀 if "%USE_UV%"=="1" ( set "CMD_PREFIX=uv run python" ) else ( set "CMD_PREFIX=python" ) :: 日志与日期初始化 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" ) :START_LOOP cls echo ================================================== echo QMT 交易系统守护进程启动 echo 工作目录: %WORK_DIR% echo 启动命令: %CMD_PREFIX% %SCRIPT_NAME% if "%SHOW_OUTPUT%"=="0" ( echo 输出模式: [日志文件] %LOG_FILE% echo 注意: 窗口将不会显示运行日志,请查看上方文件。 echo 提示: 如需停止,建议直接关闭窗口。 ) else ( echo 输出模式: [屏幕控制台] echo 提示: 按 Ctrl+C 可终止程序。 ) echo ================================================== :LOOP_BODY if %RETRY_COUNT% GEQ %MAX_RETRIES% ( if "%SHOW_OUTPUT%"=="0" echo [%time%] !!! 达到最大重试次数 !!! >> "%LOG_FILE%" color 0C echo. :: 【修复】将圆括号改为中括号,防止 if 块被提前截断 echo [错误] 达到最大重试次数 [%MAX_RETRIES%],系统停止重启。 echo 请检查代码或环境配置。 title QMT 系统 - 已停止 pause exit /b 1 ) title QMT 系统 [运行中] - 重试: %RETRY_COUNT% 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%" ) set EXIT_CODE=%errorlevel% :: 判断退出原因 if %EXIT_CODE% EQU 0 ( echo. :: 【修复】将圆括号改为中括号 echo [%time%] 程序正常结束 [Exit Code: 0]。 if "%SHOW_OUTPUT%"=="0" echo [%time%] 程序正常结束。 >> "%LOG_FILE%" title QMT 系统 - 已完成 pause exit /b 0 ) else if %EXIT_CODE% EQU -1073741510 ( echo. :: 【修复】将圆括号改为中括号 echo [%time%] 检测到用户手动中断 [Ctrl+C]。守护进程将停止。 exit /b 0 ) set /a RETRY_COUNT+=1 title QMT 系统 [等待重启] - 倒计时 echo. echo -------------------------------------------------- echo [%time%] 警告: 进程意外崩溃! [Code: %EXIT_CODE%] echo [%time%] 将在 %RETRY_WAIT% 秒后尝试第 %RETRY_COUNT%/%MAX_RETRIES% 次重启... echo -------------------------------------------------- if "%SHOW_OUTPUT%"=="0" ( echo [%time%] 异常退出 Code:%EXIT_CODE%,%RETRY_WAIT%秒后重启... >> "%LOG_FILE%" ) timeout /t %RETRY_WAIT% >nul goto LOOP_BODY