返回顶部
  • 发帖数814
  • 粉丝0

外汇保证金市场多年老散户,多年丰富经验老韭菜。

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • EA邦VIP

    EA邦vip会员
  • 论坛元老

    为论坛做出突出贡献的会员

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

[复制链接]
ymk0577Lv.8 显示全部楼层 发表于 4 小时前 |阅读模式 打印 上一主题 下一主题
# MT5 远程控制系统 — 规格文档
**版本**: v1.0
**日期**: 2026-05-05
**运行环境**: Windows VPS(MT5 终端 + Python 3.11+)
**架构**: 纯 Python(零 EA),MetaTrader5 库直连 MT5 终端
**用途示例**:   
1. 持仓检查,全/半自动化交易,账户监控,全自动日报月报等功能 (对接AI助手后)  。 
2. 配合EA邦EA交易,目前已经实测。比如,对 Hedging对冲EA的订单进行日报,分品种汇报,持仓优化建议,干预EA订单 (对接AI助手后)  。
3. 通过QQ/微信/TG等各种工具,直接自然语言操盘,比如:本日/月盈亏,下单0.01手欧美,平仓0.01手黄金,对最早的黄金订单平仓等 (对接AI助手后)  。
4. 使用各种自动化脚本控制远程服务器上的MT5交易客户端。
5. 可本地/远程,如果不希望运行在远程服务器上,也可以做少量修改,去掉远程部分,既可对接各类工具(包括AI助手)。
---
## 目录
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
---
⚠️ EA邦免责声明与风险提示:
1. 工具属性: 本文所涉及的EA软件及交易策略仅供技术交流与研究使用,不构成任何投资建议或收益承诺。
2. 入市风险: 金融市场具有高度不确定性,程序化交易并不能完全规避风险。请务必使用历史数据回测和模拟盘充分测试。
3. 决策自担: 用户根据本站内容进行实盘交易产生的所有盈亏,由本人自行承担,本站及作者不承担任何法律责任。
4. 版权说明: 转载请注明出处。不得将本站提供的软件和策略用于任何违法行为。
EBC平台官方开户链接,平台招收代理中,版主实测低点差低成本高质量平台。  *** 如需获得免费EA授权,请使用EA邦官方注册通道 ***
回复

使用道具 举报

精彩评论1

ymk0577Lv.8 显示全部楼层 发表于 3 小时前
本帖最后由 ymk0577 于 2026-5-5 13:05 编辑

服务器实测环境如下:

服务器系统 Windows Server 2019
4核16G,500G(可以使用更低的配置)
MetaTrader 5 最新版本
交易商:IC(模拟账户)  EBC(模拟账户) 以及 瑞讯银行(实盘账户)
AI助手:QwenPaw
AI模型:DeepSeek

对接AI助手后的测试内容覆盖:交易、账户、持仓、K线、指标、实时报价推送等。

其余,比如自动化Py脚本和服务器控制服务器等简单应用方向未作测试,因无测试必要的原因。



EBC平台官方开户链接,平台招收代理中,版主实测低点差低成本高质量平台。  *** 如需获得免费EA授权,请使用EA邦官方注册通道 ***
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

EA邦和EACTP仅为EA程序化交易软件服务供应商,使用EA工具进行交易,在使用前应该清楚的阅读和浏览软件相关的教程,使用软件是一种自发行为,所引发的一切法律后果,包括用户在使用过程中导致的任何损失均与EA软件开发者无关。
  • 微信

  • 微信公众号

  • 微信视频号

  • Powered by Discuz! X5.0 | Copyright © 2017-2026, 专注量化交易 | EABANG.COM
  • 和仲科技有限公司| 川公网安备 51019002005489号 | 蜀ICP备17026493号