MT5 远程控制系统 — 规格文档

2026-05-05 58℃

# MT5 远程控制系统 — 规格文档

 

**版本**: v1.0  

**日期**: 2026-05-05  

**运行环境**: Windows VPS(MT5 终端 + Python 3.11+)  

**架构**: 纯 Python(零 EA),MetaTrader5 库直连 MT5 终端

 

---

 

## 目录

 

1. [架构概述](#1-架构概述)

2. [项目结构](#2-项目结构)

3. [MT5 终端配置要求](#3-mt5-终端配置要求)

4. [Python 服务端设计](#4-python-服务端设计)

5. [REST API 接口定义](#5-rest-api-接口定义)

6. [WebSocket 协议](#6-websocket-协议)

7. [安全设计](#7-安全设计)

8. [部署步骤](#8-部署步骤)

9. [运维指南](#9-运维指南)

10. [附录:技术选型说明](#10-附录技术选型说明)

 

---

 

## 1. 架构概述

 

### 1.1 系统拓扑

 

```

┌──────────────────── Windows VPS ────────────────────────┐

│                                                          │

│  ┌──────────────────┐    ┌───────────────────────────┐  │

│  │    MT5 终端       │    │     Python 控制服务         │  │

│  │                   │    │                           │  │

│  │  • 已登录交易账号  │◄───│  • MetaTrader5 (IPC)     │  │

│  │  • 终端保持运行    │    │  • FastAPI (REST API)    │  │

│  │  • 自动重启配置    │    │  • WebSockets (实时推送)  │  │

│  └──────────────────┘    │  • asyncio (异步IO)       │  │

│                           │  • 日志系统 (loguru)      │  │

│                           └────────┬──────────────────┘  │

│                                    │                      │

│                           HTTPS :8080 / WSS :8081        │

└────────────────────────────┬───────┴──────────────────────┘

                             │

                    ┌────────┴──────────┐

                    │   远程客户端        │

                    │                   │

                    │  • 手机 / 平板     │

                    │  • 本地 PC         │

                    │  • 其他服务器       │

                    │  • 自动化脚本       │

                    └────────────────────┘

```

 

### 1.2 交互模式

 

| 模式 | 协议 | 用途 | 方向 |

|:----|:----|:----|:----|

| **控制** | REST (HTTPS) | 下单、改单、撤单、查询 | 远程 → VPS |

| **查询** | REST (HTTPS) | 账户/持仓/行情/K线/指标 | 远程 → VPS |

| **推送** | WebSocket (WSS) | 实时报价、成交推送、P&L变化 | VPS → 远程 |

 

### 1.3 核心依赖

 

| 组件 | 技术 | 版本要求 |

|:----|:----|:---------|

| Python | CPython | 3.11+ |

| MT5 接口 | MetaTrader5 (pip) | ≥5.0.45 |

| Web 框架 | FastAPI | ≥0.110 |

| 异步 | uvicorn + asyncio | — |

| WebSocket | websockets (FastAPI built-in) | — |

| 日志 | loguru | — |

| 安全 | pyjwt + passlib[bcrypt] | — |

 

---

 

## 2. 项目结构

 

```

C:\MT5Controller\

├── main.py                    # 服务入口(FastAPI app + 启动逻辑)

├── config.yaml                # 配置文件(端口、Token、白名单等)

├── requirements.txt           # Python 依赖

├── core/

│   ├── __init__.py

│   ├── mt5_client.py          # MetaTrader5 封装(连接/重连/交易/查询)

│   ├── command_queue.py       # 命令队列(异步任务编排)

│   ├── heartbeat.py           # MT5 终端心跳检测 + 自动重连

│   └── event_bus.py           # 事件总线(报价/成交/持仓变化通知)

├── api/

│   ├── __init__.py

│   ├── routes_account.py      # /api/v1/account/* (账户信息)

│   ├── routes_trade.py        # /api/v1/order/* (交易操作)

│   ├── routes_market.py       # /api/v1/symbol/*, /api/v1/rates/* (市场数据)

│   └── ws_handler.py          # WebSocket 连接管理

├── security/

│   ├── __init__.py

│   ├── auth.py                # Token 生成/验证

│   ├── ip_whitelist.py        # IP 白名单检查

│   └── rate_limiter.py        # API 频率限制

├── models/

│   ├── __init__.py

│   ├── order.py               # 订单数据模型(pydantic)

│   ├── account.py             # 账户数据模型

│   └── market.py              # 行情数据模型

├── scripts/

│   ├── install_service.bat    # 安装为 Windows 服务

│   ├── restart_mt5.bat        # 重启 MT5 终端脚本

│   └── start.bat              # 手动启动脚本

└── logs/

    └── .gitkeep               # 日志文件目录

```

 

---

 

## 3. MT5 终端配置要求

 

### 3.1 基本要求

 

| 项目 | 要求 |

|:----|:------|

| 操作系统 | Windows Server 2016/2019/2022 或 Windows 10/11 |

| MT5 版本 | 最新 Build(≥4000) |

| 交易账号 | 已登录并保持在线 |

| 自动交易 | **启用**(工具 → 选项 → EA交易 → 允许自动交易) |

| DDE | 无需额外配置(mt5python 使用内置 IPC) |

 

### 3.2 终端保活配置

 

**Windows 任务计划程序** — MT5 崩溃后自动重启:

 

```

触发器: 系统启动时

操作: 启动 "C:\Program Files\MetaTrader 5\terminal64.exe"

参数: /portable (如使用便携版)

条件: 选中"唤醒计算机运行此任务"

```

 

**MT5 内置保活:**

- 工具 → 选项 → EA 交易 → 勾选「当系统重启时自动启动 EA」

 

**监控脚本** (`scripts/restart_mt5.bat`):

 

```bat

@echo off

tasklist /FI "IMAGENAME eq terminal64.exe" 2>NUL | find /I /N "terminal64.exe" >NUL

if "%ERRORLEVEL%"=="1" (

    start "" "C:\Program Files\MetaTrader 5\terminal64.exe"

    echo %date% %time% MT5 restarted >> C:\MT5Controller\logs\mt5_monitor.log

)

```

→ 配合任务计划每 5 分钟执行一次。

 

---

 

## 4. Python 服务端设计

 

### 4.1 核心模块

 

#### 4.1.1 `core/mt5_client.py` — MT5 连接封装

 

**职责:**

- MT5 终端初始化与连接管理

- 所有 MT5 操作的统一封装

- 自动重连(终端/网络中断后恢复)

 

**关键接口:**

 

```python

class MT5Client:

    async def initialize(self) -> bool       # 连接 MT5 终端

    async def shutdown(self)                  # 断开连接

    async def is_connected(self) -> bool      # 检查连接状态

    

    # ——— 交易 ———

    async def order_send(self, request: TradeRequest) -> TradeResult

    async def order_modify(self, ticket: int, **params) -> bool

    async def order_close(self, ticket: int) -> bool

    async def close_all(self, symbol: str = None) -> List[TradeResult]

    

    # ——— 查询 ———

    async def get_account_info(self) -> AccountInfo

    async def get_positions(self, symbol: str = None) -> List[Position]

    async def get_orders(self, symbol: str = None) -> List[Order]

    async def get_history(self, from_date: datetime, to_date: datetime) -> List[Deal]

    

    # ——— 行情 ———

    async def get_symbol_info(self, symbol: str) -> SymbolInfo

    async def get_tick(self, symbol: str) -> Tick

    async def get_rates(self, symbol: str, tf: int, count: int) -> List[Rate]

    async def get_rates_range(self, symbol: str, tf: int, 

                               from_dt: datetime, to_dt: datetime) -> List[Rate]

    

    # ——— 指标 ———

    async def get_indicator(self, symbol: str, tf: int, 

                            name: str, **params) -> List[float]

```

 

**重连策略:**

 

```

MT5 初始化失败 / 连接断开

  └─ 等待 5 秒重试

  └─ 指数退避(5s → 10s → 20s → 30s → 上限60s)

  └─ 最多重试 10 次

  └─ 仍失败 → 记录日志,返回错误,等待下一次心跳检查

```

 

#### 4.1.2 `core/event_bus.py` — 事件总线

 

**职责:**

- Tick 报价流订阅与分发

- 账户变化事件通知

- 成交结果推送

 

```python

class EventBus:

    async def subscribe_ticks(self, symbols: List[str], ws_client_id: str)

    async def unsubscribe_ticks(self, ws_client_id: str)

    async def broadcast_account_update(self, account: AccountInfo)

    async def broadcast_trade_result(self, result: TradeResult)

```

 

#### 4.1.3 `core/heartbeat.py` — 终端保活

 

**职责:**

- 每 10 秒检查 MT5 连接状态

- 调用 MT5 终端进程存活检查

- 失联时触发重连流程

- 日志记录所有状态变化

 

**心跳 Tick 推送:**

 

```

每收到一个新的 Tick(约 100-500ms 间隔),

通过 WebSocket 推送给所有订阅了该品种的客户端。

```

 

### 4.2 启动流程

 

```

1. 读取 config.yaml

2. 初始化日志系统

3. 初始化 MT5Client(连接 MT5 终端)

4. 启动 Heartbeat(后台协程)

5. 启动 EventBus

6. 启动 FastAPI(uvicorn :8080)

7. 启动 WebSocket(:8081)

8. 注册信号处理(SIGTERM 优雅关闭)

 

全程如果 MT5 初始化失败 → 写入日志,HTTP API 返回 503

直到 MT5 连接恢复 → 自动变为可用

```

 

### 4.3 关闭流程

 

```

1. 停止接收新请求

2. 等待进行中的交易命令完成(超时 30s)

3. 关闭所有 WebSocket 连接

4. 关闭 Heartbeat

5. 断开 MT5 连接

6. 停止 uvicorn

```

 

---

 

## 5. REST API 接口定义

 

### 5.1 通用约定

 

| 项目 | 规则 |

|:----|:-----|

| 基础路径 | `/api/v1` |

| 认证方式 | `Authorization: Bearer <token>` |

| 请求体 | JSON (`application/json`) |

| 响应格式 | `{"success": true, "data": {...}}` 或 `{"success": false, "error": "..."}` |

| HTTP 状态码 | 200=成功, 400=参数错误, 401=认证失败, 403=IP拒绝, 404=不存在, 429=限流, 500=服务端错误, 503=MT5未连接 |

 

### 5.2 账户信息

 

#### `GET /api/v1/account`

 

获取完整账户信息。

 

**响应示例:**

 

```json

{

  "success": true,

  "data": {

    "login": 12345678,

    "server": "ICMarkets-Demo",

    "balance": 10000.00,

    "equity": 10523.45,

    "margin": 320.00,

    "free_margin": 10203.45,

    "margin_level": 3288.58,

    "profit": 523.45,

    "leverage": 500,

    "currency": "USD",

    "trade_allowed": true,

    "name": "Demo Account",

    "company": "IC Markets",

    "server_time": "2026-05-05T12:30:00",

    "positions_count": 2,

    "connected_since": "2026-05-05T08:00:00"

  }

}

```

 

### 5.3 持仓查询

 

#### `GET /api/v1/positions`

#### `GET /api/v1/positions?symbol=EURUSD`

 

**响应示例:**

 

```json

{

  "success": true,

  "data": [

    {

      "ticket": 987654,

      "symbol": "EURUSD",

      "type": "buy",

      "volume": 0.10,

      "open_price": 1.08500,

      "current_price": 1.08750,

      "sl": 1.08000,

      "tp": 1.09500,

      "profit": 25.00,

      "swap": -1.20,

      "commission": -0.50,

      "open_time": "2026-05-04T14:30:00",

      "magic": 0,

      "comment": ""

    }

  ]

}

```

 

### 5.4 挂单查询

 

#### `GET /api/v1/orders/pending`

 

### 5.5 开仓

 

#### `POST /api/v1/order/open`

 

**请求体:**

 

```json

{

  "symbol": "EURUSD",

  "type": "buy",

  "volume": 0.10,

  "price": 0,

  "sl": 1.08000,

  "tp": 1.09500,

  "comment": "manual",

  "magic": 12345,

  "deviation": 10

}

```

 

| 字段 | 类型 | 必填 | 说明 |

|:----|:----|:----|:-----|

| symbol | string | ✅ | 品种名,如 "EURUSD" |

| type | string | ✅ | "buy" / "sell" / "buy_limit" / "sell_limit" / "buy_stop" / "sell_stop" |

| volume | float | ✅ | 手数,最小0.01,步进0.01 |

| price | float | ❌ | 市价单填0或省略;挂单填触发价 |

| sl | float | ❌ | 止损价,0=不设 |

| tp | float | ❌ | 止盈价,0=不设 |

| comment | string | ❌ | 订单备注,最多32字符 |

| magic | int | ❌ | EA标识号,默认0 |

| deviation | int | ❌ | 允许滑点(点数),默认10 |

 

**响应示例:**

 

```json

{

  "success": true,

  "data": {

    "ticket": 100001,

    "symbol": "EURUSD",

    "type": "buy",

    "volume": 0.10,

    "open_price": 1.08650,

    "sl": 1.08000,

    "tp": 1.09500,

    "comment": "manual",

    "open_time": "2026-05-05T12:30:05.123",

    "error_code": 0,

    "error_desc": "done"

  }

}

```

 

### 5.6 改单

 

#### `POST /api/v1/order/modify`

 

**请求体:**

 

```json

{

  "ticket": 100001,

  "sl": 1.08200,

  "tp": 1.09800

}

```

 

| 字段 | 类型 | 必填 | 说明 |

|:----|:----|:----|:-----|

| ticket | int | ✅ | 订单号 |

| sl | float | ❌ | 新止损,不传则不修改 |

| tp | float | ❌ | 新止盈,不传则不修改 |

 

### 5.7 平仓

 

#### `POST /api/v1/order/close`

 

**请求体:**

 

```json

{

  "ticket": 100001

}

```

 

#### `POST /api/v1/order/close_all`

 

**请求体(可选):**

 

```json

{

  "symbol": "EURUSD"

}

```

省略 `symbol` 则全部平仓。

 

### 5.8 品种信息

 

#### `GET /api/v1/symbol/{name}`

 

**响应示例:**

 

```json

{

  "success": true,

  "data": {

    "symbol": "EURUSD",

    "bid": 1.08725,

    "ask": 1.08728,

    "spread": 3,

    "digits": 5,

    "point": 0.00001,

    "high": 1.08900,

    "low": 1.08500,

    "volume": 285000,

    "time": "2026-05-05T12:30:01.000",

    "trade_mode": "full",

    "margin_currency": "EUR",

    "session_quotes": true,

    "trade_calc_mode": "forex"

  }

}

```

 

#### `GET /api/v1/symbols`

 

列出所有可交易品种。

 

### 5.9 K线数据

 

#### `GET /api/v1/rates/{symbol}?tf=h1&count=100`

 

| 参数 | 类型 | 必填 | 默认 | 说明 |

|:----|:----|:----|:----|:-----|

| tf | string | ❌ | "h1" | 时间周期: m1,m5,m15,m30,h1,h4,d1,w1,mn |

| count | int | ❌ | 100 | K线数量,最大1000 |

 

#### `GET /api/v1/rates/{symbol}/range?tf=h1&from=2026-05-01T00:00:00&to=2026-05-05T00:00:00`

 

**响应示例:**

 

```json

{

  "success": true,

  "data": [

    {

      "time": "2026-05-05T12:00:00",

      "open": 1.08650,

      "high": 1.08780,

      "low": 1.08620,

      "close": 1.08725,

      "tick_volume": 1520,

      "spread": 2,

      "real_volume": 15200

    }

  ]

}

```

 

### 5.10 技术指标

 

#### `GET /api/v1/indicators/{symbol}?tf=h1&name=MA&period=10&shift=0&ma_method=sma&applied_price=close&count=100`

 

| 参数 | 类型 | 必填 | 默认 | 说明 |

|:----|:----|:----|:----|:-----|

| tf | string | ❌ | "h1" | 时间周期 |

| name | string | ✅ | — | 指标名: MA, EMA, RSI, MACD, BollingerBands, Stochastic, Ichimoku 等 |

| count | int | ❌ | 100 | K线数量 |

| *指标特有参数 | — | ❌ | — | 如 MA: period, ma_method, applied_price |

 

**响应示例(MA):**

 

```json

{

  "success": true,

  "data": {

    "indicator": "MA",

    "symbol": "EURUSD",

    "timeframe": "h1",

    "params": {"period": 10, "method": "sma", "applied_price": "close"},

    "values": [1.08650, 1.08655, 1.08660, ...]

  }

}

```

 

### 5.11 系统健康检查

 

#### `GET /api/v1/health`

 

```json

{

  "success": true,

  "data": {

    "status": "ok",

    "mt5_connected": true,

    "uptime_seconds": 86400,

    "active_ws_connections": 3,

    "version": "1.0.0"

  }

}

```

 

---

 

## 6. WebSocket 协议

 

### 6.1 连接

 

```

ws://<VPS_IP>:8081/api/v1/ws?token=<bearer_token>

```

 

### 6.2 客户端→服务端(订阅)

 

```json

// 订阅实时报价

{"action": "subscribe", "channel": "ticks", "symbols": ["EURUSD", "XAUUSD", "GBPUSD"]}

 

// 取消订阅

{"action": "unsubscribe", "channel": "ticks", "symbols": ["EURUSD"]}

 

// 订阅账户变化

{"action": "subscribe", "channel": "account"}

 

// 订阅成交推送

{"action": "subscribe", "channel": "trades"}

```

 

### 6.3 服务端→客户端(推送)

 

**实时报价推送:**

 

```json

{

  "channel": "tick",

  "data": {

    "symbol": "EURUSD",

    "bid": 1.08730,

    "ask": 1.08733,

    "time": "2026-05-05T12:30:01.500"

  }

}

```

 

**账户变化推送:**

 

```json

{

  "channel": "account",

  "data": {

    "balance": 10000.00,

    "equity": 10500.00,

    "profit": 500.00,

    "margin": 300.00,

    "free_margin": 10200.00,

    "positions_count": 2

  }

}

```

 

**成交推送:**

 

```json

{

  "channel": "trade",

  "data": {

    "type": "open",

    "ticket": 100002,

    "symbol": "EURUSD",

    "volume": 0.10,

    "price": 1.08650,

    "time": "2026-05-05T12:30:05.123"

  }

}

```

 

**心跳(服务端→客户端,每30秒):**

 

```json

{"action": "ping"}

```

客户端应回复 `{"action": "pong"}`,否则 60 秒后断开。

 

---

 

## 7. 安全设计

 

### 7.1 三层防护

 

| 层级 | 措施 | 实施位置 |

|:----|:-----|:---------|

| **传输层** | HTTPS (TLS 1.3) + 自签名证书 | uvicorn / nginx反向代理 |

| **认证层** | Bearer JWT Token,过期时间可配 | FastAPI middleware |

| **访问层** | IP 白名单,可配置多个 CIDR | FastAPI middleware |

 

### 7.2 Token 管理

 

**生成方式:**

 

```yaml

# config.yaml

security:

  token: "mt5-ctrl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"   # 静态 Token(推荐)

  # 或 JWT 配置:

  jwt_secret: "your-256-bit-secret-here"

  jwt_algorithm: "HS256"

  jwt_expire_minutes: 1440                               # 24小时

```

 

**HTTP Header:**

```

Authorization: Bearer mt5-ctrl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

```

 

**Token 轮换:**

- 静态 Token 方式:重启服务时更新 `config.yaml` 的 Token,通过 RDP 或远程管理工具安全修改

- JWT 方式:增加 `/api/v1/auth/login` 获取新 Token(需主 Token 认证)

 

### 7.3 IP 白名单

 

```yaml

# config.yaml

security:

  ip_whitelist:

    enabled: true

    allowed_ips:

      - "192.168.1.0/24"         # 内网段

      - "203.0.113.0/24"         # 授权的远程 IP 段

      - "your.home.ip.addr/32"   # 具体的家庭/办公 IP

```

 

**注意:** 白名单只对 REST API 生效。WebSocket 连接同样需要 Token 认证。

 

### 7.4 操作控制

 

```yaml

# config.yaml

trading:

  max_order_volume: 10.0         # 单笔最大手数

  max_total_positions: 50        # 最大持仓数

  max_daily_loss: 1000.0         # 每日最大亏损(0=不限制)

  allowed_symbols:               # 空=所有品种

    - "EURUSD"

    - "XAUUSD"

    - "GBPUSD"

  read_only_mode: false          # 只读模式(仅查询,禁止交易)

```

 

### 7.5 API 频率限制

 

```yaml

# config.yaml

rate_limit:

  enabled: true

  requests_per_minute: 60        # 每分钟最大请求数

  burst: 10                      # 短时突发上限

```

 

---

 

## 8. 部署步骤

 

### 8.1 环境准备

 

```

1. Windows VPS 购买 & RDP 连接

   ├─ 推荐配置:2C4G, 40GB SSD, Windows Server 2019+

   └─ 开放端口:8080(TCP), 8081(TCP) 在防火墙中

 

2. 安装 MT5 终端

   ├─ 从经纪商官网下载安装

   ├─ 登录交易账号

   ├─ 工具 → 选项 → EA 交易 → 勾选「允许自动交易」

   └─ 确认市场报价窗口已打开

 

3. 安装 Python 3.11+

   ├─ 下载 python-3.11.x-amd64.exe

   ├─ 安装时勾选「Add Python to PATH」

   └─ 打开 CMD 验证: python --version

```

 

### 8.2 Python 依赖安装

 

```bat

cd C:\MT5Controller

pip install -r requirements.txt

```

 

**requirements.txt:**

 

```

fastapi==0.110.0

uvicorn[standard]==0.27.0

MetaTrader5==5.0.45

pyjwt==2.8.0

passlib[bcrypt]==1.7.4

pyyaml==6.0

loguru==0.7.2

pydantic==2.5.0

websockets==12.0

cryptography==42.0.0

```

 

### 8.3 配置文件

 

**config.yaml:**

 

```yaml

server:

  host: "0.0.0.0"

  http_port: 8080

  ws_port: 8081

 

logging:

  level: "INFO"

  file: "logs/mt5_controller.log"

  rotation: "10 MB"

  retention: "30 days"

 

mt5:

  path: "C:\\Program Files\\MetaTrader 5\\terminal64.exe"

  reconnect_interval_sec: 5

  max_reconnect_attempts: 10

  heartbeat_interval_sec: 10

 

security:

  token: "mt5-ctrl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

  ip_whitelist:

    enabled: true

    allowed_ips: []

  rate_limit:

    enabled: true

    requests_per_minute: 60

    burst: 10

 

trading:

  max_order_volume: 10.0

  max_total_positions: 50

  max_daily_loss: 0.0

  allowed_symbols: []

  read_only_mode: false

```

 

### 8.4 启动

 

**手动启动:**

 

```bat

cd C:\MT5Controller

python main.py

```

 

**注册为 Windows 服务(开机自启):**

 

```bat

cd C:\MT5Controller

scripts\install_service.bat

```

 

**install_service.bat 内容:**

 

```bat

@echo off

sc create "MT5Controller" binPath="cmd /c C:\Python311\python.exe C:\MT5Controller\main.py" start=auto

sc description "MT5Controller" "MT5 Remote Control Service"

sc start "MT5Controller"

echo Service installed and started.

```

 

### 8.5 验证部署

 

```bat

# 健康检查(VPS 本机测试)

curl http://127.0.0.1:8080/api/v1/health

 

# 远程测试

curl -H "Authorization: Bearer mt5-ctrl-xxxxxxxx" https://<VPS_IP>:8080/api/v1/account

```

 

---

 

## 9. 运维指南

 

### 9.1 日志

 

日志文件位于 `C:\MT5Controller\logs\mt5_controller.log`。

 

日志轮转策略:每个文件 10MB,保留 30 天。

 

**日志格式:**

 

```

2026-05-05 12:30:00.123 | INFO     | mt5_client:initialize:42 - MT5 initialized, server: ICMarkets-Demo

2026-05-05 12:30:00.456 | INFO     | server:startup:18 - HTTP server started on :8080

2026-05-05 12:30:01.000 | DEBUG    | mt5_client:get_tick:156 - EURUSD tick: bid=1.08725 ask=1.08728

2026-05-05 12:30:05.000 | INFO     | routes_trade:open:34 - Order opened: ticket=100001 EURUSD buy 0.10 @1.08650

2026-05-05 12:30:05.001 | INFO     | ws_handler:broadcast:89 - Trade broadcast sent to 1 client(s)

```

 

### 9.2 常见问题排查

 

| 问题 | 可能原因 | 解决方案 |

|:----|:---------|:---------|

| `/api/v1/health` 返回 `mt5_connected: false` | MT5 终端未启动或未登录 | 检查 MT5 是否运行并登录 |

| 报错 `no module named 'MetaTrader5'` | 未安装依赖 | 运行 `pip install MetaTrader5` |

| 远程连接被拒绝 | 防火墙未开放端口 | Windows 防火墙添加入站规则: 8080, 8081 |

| Token 验证失败 | Token 不匹配 | 检查 `config.yaml` 中的 `security.token` |

| 下单返回 `error_code: 10018` | 交易时间外 | 检查经纪商交易时间 |

| WebSocket 频繁断开 | 网络不稳定 | 调整客户端重连间隔,服务端检查 `ping_interval` |

 

### 9.3 更新升级

 

```

1. 备份配置:copy C:\MT5Controller\config.yaml config_backup.yaml

2. 备份日志:copy C:\MT5Controller\logs logs_backup\

3. 停止服务:sc stop "MT5Controller"

4. 替换代码文件

5. 启动服务:sc start "MT5Controller"

6. 验证健康检查

```

 

### 9.4 灾难恢复

 

**MT5 终端挂死:**

- 任务管理器结束 `terminal64.exe`

- `scripts\restart_mt5.bat` 自动重启

- 服务端心跳检测到 MT5 恢复后自动重连

 

**Python 服务崩溃:**

- Windows 服务自动重启策略(`sc failure "MT5Controller" reset=86400 actions=restart/5000`)

 

**VPS 重启:**

- MT5 + Python 服务均已设为开机自启

- 启动顺序:MT5 终端(自动登录)→ Python 服务(自动连接)

 

---

 

## 10. 附录:技术选型说明

 

### 10.1 为什么跳过 EA?

 

| 对比项 | EA + Bridge | 纯 Python |

|:----|:-----------|:----------|

| 开发语言 | MQL5 + Python | **Python 单语言** |

| 编译部署 | EA 需编译 `.ex5` 放入 MT5 目录 | **无需编译,直接运行** |

| 调试 | MQL5 调试器弱,打印日志麻烦 | **Python 生态完善(pdb/IDE)** |

| 功能上限 | MQL5 标准库有限 | **Python 全生态(pandas/TA-Lib/ML)** |

| 延迟 | TCP 轮询 ~200ms | **IPC 直连 < 50ms** |

| 维护成本 | 双端代码同步 | **单端维护** |

 

### 10.2 为什么不直接使用 mt5python 从远程调用?

 

因为 mt5python 的 `initialize()` 要求 Python 进程与 MT5 终端在同一台机器上(通过 Windows IPC)。远程调用必须依赖一个本地代理服务(即本方案的 FastAPI)。

 

### 10.3 为什么不使用 nginx 反向代理?

 

架构追求**最小依赖**。在本方案中:

- FastAPI 自带 TLS(通过 uvicorn 配置证书)

- 单服务、单端口,无需 nginx 做路由

- 若未来需要多实例或多服务,可再加 nginx

 

---

 

 

非特殊说明,本博所有文章均为博主原创。