Files
NewStock/qmt/start.bat

134 lines
3.7 KiB
Batchfile
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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. 是否使用 Conda 环境 (1=是, 0=否)
set USE_CONDA=0
:: 7. 日志目录 (仅在 SHOW_OUTPUT=0 时生效)
set "LOG_DIR=%WORK_DIR%logs\launcher"
:: ===========================================
:: 解析命令行参数
: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
cd /d "%WORK_DIR%"
title QMT 自动化交易系统 [准备中]
:: 激活 Conda 环境
if "%USE_CONDA%"=="1" (
echo [%time%] 正在激活 Conda 环境 [stock]...
call conda activate stock
)
:: 构建启动命令前缀
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