MT5代理服务:新增自动重连机制和开机自启脚本

- 所有API端点请求前自动检查MT5连接,断开时自动重连
- 新增start_all.bat开机自启脚本(MT5 + 代理服务)
- 新增setup_autostart.ps1注册Windows计划任务

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
silencesdg
2026-05-14 13:34:57 +08:00
parent c46cbcb36a
commit cacca80e11
3 changed files with 43 additions and 0 deletions
+22
View File
@@ -31,6 +31,21 @@ _provider = LiveDataProvider()
_lock = threading.Lock()
def _ensure_connected():
"""检查 MT5 连接,断开时自动重连"""
import MetaTrader5 as mt5
if mt5.terminal_info() is not None:
return True
logger.warning("MT5 连接已断开,尝试重连...")
with _lock:
ok = _provider.initialize()
if ok:
logger.info("MT5 重连成功")
else:
logger.error("MT5 重连失败")
return ok
@asynccontextmanager
async def lifespan(app: FastAPI):
with _lock:
@@ -77,6 +92,7 @@ def api_shutdown():
@app.get("/api/price/{symbol}")
def api_price(symbol: str):
_ensure_connected()
with _lock:
data = _provider.get_current_price(symbol)
if data is None:
@@ -88,6 +104,7 @@ def api_price(symbol: str):
@app.get("/api/historical/{symbol}/{timeframe}/{count}")
def api_historical(symbol: str, timeframe: int, count: int):
_ensure_connected()
with _lock:
rates = _provider.get_historical_data(symbol, timeframe, count)
if rates is None:
@@ -97,6 +114,7 @@ def api_historical(symbol: str, timeframe: int, count: int):
@app.get("/api/account")
def api_account():
_ensure_connected()
with _lock:
info = _provider.get_account_info()
if info is None:
@@ -106,6 +124,7 @@ def api_account():
@app.get("/api/positions/{symbol}")
def api_positions(symbol: str):
_ensure_connected()
with _lock:
positions = _provider.get_positions(symbol)
if positions is None:
@@ -115,6 +134,7 @@ def api_positions(symbol: str):
@app.get("/api/symbol/{symbol}")
def api_symbol(symbol: str):
_ensure_connected()
with _lock:
info = _provider.get_symbol_info(symbol)
if info is None:
@@ -124,6 +144,7 @@ def api_symbol(symbol: str):
@app.post("/api/order")
def api_order(req: OrderRequest):
_ensure_connected()
with _lock:
result = _provider.send_order(req.symbol, req.order_type, req.volume)
if result is None:
@@ -133,6 +154,7 @@ def api_order(req: OrderRequest):
@app.post("/api/close")
def api_close(req: CloseRequest):
_ensure_connected()
with _lock:
success = _provider.close_position(req.ticket, req.symbol, req.volume)
return {"success": success}
+5
View File
@@ -0,0 +1,5 @@
$action = New-ScheduledTaskAction -Execute "D:\projects\mt5_python_ea_suite\run\start_all.bat" -WorkingDirectory "D:\projects\mt5_python_ea_suite\run"
$trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Days 0)
Register-ScheduledTask -TaskName "MT5_EA_Suite_AutoStart" -Action $action -Trigger $trigger -Settings $settings -Description "MT5 + Proxy Server AutoStart" -Force
Write-Host "Done: MT5_EA_Suite_AutoStart registered"
+16
View File
@@ -0,0 +1,16 @@
@echo off
REM MT5 EA Suite 开机自启脚本
REM 1. 启动 MT5 终端
REM 2. 等待 MT5 初始化
REM 3. 启动代理服务
echo [%date% %time%] 启动 MT5 ...
start "" "E:\Program Files\MetaTrader 5\terminal64.exe"
echo [%date% %time%] 等待 MT5 初始化 (30秒) ...
timeout /t 30 /nobreak >nul
echo [%date% %time%] 启动代理服务 ...
cd /d "D:\projects\mt5_python_ea_suite"
python -m run.server