@echo off chcp 65001 >nul setlocal enabledelayedexpansion :: ================= 配置选项 ================= :: 1. 自动获取当前脚本所在目录 set "WORK_DIR=%~dp0" :: 2. 设置启动文件 set "SCRIPT_NAME=run.py" :: 3. 失败重启配置 set MAX_RETRIES=10 set RETRY_COUNT=0 set RETRY_WAIT=15 :: 4. 日志配置 set "LOG_DIR=%WORK_DIR%logs\launcher" :: =========================================== cd /d "%WORK_DIR%" title QMT 自动化交易系统 [监控中] if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" :: 优化日期获取逻辑,防止由于区域设置导致的非法文件名字符 for /f "tokens=1-3 delims=-/ " %%a in ("%date%") do ( set "Y=%%a" set "M=%%b" set "D=%%c" ) set "TODAY=%Y%-%M%-%D%" set "LOG_FILE=%LOG_DIR%\launcher_%TODAY%.log" cls echo ================================================== echo QMT 交易系统守护进程启动 echo 工作目录: %WORK_DIR% echo 启动文件: %SCRIPT_NAME% echo 监控地址: http://localhost:8001 echo 日志文件: %LOG_FILE% echo ================================================== :LOOP if %RETRY_COUNT% GEQ %MAX_RETRIES% ( echo [%time%] !!! 达到最大重试次数,系统停止重启 !!! >> "%LOG_FILE%" color 0C echo 错误: 系统多次崩溃,请检查日志后手动重启。 msg * "QMT 系统异常崩溃且无法自动恢复,请检查日志!" goto FAIL ) echo [%time%] 正在启动交易引擎 (第 %RETRY_COUNT% 次重启)... :: 注意:这里将 >>> 改成了 ^>^>^> 进行转义,或者直接改用 === echo [%time%] ^>^>^> 启动子进程: uv run %SCRIPT_NAME% >> "%LOG_FILE%" :: 启动程序 (使用 -u 参数确保输出实时刷新到日志) :: 如果你没有安装 uv,请将 uv run 改为 python uv run python -u %SCRIPT_NAME% >> "%LOG_FILE%" 2>&1 set EXIT_CODE=%errorlevel% if %EXIT_CODE% EQU 0 ( echo [%time%] 程序正常关闭。 >> "%LOG_FILE%" echo 程序运行结束。 pause exit /b 0 ) set /a RETRY_COUNT+=1 echo [%time%] 程序异常退出,Code: %EXIT_CODE% >> "%LOG_FILE%" echo -------------------------------------------------- echo [%time%] 警告: 进程意外中断! (退出码: %EXIT_CODE%) echo [%time%] 将在 %RETRY_WAIT% 秒后尝试第 %RETRY_COUNT% 次重启... echo -------------------------------------------------- timeout /t %RETRY_WAIT% >nul goto LOOP :FAIL title QMT 系统已停机 echo. echo ========================================== echo 守护进程已停止。 echo 请查看日志: %LOG_FILE% echo ========================================== pause exit /b 1