MT5 远程控制系统 — 规格文档
<div class="ce-block ce-block--focused" data-id="dmBTNJXom1" ><div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># MT5 远程控制系统 — 规格文档</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TxLyy_2gQt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**版本**: v1.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oHGXEcNIRJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**日期**: 2026-05-05</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KQ7Lv9S09q" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**运行环境**: Windows VPS(MT5 终端 + Python 3.11+)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="seTqORFqoW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**架构**: 纯 Python(零 EA),MetaTrader5 库直连 MT5 终端</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="a87EC5RD6K" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**用途示例**: </div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fgfCNISg7K" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">1. 持仓检查,全/半自动化交易,账户监控,全自动日报月报等功能
(对接AI助手后) 。 </div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KX5unmOkZC" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2. 配合EA邦EA交易,目前已经实测。比如,对
Hedging对冲EA的订单进行日报,分品种汇报,持仓优化建议,干预EA订单
(对接AI助手后) 。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qhvRFd6FBD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3. 通过QQ/微信/TG等各种工具,直接自然语言操盘,比如:本日/月盈亏,下单0.01手欧美,平仓0.01手黄金,对最早的黄金订单平仓等
(对接AI助手后) 。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pMPSuypoie" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">4. 使用各种自动化脚本控制远程服务器上的MT5交易客户端。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MjUy-RKQ-i" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">5. 可本地/远程,如果不希望运行在远程服务器上,也可以做少量修改,去掉远程部分,既可对接各类工具(包括AI助手)。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="n5FMErOJRZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kHIkM4S7dG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 目录</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nKbYTWCBz0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">1. [架构概述](#1-架构概述)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KCxMtjJ-w0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2. [项目结构](#2-项目结构)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PWTQqvO_e0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3. (#3-mt5-终端配置要求)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BTtjJ8QsRL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">4. (#4-python-服务端设计)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_QDzQ6Ywjg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">5. (#5-rest-api-接口定义)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NGB8WmTpDj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">6. (#6-websocket-协议)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HNohzhpeTr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">7. [安全设计](#7-安全设计)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uABDQlQwQF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">8. [部署步骤](#8-部署步骤)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BKcDupo53M" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">9. [运维指南](#9-运维指南)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nPXlEFEf68" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">10. [附录:技术选型说明](#10-附录技术选型说明)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l3E3WzOzo4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jS6kZkyVVG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 1. 架构概述</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="m4h73krytH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 1.1 系统拓扑</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oh7pdiOjn7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1C-1jeSw6K" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">┌──────────────────── Windows VPS ────────────────────────┐</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Uc-pq33Jjw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="f5-F6I67Wf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│┌──────────────────┐ ┌───────────────────────────┐│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_RjCeeFzuh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">││ MT5 终端 │ │ Python 控制服务 ││</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="P7YKDgD9jU" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">││ │ │ ││</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="35arVyIc82" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">││• 已登录交易账号│◄───│• MetaTrader5 (IPC) ││</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="N4vDP0YvI0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">││• 终端保持运行 │ │• FastAPI (REST API) ││</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ahlGhG6G61" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">││• 自动重启配置 │ │• WebSockets (实时推送)││</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Y39Z15s2_D" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│└──────────────────┘ │• asyncio (异步IO) ││</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="UuYBtEV4ad" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ │• 日志系统 (loguru) ││</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yDieVFPAoR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ └────────┬──────────────────┘│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="228jsM8ebn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ │ │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uHUEE9SyBg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ HTTPS :8080 / WSS :8081 │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mv6EvzsR7y" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">└────────────────────────────┬───────┴──────────────────────┘</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="p_OFyCQDq4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="v5anjo5kIu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> ┌────────┴──────────┐</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qBOXWiXPiE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> │ 远程客户端 │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ca0ily-jcs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> │ │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kEoQvkzXwS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> │• 手机 / 平板 │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="huNMAbr4bL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> │• 本地 PC │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oeqKT58K-t" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> │• 其他服务器 │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="zaNFFWkDub" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> │• 自动化脚本 │</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uhszt_rApY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> └────────────────────┘</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="e7zlzs7GNG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ZdYMuiuiNT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 1.2 交互模式</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="h4-yMq4ml7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 模式 | 协议 | 用途 | 方向 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="2dL18Al56m" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:----|:----|:----|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="URy94AR4p-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| **控制** | REST (HTTPS) | 下单、改单、撤单、查询 | 远程 → VPS |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Cnb80B40ES" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| **查询** | REST (HTTPS) | 账户/持仓/行情/K线/指标 | 远程 → VPS |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-oRmmmcZs-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| **推送** | WebSocket (WSS) | 实时报价、成交推送、P&L变化 | VPS → 远程 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sDDcAqdi6x" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 1.3 核心依赖</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="W5WTOwugKE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 组件 | 技术 | 版本要求 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nwa6akV1Dh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:----|:---------|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KKOeeDQDB4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| Python | CPython | 3.11+ |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ytUPrKz9Cq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| MT5 接口 | MetaTrader5 (pip) | ≥5.0.45 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="n0HbqcGDMk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| Web 框架 | FastAPI | ≥0.110 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="WKVYUhi2n-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 异步 | uvicorn + asyncio | — |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="IIs9SRGNkn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| WebSocket | websockets (FastAPI built-in) | — |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="270GLdr2jz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 日志 | loguru | — |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DsPZ0nu3Bk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 安全 | pyjwt + passlib | — |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Fh5t8d8xbG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6_NLJHM5Bs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 2. 项目结构</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wik6Hj0oqS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="lId0aI_yuO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">C:\MT5Controller\</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uYLUs5vUG9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="EVgywi4TBD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── main.py # 服务入口(FastAPI app + 启动逻辑)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BND_upFbr1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── config.yaml # 配置文件(端口、Token、白名单等)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="EVxdTInZzd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── requirements.txt # Python 依赖</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="c-dVoEU2RZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9tGhb58jjz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── core/</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SX-SUtppOd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── __init__.py</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="77YrfEB1II" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── mt5_client.py # MetaTrader5 封装(连接/重连/交易/查询)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="gYR6xE7tx-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── command_queue.py # 命令队列(异步任务编排)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Pgn0p-tg0x" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── heartbeat.py # MT5 终端心跳检测 + 自动重连</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="p0oWeP7Gs6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ └── event_bus.py # 事件总线(报价/成交/持仓变化通知)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pnNdfOncVI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7w6ojb3wvP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── api/</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="O3cqoEHigj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── __init__.py</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xusVePXYB_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── routes_account.py # /api/v1/account/* (账户信息)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fvYqRt1QGJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── routes_trade.py # /api/v1/order/* (交易操作)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MuFpvGXPF0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── routes_market.py # /api/v1/symbol/*, /api/v1/rates/* (市场数据)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jQWvPGV42h" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ └── ws_handler.py # WebSocket 连接管理</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7I0aTwA9Bi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DM0VmS6VeC" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── security/</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SUUd50_BYW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── __init__.py</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eoyRUKCrpS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── auth.py # Token 生成/验证</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vXLLNWir7q" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── ip_whitelist.py # IP 白名单检查</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-W_lmqv1a5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ └── rate_limiter.py # API 频率限制</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l5FET0jr8s" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NUIVAPtus3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── models/</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Z5-hnFnJvq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── __init__.py</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ur0-cbca9G" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── order.py # 订单数据模型(pydantic)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="I44tLWiSei" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── account.py # 账户数据模型</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="n2oQDSTafb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ └── market.py # 行情数据模型</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PRpe0IIWVS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="i-A2SbufbU" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">├── scripts/</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mPz9jNJqfz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── install_service.bat # 安装为 Windows 服务</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="IPXQ87ui3w" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ ├── restart_mt5.bat # 重启 MT5 终端脚本</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_PpbRQNmih" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│ └── start.bat # 手动启动脚本</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="aanhGlctvE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">│</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DemGO8XBHN" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">└── logs/</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pbZtKJxb7g" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> └── .gitkeep # 日志文件目录</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HmL_klR4zP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CpIGanoLo7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="C0bXf6itF1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 3. MT5 终端配置要求</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7clwl6XJ-4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 3.1 基本要求</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HfjCONt4zL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 项目 | 要求 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="GJrZld0xvX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:------|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ad508Ampwp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 操作系统 | Windows Server 2016/2019/2022 或 Windows 10/11 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Q6ifP896BG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| MT5 版本 | 最新 Build(≥4000) |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nf1QAR20OD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 交易账号 | 已登录并保持在线 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="IvkLf7Jozp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 自动交易 | **启用**(工具 → 选项 → EA交易 → 允许自动交易) |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="dpp8u7TJty" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| DDE | 无需额外配置(mt5python 使用内置 IPC) |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DCyRPRk2QF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 3.2 终端保活配置</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_0AaIEFoiJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**Windows 任务计划程序** — MT5 崩溃后自动重启:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="gIrjWFnHUy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="18za2wjblL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">触发器: 系统启动时</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0529GM6Jf6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">操作: 启动 "C:\Program Files\MetaTrader 5\terminal64.exe"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oYcAGdZJHY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">参数: /portable (如使用便携版)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="A7yW7TM0IG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">条件: 选中"唤醒计算机运行此任务"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ryiLqsoiZi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MT_MdzbSG7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**MT5 内置保活:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="S0nTcGeh8e" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 工具 → 选项 → EA 交易 → 勾选「当系统重启时自动启动 EA」</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="iYgm7dNFKD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**监控脚本** (`scripts/restart_mt5.bat`):</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nJxHeSuxK2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```bat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="U0b7brVMRS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">@echo off</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="UREYw4iq5W" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">tasklist /FI "IMAGENAME eq terminal64.exe" 2>NUL | find /I /N "terminal64.exe" >NUL</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3Ap7QbuRNi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">if "%ERRORLEVEL%"=="1" (</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Py6KCZ4Y_k" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> start "" "C:\Program Files\MetaTrader 5\terminal64.exe"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VKKxLCvdZV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> echo %date% %time% MT5 restarted >> C:\MT5Controller\logs\mt5_monitor.log</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3xafqDok0b" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xWrioMjUE3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="zPiXb6xe71" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">→ 配合任务计划每 5 分钟执行一次。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l0lF6w0jsz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YJIymlr2NT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 4. Python 服务端设计</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="gfv9z4rIHz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 4.1 核心模块</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DyyIdXzG8v" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### 4.1.1 `core/mt5_client.py` — MT5 连接封装</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="prTgxt8gfE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**职责:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="96BHzmz5-S" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- MT5 终端初始化与连接管理</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="cIVg3LI4On" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 所有 MT5 操作的统一封装</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CL05zjXilm" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 自动重连(终端/网络中断后恢复)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ysHB9FJ9uB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**关键接口:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BuyKcCJPCm" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```python</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uW9DXk31H9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">class MT5Client:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HyFNCT6ryv" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def initialize(self) -> bool # 连接 MT5 终端</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="W7LWU4BL7i" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def shutdown(self) # 断开连接</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kCY9GapzmN" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def is_connected(self) -> bool # 检查连接状态</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="y1ja89WHjM" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> # ——— 交易 ———</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="s0kNPS27PU" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def order_send(self, request: TradeRequest) -> TradeResult</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="bDuld_VZAw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def order_modify(self, ticket: int, **params) -> bool</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mqb-Psz6nT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def order_close(self, ticket: int) -> bool</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7ZgofC5DAO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def close_all(self, symbol: str = None) -> List</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ZrCDI_mULV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> # ——— 查询 ———</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sFwcOrf_pu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_account_info(self) -> AccountInfo</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oqg6sRhunr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_positions(self, symbol: str = None) -> List</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="aJfYNjRnNA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_orders(self, symbol: str = None) -> List</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Rik87swHhp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_history(self, from_date: datetime, to_date: datetime) -> List</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pVE00TwdTS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> # ——— 行情 ———</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nqMLgbHTnE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_symbol_info(self, symbol: str) -> SymbolInfo</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YTJ_hzBUDK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_tick(self, symbol: str) -> Tick</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="hL8zgapdW1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_rates(self, symbol: str, tf: int, count: int) -> List</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DFOHiR3JzA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_rates_range(self, symbol: str, tf: int, </div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3cLzLJzxb9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> from_dt: datetime, to_dt: datetime) -> List</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="aEeYl7LAff" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> # ——— 指标 ———</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wLv7oAkpHp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def get_indicator(self, symbol: str, tf: int, </div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HF1L2ZWYOq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> name: str, **params) -> List</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Q3k-sGGZ6G" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="WHz5gh4eaH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**重连策略:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CDoD3qxCXv" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="UByYPgobVe" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">MT5 初始化失败 / 连接断开</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-rGACsZAsf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">└─ 等待 5 秒重试</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="2hQyOITRS3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">└─ 指数退避(5s → 10s → 20s → 30s → 上限60s)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qGb7_t_xF_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">└─ 最多重试 10 次</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eXVwCGT_tB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">└─ 仍失败 → 记录日志,返回错误,等待下一次心跳检查</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Oi0frSc20n" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-eI-PL5VJL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### 4.1.2 `core/event_bus.py` — 事件总线</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="P-IpXro4e7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**职责:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HInpatmcW6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- Tick 报价流订阅与分发</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="LKA29sVe0A" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 账户变化事件通知</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="torQvZtPFr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 成交结果推送</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BeWWxJqpkd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```python</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="GhYvqN637J" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">class EventBus:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="g9uG4tfpDo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def subscribe_ticks(self, symbols: List, ws_client_id: str)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3-mmJc90aT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def unsubscribe_ticks(self, ws_client_id: str)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pbFw38Yxgl" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def broadcast_account_update(self, account: AccountInfo)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="zTMT1anOps" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> async def broadcast_trade_result(self, result: TradeResult)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3yznJUIiJb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="2Pw0UccPbA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### 4.1.3 `core/heartbeat.py` — 终端保活</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ISNSokANFL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**职责:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7oFYS4c7qF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 每 10 秒检查 MT5 连接状态</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="W1ALJOXY78" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 调用 MT5 终端进程存活检查</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6uj8mSP0fF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 失联时触发重连流程</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wqeFidw9Be" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 日志记录所有状态变化</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="QoAY7frhtV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**心跳 Tick 推送:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nOjhWjnBXD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HHsCR_Ift9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">每收到一个新的 Tick(约 100-500ms 间隔),</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0i-phloTuG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">通过 WebSocket 推送给所有订阅了该品种的客户端。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wF8Q2s3aTZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="UJRSX3DLBw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 4.2 启动流程</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="lBLwo_KN1f" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3KQg3LecJ5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">1. 读取 config.yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xevB88iiOs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2. 初始化日志系统</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yzyYqeKbe0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3. 初始化 MT5Client(连接 MT5 终端)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vvWYr56Vrf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">4. 启动 Heartbeat(后台协程)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DEeVDfYYZi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">5. 启动 EventBus</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FHU3HZ1zfd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">6. 启动 FastAPI(uvicorn :8080)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YTZ7SaQxB7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">7. 启动 WebSocket(:8081)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="LL1ubPDXSg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">8. 注册信号处理(SIGTERM 优雅关闭)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1Gyrs7Y6U5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">全程如果 MT5 初始化失败 → 写入日志,HTTP API 返回 503</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BTDjHI-pwY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">直到 MT5 连接恢复 → 自动变为可用</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="21GR7KGYTy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CWzfoOLcLW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 4.3 关闭流程</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xpt-a_dKwH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="v77vsZdT9t" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">1. 停止接收新请求</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="c945EYDee1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2. 等待进行中的交易命令完成(超时 30s)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pv1_tjcWNZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3. 关闭所有 WebSocket 连接</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DVO2VbC6TZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">4. 关闭 Heartbeat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="gyl9OxD6ba" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">5. 断开 MT5 连接</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sZTQD4TIob" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">6. 停止 uvicorn</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="R0_KUKh-xC" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l_iWFf4Bom" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PUXwe_eqGF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 5. REST API 接口定义</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8fjaIUYmxu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.1 通用约定</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kWfqsEUTeq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 项目 | 规则 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Dkz7JfqprX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:-----|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="st0aYKeP_A" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 基础路径 | `/api/v1` |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MQy3EtkfJO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 认证方式 | `Authorization: Bearer <token>` |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0bj22OX4ce" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 请求体 | JSON (`application/json`) |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="gIuNqx5mCi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 响应格式 | `{"success": true, "data": {...}}` 或 `{"success": false, "error": "..."}` |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VWbSIsRPGm" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| HTTP 状态码 | 200=成功, 400=参数错误, 401=认证失败, 403=IP拒绝, 404=不存在, 429=限流, 500=服务端错误, 503=MT5未连接 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VHLaDgXTvA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.2 账户信息</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1_0uHufm2I" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/account`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8Q6jLzY-Ir" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">获取完整账户信息。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0qn48ei1X6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**响应示例:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="LXsQAdGIpw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VhjU_6r--u" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="s7E5jJW01I" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"success": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Ep03atCE5F" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="tsFJcV12b7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "login": 12345678,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sma8QitTzK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "server": "ICMarkets-Demo",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="V7ieyvYbh_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "balance": 10000.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ek-r0yNCTJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "equity": 10523.45,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="AuiXGdjyVp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "margin": 320.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="m56EKQC16A" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "free_margin": 10203.45,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-aidkR1Vkh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "margin_level": 3288.58,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6qJlBbyrhS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "profit": 523.45,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="WAv3-k0ybQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "leverage": 500,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8StCLHo5wa" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "currency": "USD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kMoB7zkQCM" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "trade_allowed": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-B8AMu-4r1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "name": "Demo Account",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NwYIOXwost" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "company": "IC Markets",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-yeJ5jpFKE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "server_time": "2026-05-05T12:30:00",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="f1G-V7y4Bu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "positions_count": 2,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="hrdh8Dd_VJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "connected_since": "2026-05-05T08:00:00"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-JeWx60-Wy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uv6-AfR9d8" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9i14VXUKdI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xIQ7OkuVne" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.3 持仓查询</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eQRfyRHJnB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/positions`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wWo9118ltw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/positions?symbol=EURUSD`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="71FWIvFoIy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**响应示例:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Ckh_G0EHKd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pGUT92x2kA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fIpkjU0-is" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"success": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="la900PxfFX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": [</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="O939Ke9nwg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DZs5s_N_f9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "ticket": 987654,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Y9tJgwODpk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "symbol": "EURUSD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KH0Ud-GmpX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "type": "buy",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5ApmyEKc2Z" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "volume": 0.10,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6zd1j8EFjV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "open_price": 1.08500,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Sq0WozvyR9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "current_price": 1.08750,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Monb2OFe1-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "sl": 1.08000,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="bv2ck8D52l" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "tp": 1.09500,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="igA3QQwRXS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "profit": 25.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Xj8D5pi-5r" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "swap": -1.20,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0jIGtB0Db4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "commission": -0.50,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="itP_9-_TFA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "open_time": "2026-05-04T14:30:00",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KAt6aJm0q-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "magic": 0,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vzOKchCtDI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "comment": ""</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kzRGXu7gdu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> }</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="gJaaucjr-d" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">]</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="M5duGVmj-L" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vXkSFKSb-1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SVKgejhVGY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.4 挂单查询</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="QZuYIY2Dq9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/orders/pending`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="j6hwp2W6qk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.5 开仓</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="40JgNWOLrg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `POST /api/v1/order/open`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wxcfVuEHS9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**请求体:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jMAOo5iCuT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pO-v9WQWcy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="f8Yh1qeMJJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"symbol": "EURUSD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8feGMduyfA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"type": "buy",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="srgsWCb-90" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"volume": 0.10,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kdwnQ4sRDs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"price": 0,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VP2JkmgPfd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"sl": 1.08000,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BkqQXom_15" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"tp": 1.09500,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-bCcT5JfCB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"comment": "manual",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="4Fhfy0qNoj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"magic": 12345,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5OXEKfuLb3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"deviation": 10</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YaB_ch0h4z" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KtoLPPU1Ce" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="M1O_iDEDBq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 字段 | 类型 | 必填 | 说明 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="b0OyyB9ark" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:----|:----|:-----|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ytcqD7lvgW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| symbol | string | ✅ | 品种名,如 "EURUSD" |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sK1sWPfQvO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| type | string | ✅ | "buy" / "sell" / "buy_limit" / "sell_limit" / "buy_stop" / "sell_stop" |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DBwLSK-WcJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| volume | float | ✅ | 手数,最小0.01,步进0.01 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7iX0fStUtT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| price | float | ❌ | 市价单填0或省略;挂单填触发价 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FfYNhvK4Qo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| sl | float | ❌ | 止损价,0=不设 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="bU-KOsTDKX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| tp | float | ❌ | 止盈价,0=不设 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0GV2xaYUQ8" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| comment | string | ❌ | 订单备注,最多32字符 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="QdzZWvuBFN" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| magic | int | ❌ | EA标识号,默认0 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xONE3bJwiB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| deviation | int | ❌ | 允许滑点(点数),默认10 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MZVdhA0SU3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**响应示例:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TdOg6BBdnO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YhFuJ-uA0K" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="RV_USUZXig" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"success": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="C5Ca8slJMe" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Q9FbMApD2E" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "ticket": 100001,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="prBkTr1sB2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "symbol": "EURUSD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3BYxTRuoo6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "type": "buy",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BSCwFlKHXp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "volume": 0.10,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="X2INMpz5FP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "open_price": 1.08650,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="GbkPxAV1mX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "sl": 1.08000,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Lwplh1U4Df" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "tp": 1.09500,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NwgiEgG45Z" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "comment": "manual",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="QDDMxWUuW6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "open_time": "2026-05-05T12:30:05.123",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NDAGdIl07V" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "error_code": 0,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3IQCEftPi7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "error_desc": "done"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9oitXfHkKz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3MVMwj5b8o" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yjK0LcFgqr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uQZTvwPhCI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.6 改单</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ocF90fxTuj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `POST /api/v1/order/modify`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9c4hLuwtTs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**请求体:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="4_8JpAvuMQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ONNEh-Yb9X" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jXW2FLn1JJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"ticket": 100001,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0Px3OpVa2d" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"sl": 1.08200,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nL2hApXEdh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"tp": 1.09800</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VmpIbeF4wd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="K2q8WVBSt1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NfUIjF-Fdn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 字段 | 类型 | 必填 | 说明 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3ZiM7Kr6y8" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:----|:----|:-----|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6t9CV9wXlC" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| ticket | int | ✅ | 订单号 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SZyMf-9zI1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| sl | float | ❌ | 新止损,不传则不修改 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="t-yNe9aHUS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| tp | float | ❌ | 新止盈,不传则不修改 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="t39eSjDIEb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.7 平仓</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YD6yOX6ZlC" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `POST /api/v1/order/close`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Jpha-qmk6d" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**请求体:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7P8XAPTCk8" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="hnTo2aAsdA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ygwGJRQsyC" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"ticket": 100001</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="aRhvq1_AU1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="15qM9i0VLk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ZYuGxiRF1O" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `POST /api/v1/order/close_all`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TBW5cYxeQA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**请求体(可选):**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pLlcTTnn24" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="acjPdBygyn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="M8UFAJkvT1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"symbol": "EURUSD"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6L_xEzkFo0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fN-gZH4jMo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Uhi7j5KGSr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">省略 `symbol` 则全部平仓。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PzMSozm9T_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.8 品种信息</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VzV32mOSpf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/symbol/{name}`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6ATxc-fXzb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**响应示例:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_CkEpuVxQ9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Wo64uxfjqh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Je0e1xKoeL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"success": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ftJaXRLTqP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ibqeyr_Y-2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "symbol": "EURUSD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="dbIH6JA8Nb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "bid": 1.08725,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="biVp8GHhRe" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "ask": 1.08728,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="C4AczzshNe" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "spread": 3,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SxPM9PAXYH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "digits": 5,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="zj-c1SDBn8" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "point": 0.00001,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="EMGDJNHx1n" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "high": 1.08900,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="E0s80U8Nk-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "low": 1.08500,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="a-0HiS78Jo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "volume": 285000,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="j8O6gmueRK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "time": "2026-05-05T12:30:01.000",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Xj9qerUCIM" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "trade_mode": "full",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="iCGuKoUd_Y" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "margin_currency": "EUR",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nBndvOT0Pd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "session_quotes": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DsB84x3uzn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "trade_calc_mode": "forex"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="lGaKwg4F7R" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jdOmQHk8D8" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1b9CmfktEH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FT5SHFk08N" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/symbols`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Z6090eGh4l" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">列出所有可交易品种。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="LBpc_V7-eP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.9 K线数据</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="k8QLtqK7pc" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/rates/{symbol}?tf=h1&count=100`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="GV-rC87Koo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 参数 | 类型 | 必填 | 默认 | 说明 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="valq8haVpE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:----|:----|:----|:-----|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="__hzXIN3B4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| tf | string | ❌ | "h1" | 时间周期: m1,m5,m15,m30,h1,h4,d1,w1,mn |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Sffgl0RQgx" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| count | int | ❌ | 100 | K线数量,最大1000 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ITrwW8mPy5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/rates/{symbol}/range?tf=h1&from=2026-05-01T00:00:00&to=2026-05-05T00:00:00`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Vpl9Vdh7ib" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**响应示例:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rMx6glD_rI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Fzj_PSBAE2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7_3ADh_mZK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"success": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7XhlhpEHHS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": [</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="e2d85o5PNj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Lez2OnXHC3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "time": "2026-05-05T12:00:00",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="w1TV24p0s1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "open": 1.08650,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="lE5Du7TYFk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "high": 1.08780,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="AzO_mCbpLS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "low": 1.08620,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HPCXgTuElv" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "close": 1.08725,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PGpubGuJme" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "tick_volume": 1520,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CvymR3Y9bt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "spread": 2,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="at_OkmhQlX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "real_volume": 15200</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sDGqIZcfvz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> }</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mXrlx2Diw2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">]</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SsHxI_YwCU" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="XK2IwgcZJy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="WSBn7L-6lZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.10 技术指标</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="WA1Le9UJMW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/indicators/{symbol}?tf=h1&name=MA&period=10&shift=0&ma_method=sma&applied_price=close&count=100`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9J-dTPZDPG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 参数 | 类型 | 必填 | 默认 | 说明 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nnHwHybjSN" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:----|:----|:----|:-----|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0la17Bl-OR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| tf | string | ❌ | "h1" | 时间周期 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="XFwjanFC8M" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| name | string | ✅ | — | 指标名: MA, EMA, RSI, MACD, BollingerBands, Stochastic, Ichimoku 等 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BfUZ6NqRKQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| count | int | ❌ | 100 | K线数量 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PH0uHdZ83V" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| *指标特有参数 | — | ❌ | — | 如 MA: period, ma_method, applied_price |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MZMkX4TT2N" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**响应示例(MA):**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="cUX5vwSfTS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="50jQFrIYPQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="En-0nM34FT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"success": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="p7OJixW8vI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="RN_VSo3HhE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "indicator": "MA",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FM6Ev2Pdyo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "symbol": "EURUSD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="lfyvJLpYK4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "timeframe": "h1",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yIz9WuYzHB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "params": {"period": 10, "method": "sma", "applied_price": "close"},</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="B4XeWCGUf5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "values": </div>
</div>
</div><div class="ce-block ce-block--focused" data-id="htuPF5FUf9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_1XQDejh7D" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KMx-zzFT79" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SbJ-9VfmDm" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 5.11 系统健康检查</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="El3-Uo0nQs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">#### `GET /api/v1/health`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sxMQOiy2CH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="dh7px-VOU4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rzuFS7Ta4m" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"success": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="LCpWNpYwSn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="q6AmadiDPV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "status": "ok",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NjzAzMS_u5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "mt5_connected": true,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="S1op8CGXcz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "uptime_seconds": 86400,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Nxn47IzePw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "active_ws_connections": 3,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MJgLU3wmkq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "version": "1.0.0"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="otGWSzPtbZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="2ZojAM8ufl" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qZFVT0Bhqt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0c2PHoWn5K" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DihJXBQu9L" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 6. WebSocket 协议</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="i5sLnNqLPM" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 6.1 连接</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pKqu83Cm8U" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="a3O-qVhwc1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">ws://<VPS_IP>:8081/api/v1/ws?token=<bearer_token></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="suev6Q3bW0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9oZVbtGU_7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 6.2 客户端→服务端(订阅)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="r_GJt4t2By" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sanc5mKmNl" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">// 订阅实时报价</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1rKuAsbzl_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{"action": "subscribe", "channel": "ticks", "symbols": ["EURUSD", "XAUUSD", "GBPUSD"]}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NLrABJ9Ymk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">// 取消订阅</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6FYtwE7L5_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{"action": "unsubscribe", "channel": "ticks", "symbols": ["EURUSD"]}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oLLnibtT7q" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">// 订阅账户变化</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SG9XYgy0mb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{"action": "subscribe", "channel": "account"}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fdsH6NFMMP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">// 订阅成交推送</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yx29pkn5KB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{"action": "subscribe", "channel": "trades"}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FkHvnk8elT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="bk3xU7W-bR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 6.3 服务端→客户端(推送)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="GYM3SQZXwt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**实时报价推送:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="C-GSfOVrgW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="O41zI8Eezu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="IzE4fgmlEe" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"channel": "tick",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="thfgH5-E9K" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="s381SHY_CI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "symbol": "EURUSD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SJj_NcMp3f" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "bid": 1.08730,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mgt42Bhrkv" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "ask": 1.08733,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="hHTaNNrrH5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "time": "2026-05-05T12:30:01.500"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Kx180ObC7N" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-b88Aiy3fc" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8ofznUrI-4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="B_DQNr-ZgE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**账户变化推送:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mekstrei7l" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8oRbCmKBce" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fdsS3D3O0U" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"channel": "account",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9yNZV4JyaM" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ZnMg5zxh0S" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "balance": 10000.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="OdoOlF5gsE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "equity": 10500.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="hDByuhm1dx" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "profit": 500.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="iszkKtv6rR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "margin": 300.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wJjD5QaTNT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "free_margin": 10200.00,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CIgPXnIH1Q" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "positions_count": 2</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SGFg8i0dQB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yaVSTM3diP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="RAADKIJN_w" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="E6ykFL7jGK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**成交推送:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yGD3aNLma9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="paSzW2D7bh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3kre2nnl_O" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"channel": "trade",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="hAFocEvgBs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">"data": {</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MKixps8Ui9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "type": "open",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="n0v1k2fejk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "ticket": 100002,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_ZnzfkW0H2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "symbol": "EURUSD",</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rsCakZXpXE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "volume": 0.10,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="F1KL5OpuUu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "price": 1.08650,</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="V5SWGA-FY6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> "time": "2026-05-05T12:30:05.123"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="b8Q7yMqj8w" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1g3zEETzNl" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="U68iI8wyS4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kbZfLlFj9W" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**心跳(服务端→客户端,每30秒):**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Pk-90ZojmT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```json</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KVYAIveEdb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">{"action": "ping"}</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TOudcZhj4j" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Efq4dTkjHY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">客户端应回复 `{"action": "pong"}`,否则 60 秒后断开。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qaQlrRu4xK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wiAte3v_gq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 7. 安全设计</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KN-1OKQsor" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 7.1 三层防护</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="tXZlrxPeBf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 层级 | 措施 | 实施位置 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6waFQ7LuFM" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:-----|:---------|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="lvtK00Wvpp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| **传输层** | HTTPS (TLS 1.3) + 自签名证书 | uvicorn / nginx反向代理 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="zbqnB8mXkk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| **认证层** | Bearer JWT Token,过期时间可配 | FastAPI middleware |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="IGvQZ5xhXY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| **访问层** | IP 白名单,可配置多个 CIDR | FastAPI middleware |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kSN-kBDyXV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 7.2 Token 管理</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8vS86dGo89" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**生成方式:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="A_-5beHq73" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7vLsAFzipm" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># config.yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_7YMuytNG2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">security:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VOzJdOdBGO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">token: "mt5-ctrl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 静态 Token(推荐)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7JwAewKHzV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># 或 JWT 配置:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="koMK0QLKRQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">jwt_secret: "your-256-bit-secret-here"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rCq-ApbiRg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">jwt_algorithm: "HS256"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="zwa20uiBpO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">jwt_expire_minutes: 1440 # 24小时</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Uc5nxUcVoh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1BaA85Hfux" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**HTTP Header:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="m-nseMBOjd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="joNwV4ZU2C" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Authorization: Bearer mt5-ctrl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-FDYlP57Yz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="cM5iUbXlTh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**Token 轮换:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Xf5hH7wsVb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 静态 Token 方式:重启服务时更新 `config.yaml` 的 Token,通过 RDP 或远程管理工具安全修改</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7CxubaxP1Z" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- JWT 方式:增加 `/api/v1/auth/login` 获取新 Token(需主 Token 认证)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qiGTF3Fmwj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 7.3 IP 白名单</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vlJMdhrzcZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="utrq4tGP6p" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># config.yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DVsuxO2Tqh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">security:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3o4iCcFFx9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">ip_whitelist:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nkAb4XNmOe" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> enabled: true</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="aKfUlGYIkV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> allowed_ips:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eTAIvYBdTC" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> - "192.168.1.0/24" # 内网段</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="iotit_uv--" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> - "203.0.113.0/24" # 授权的远程 IP 段</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6cmOsLhrnz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> - "your.home.ip.addr/32" # 具体的家庭/办公 IP</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eP4F7tuUBK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_OnzYk0nsE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**注意:** 白名单只对 REST API 生效。WebSocket 连接同样需要 Token 认证。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="EZ4YkgPy_9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 7.4 操作控制</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="F2VHwcgeFX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="OGMAHx-zxf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># config.yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="12MoXrJd43" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">trading:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0YCnFn96td" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">max_order_volume: 10.0 # 单笔最大手数</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-fzNFy42CL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">max_total_positions: 50 # 最大持仓数</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="teGgs29YzQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">max_daily_loss: 1000.0 # 每日最大亏损(0=不限制)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Ymt2t5V7G3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">allowed_symbols: # 空=所有品种</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="i31KvZeWhq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> - "EURUSD"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fHwxLxjBW5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> - "XAUUSD"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FUg7Y5XX1O" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> - "GBPUSD"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="a0ksNN0dgs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">read_only_mode: false # 只读模式(仅查询,禁止交易)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="cMX4amfHqy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jXNEz1yYUb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 7.5 API 频率限制</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="C1tD47uxIO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8jewJbb5jF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># config.yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="tBtYRpmdeU" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">rate_limit:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="i0QzJsyhDL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">enabled: true</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="lJ8BPI9mdu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">requests_per_minute: 60 # 每分钟最大请求数</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="WA8AkeMATv" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">burst: 10 # 短时突发上限</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="--qwvRxar5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5nnPlbeaW7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fin_FPQ-g9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 8. 部署步骤</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5wDs0Z7wbL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 8.1 环境准备</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ON7XMialZG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Kwc1AqKids" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">1. Windows VPS 购买 & RDP 连接</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FNNbQF5DWb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> ├─ 推荐配置:2C4G, 40GB SSD, Windows Server 2019+</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0USopxKe7U" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> └─ 开放端口:8080(TCP), 8081(TCP) 在防火墙中</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="P56P8QXpRm" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2. 安装 MT5 终端</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pwJLA7UUxH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> ├─ 从经纪商官网下载安装</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="s3GE9GS08E" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> ├─ 登录交易账号</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jfrApk94Xe" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> ├─ 工具 → 选项 → EA 交易 → 勾选「允许自动交易」</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="t_zbdHuqEq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> └─ 确认市场报价窗口已打开</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ajscf3Yg8J" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3. 安装 Python 3.11+</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xiC8pTQTaO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> ├─ 下载 python-3.11.x-amd64.exe</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Mm_8SLncGS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> ├─ 安装时勾选「Add Python to PATH」</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="2-CChsUWUw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> └─ 打开 CMD 验证: python --version</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HOLGRo2_Po" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PQthWBpyBO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 8.2 Python 依赖安装</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vHKJCMvUBk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```bat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="gZgwuQdxWy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">cd C:\MT5Controller</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3jPJFUcq8w" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">pip install -r requirements.txt</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="JBy1pshHsg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VWzBAnhrfy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**requirements.txt:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="T2adzgCQHK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="p0nBkXuuVY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">fastapi==0.110.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="XouXh2ZliH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">uvicorn==0.27.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SJzdsda2j9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">MetaTrader5==5.0.45</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Nol54fUJrj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">pyjwt==2.8.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="d5fcubNlC5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">passlib==1.7.4</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="VVpYb0oHxZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">pyyaml==6.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CFDpTr5J_T" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">loguru==0.7.2</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ELnn45lUlH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">pydantic==2.5.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="D7-J4hRV3n" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">websockets==12.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5uBUJDn717" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">cryptography==42.0.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ogxBTuMrsz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qniR_VJPnn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 8.3 配置文件</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_n8P8jRjeu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**config.yaml:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Bxsz7Mus7V" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="T5ZYdJgxhJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">server:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sw0_-JlIXO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">host: "0.0.0.0"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ZbrYeN28Dy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">http_port: 8080</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="k62gwZvKHJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">ws_port: 8081</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BUtcRGBJjq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">logging:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="U0-qRylSv2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">level: "INFO"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fv0mijfBfo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">file: "logs/mt5_controller.log"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Arz6ptCLtw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">rotation: "10 MB"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="47w7xxE0zW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">retention: "30 days"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="291CCHcYKI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">mt5:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HgkmrFhYpt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">path: "C:\\Program Files\\MetaTrader 5\\terminal64.exe"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CiM3k8FRPi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">reconnect_interval_sec: 5</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rHwCkFjw-f" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">max_reconnect_attempts: 10</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Y4nIn42oHL" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">heartbeat_interval_sec: 10</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Vai69_BEdg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">security:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="tan_uD3zBI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">token: "mt5-ctrl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="G7muw_PGS_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">ip_whitelist:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8TB5kIabZX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> enabled: true</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fTPA8dmg1p" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> allowed_ips: []</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="u34pVWZ5pl" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">rate_limit:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="I4GpiiBIdP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> enabled: true</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="57M8LtyoOs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> requests_per_minute: 60</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NVxIEbAh_j" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"> burst: 10</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Zk-P8nQNvy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">trading:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wNJzXusopZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">max_order_volume: 10.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="y7TQSITgBE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">max_total_positions: 50</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pBgRf0Algw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">max_daily_loss: 0.0</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NMy_RFClm6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">allowed_symbols: []</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7Ausi2Vz9b" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">read_only_mode: false</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oSr6dgCuk4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Tk2u2zO6NS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 8.4 启动</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="tiDRbLR4IV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**手动启动:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8ItVtbZ5vj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```bat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uUtRR3Sar5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">cd C:\MT5Controller</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="JYGg6ozdHY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">python main.py</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pjmsjj9KZd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HOn1BX3RAR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**注册为 Windows 服务(开机自启):**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qUX0D4cLb7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```bat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HeNQznEehi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">cd C:\MT5Controller</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="UY4Kep4DAA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">scripts\install_service.bat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l0TKEnDenB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="tsuO8LkM0f" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**install_service.bat 内容:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="JziOoF2Kyf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```bat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Xa3KBZk_q6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">@echo off</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="4d6XUjhJS7" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">sc create "MT5Controller" binPath="cmd /c C:\Python311\python.exe C:\MT5Controller\main.py" start=auto</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="BbP2Ch3FMD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">sc description "MT5Controller" "MT5 Remote Control Service"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l30kvCYuUB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">sc start "MT5Controller"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="okU9mCSdAx" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">echo Service installed and started.</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NAFZmKOOxA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="EyXcEVqVyp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 8.5 验证部署</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="IOmkF_4QxJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```bat</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DNyWNfWCCd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># 健康检查(VPS 本机测试)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5PV42ShIQP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">curl http://127.0.0.1:8080/api/v1/health</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_mNLaIja2W" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"># 远程测试</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7Dat7gi-fU" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">curl -H "Authorization: Bearer mt5-ctrl-xxxxxxxx" https://<VPS_IP>:8080/api/v1/account</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TzN3KE1Csw" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fLQE05EjlF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mntcry3wY1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 9. 运维指南</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="4wy1sN1X1Q" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 9.1 日志</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="zB4kFSVEwK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">日志文件位于 `C:\MT5Controller\logs\mt5_controller.log`。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="aZwT0F2J3Y" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">日志轮转策略:每个文件 10MB,保留 30 天。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rTe5CEm7qp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**日志格式:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="E3La1RhLH4" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="DD8fYa5o37" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2026-05-05 12:30:00.123 | INFO | mt5_client:initialize:42 - MT5 initialized, server: ICMarkets-Demo</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="IYjYF6D3f_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2026-05-05 12:30:00.456 | INFO | server:startup:18 - HTTP server started on :8080</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="RIDrzV7u0U" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2026-05-05 12:30:01.000 | DEBUG | mt5_client:get_tick:156 - EURUSD tick: bid=1.08725 ask=1.08728</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mF6E0d6jbA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2026-05-05 12:30:05.000 | INFO | routes_trade:open:34 - Order opened: ticket=100001 EURUSD buy 0.10 @1.08650</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xTAF0ffR8l" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2026-05-05 12:30:05.001 | INFO | ws_handler:broadcast:89 - Trade broadcast sent to 1 client(s)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FF3MKRRp8E" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="XbVcWRyPne" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 9.2 常见问题排查</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="D3YcV-mSud" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 问题 | 可能原因 | 解决方案 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fPUwxf8HER" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:---------|:---------|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1OCVTjLJz_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| `/api/v1/health` 返回 `mt5_connected: false` | MT5 终端未启动或未登录 | 检查 MT5 是否运行并登录 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6rrsuNp5oP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 报错 `no module named 'MetaTrader5'` | 未安装依赖 | 运行 `pip install MetaTrader5` |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="64uJwqoSQ3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 远程连接被拒绝 | 防火墙未开放端口 | Windows 防火墙添加入站规则: 8080, 8081 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="g-xxhz92rs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| Token 验证失败 | Token 不匹配 | 检查 `config.yaml` 中的 `security.token` |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nq2IJYzwvQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 下单返回 `error_code: 10018` | 交易时间外 | 检查经纪商交易时间 |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="d5SE3XTYgE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| WebSocket 频繁断开 | 网络不稳定 | 调整客户端重连间隔,服务端检查 `ping_interval` |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TnodzrV2S3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 9.3 更新升级</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Zpg1dq6wZ6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="OXSh56Li1f" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">1. 备份配置:copy C:\MT5Controller\config.yaml config_backup.yaml</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="hpa0nh1A0z" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2. 备份日志:copy C:\MT5Controller\logs logs_backup\</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="n2M9dkUErg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3. 停止服务:sc stop "MT5Controller"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5bwrDyOnIH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">4. 替换代码文件</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ThjvxEvuoN" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">5. 启动服务:sc start "MT5Controller"</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="88FeEcK06K" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">6. 验证健康检查</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MciV08PqU-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">```</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0FvlnKZ5kd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 9.4 灾难恢复</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oJdUi9Rbg9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**MT5 终端挂死:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_lGlkmKdzl" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 任务管理器结束 `terminal64.exe`</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8_WPsQPpdm" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- `scripts\restart_mt5.bat` 自动重启</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Gq3LdP9lxp" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 服务端心跳检测到 MT5 恢复后自动重连</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l2-wVkPx54" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**Python 服务崩溃:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Yy3MwkfmoU" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- Windows 服务自动重启策略(`sc failure "MT5Controller" reset=86400 actions=restart/5000`)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="I4hhVBFYT5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">**VPS 重启:**</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="QGTca2mH28" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- MT5 + Python 服务均已设为开机自启</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3jyWmr3Qsr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 启动顺序:MT5 终端(自动登录)→ Python 服务(自动连接)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nahJc10mBb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NSgkdqImIh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">## 10. 附录:技术选型说明</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="umYMysKVmB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 10.1 为什么跳过 EA?</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="78-rJ2EydZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 对比项 | EA + Bridge | 纯 Python |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="sCbKKT3k7B" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">|:----|:-----------|:----------|</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="r6Tu8o4skg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 开发语言 | MQL5 + Python | **Python 单语言** |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="OrZVuT-Ubo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 编译部署 | EA 需编译 `.ex5` 放入 MT5 目录 | **无需编译,直接运行** |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TV3IWcu7iz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 调试 | MQL5 调试器弱,打印日志麻烦 | **Python 生态完善(pdb/IDE)** |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="esdkkDeA50" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 功能上限 | MQL5 标准库有限 | **Python 全生态(pandas/TA-Lib/ML)** |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kwyY_xfhSM" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 延迟 | TCP 轮询 ~200ms | **IPC 直连 < 50ms** |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="yViOSZ-9Z5" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">| 维护成本 | 双端代码同步 | **单端维护** |</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5wUeUoJ23G" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 10.2 为什么不直接使用 mt5python 从远程调用?</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="liwte0kWqj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">因为 mt5python 的 `initialize()` 要求 Python 进程与 MT5 终端在同一台机器上(通过 Windows IPC)。远程调用必须依赖一个本地代理服务(即本方案的 FastAPI)。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kP86k1z9V1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">### 10.3 为什么不使用 nginx 反向代理?</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CmoIDkj281" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">架构追求**最小依赖**。在本方案中:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6xZiuN4gqn" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- FastAPI 自带 TLS(通过 uvicorn 配置证书)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rfMeJAzLsc" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 单服务、单端口,无需 nginx 做路由</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7SYSyfqSuN" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">- 若未来需要多实例或多服务,可再加 nginx</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rJJEHJVeAT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">---</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="QBv38wM-vz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">*<a href="https://www.yun.ovh/34618402/5.html" target="_blank" rel="nofollow">汇客-黑色 原创文章</a>*</div>
</div>
</div><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.ce-paragraph {
line-height: 1.6em;
outline: none;
text-indent: 2em;
font-size: 16px;
}
.ce-paragraph--right {
text-align: right;
}
.ce-paragraph--center {
text-align: center;
}
.ce-paragraph--left {
text-align: left;
}
.ce-paragraph--justify {
text-align: justify;
}
.ce-paragraph-text-indent {
text-align: justify;
}
.ce-paragraph:empty::before{
content: attr(data-placeholder);
color: #707684;
font-weight: normal;
opacity: 0;
}
/** Show placeholder at the first paragraph if Editor is empty */
.codex-editor--empty .ce-block:first-child .ce-paragraph:empty::before {
opacity: 1;
}
.codex-editor--toolbox-opened .ce-block:first-child .ce-paragraph:empty::before,
.codex-editor--empty .ce-block:first-child .ce-paragraph:empty:focus::before {
opacity: 0;
}
.ce-paragraph p:first-of-type{
margin-top: 0;
}
.ce-paragraph p:last-of-type{
margin-bottom: 0;
}
.svg-icon {
width: 1em;
height: 1em;
}
.svg-icon path,
.svg-icon polygon,
.svg-icon rect {
fill: #4691f6;
}
.svg-icon circle {
stroke: #4691f6;
stroke-width: 1;
}
</style><style type="text/css">
.inline-code {
background: rgba(250, 239, 240, 0.78);
color: #b44437;
padding: 3px 4px;
border-radius: 5px;
margin: 0 1px;
font-family: inherit;
font-size: 0.86em;
font-weight: 500;
letter-spacing: 0.3px;
}
</style> 本帖最后由 ymk0577 于 2026-5-5 13:05 编辑
服务器实测环境如下:
服务器系统 Windows Server 2019
4核16G,500G(可以使用更低的配置)
MetaTrader 5 最新版本
交易商:IC(模拟账户)EBC(模拟账户) 以及 瑞讯银行(实盘账户)
AI助手:QwenPaw
AI模型:DeepSeek
对接AI助手后的测试内容覆盖:交易、账户、持仓、K线、指标、实时报价推送等。
其余,比如自动化Py脚本和服务器控制服务器等简单应用方向未作测试,因无测试必要的原因。
页:
[1]