Files
AI-Trader/MIGRATION_GUIDE.md
2026-03-04 22:56:14 +08:00

262 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 模块化重构指南
## 概述
原来的 `trading_server.py` (499行) 已被重构为以下模块化结构,提高代码可维护性和可读性。
## 新的文件结构
```
lianghua/
├── models.py ✓ 数据模型定义
├── server.py ✓ 核心服务类 (TradingServer)
├── routes_ea.py ✓ EA相关路由 (/get_trades, /send_statistics)
├── routes_trader.py ✓ 交易员相关路由 (/send_trade_instructions, /query_*)
├── routes_system.py ✓ 系统路由 (/health, /status)
├── main.py ✓ 应用入口和启动脚本
├── wangxxGold.mq5 正在使用的 MT5 EA
├── trading_server.py 旧版本(保留作为参考)
├── test_trading_service.py已更新,兼容新服务
├── trade_client.py 已更新,兼容新服务
└── api_examples.py 已更新,兼容新服务
```
## 模块说明
### 1. `models.py` - 数据模型
```python
from models import TradeInstruction, StatisticData
# TradeInstruction: 交易指令
# - symbol: 交易品种 (e.g., "EURUSD")
# - action: 买卖方向 ("b" 或 "s")
# - mount: 交易手数
# - price: 指令价格(用于Python过滤)
# - sl: 止损价格 (可选)
# - tp: 获利价格 (可选)
# StatisticData: 统计数据(不在此版本使用)
```
### 2. `server.py` - 核心交易服务
```python
from server import TradingServer
server = TradingServer()
# 主要方法:
server.add_trade_instruction(instructions: List[TradeInstruction]) -> int
server.get_trades_by_symbol(symbol: str, price: Optional[float]) -> List[Dict]
server.save_statistics(stat_data: dict) -> None
server.get_latest_statistics(count: int = 10) -> List[Dict]
server.get_all_pending_trades() -> Dict[str, List[Dict]]
server.clear_trades(symbol: Optional[str] = None) -> int
```
**特点:**
- 线程安全 (使用 RLock)
- 自动 SL/TP 填充
- 价格条件过滤逻辑集中在一个方法
### 3. `routes_ea.py` - EA接口
```
GET /get_trades?symbol=XXXX&price=YYYY.YY
→ 获取指定品种的交易指令(带自动价格过滤)
POST /send_statistics
→ 接收 EA 的统计数据(TICK、价格、账户信息等)
```
### 4. `routes_trader.py` - 交易员接口
```
POST /send_trade_instructions
→ 批量发送交易指令
GET /query_pending_trades?symbol=optional
→ 查看待执行的指令
GET /query_statistics?count=10
→ 查看历史统计数据
DELETE /clear_trades?symbol=optional
→ 清空指定或所有指令
```
### 5. `routes_system.py` - 系统接口
```
GET /health
→ 健康检查 (用于 EA 连接测试)
GET /status
→ 服务状态(待执行数、统计条数等)
```
### 6. `main.py` - 应用入口
- 创建 FastAPI 应用
- 初始化 TradingServer 单例
- 注册所有路由
- 配置 CORS 中间件
- 启动 uvicorn 服务器
**启动:**
```bash
python main.py
# 或通过启动脚本
./start.sh # macOS/Linux
start.bat # Windows
```
## 关键改进
### 代码组织
| 指标 | 旧版本 | 新版本 |
|------|--------|--------|
| 单个文件行数 | 499 | 50-90 |
| 模块数 | 1 | 6 |
| 关注点分离 | 差 | 优秀 |
### 可维护性
- ✅ 每个文件职责单一清晰
- ✅ 路由和业务逻辑分离
- ✅ 数据模型单独管理
- ✅ 新增功能时修改范围小
### 性能
- 保持相同:uvloop、单worker
- 线程安全性不变
- 响应速度无变化
## 迁移步骤
### 1. 准备环境
```bash
# 安装依赖
pip install -r requirements.txt
```
### 2. 启动新服务
```bash
# 方法1:直接启动
python main.py
# 方法2:使用启动脚本
./start.sh # macOS/Linux
start.bat # Windows
# 方法3:开发模式(热重载)
pip install uvicorn
uvicorn main:app --reload --port 8000
```
### 3. 验证服务
```bash
# 检查健康状态
curl http://localhost:8000/health
# 查看 API 文档
open http://localhost:8000/docs
```
### 4. 测试
```bash
# 运行完整测试套件
python test_trading_service.py
# 或使用交易工具
python trade_client.py
```
## API 变化
### 端口号变化
- **旧版本**: http://localhost:5858
- **新版本**: http://localhost:8000
所有客户端工具已自动更新为新端口。
### 功能保持完全兼容
所有 API 端点的请求/响应格式完全相同,迁移时无需修改 EA 或其他集成代码。
## 常见问题
### Q: 旧版本 trading_server.py 还能用吗?
A: 可以,但推荐迁移到新版本。旧文件仍保存作为参考。
### Q: MT5 EA 需要修改吗?
A: **无需修改**。EA 只是调用 HTTP 接口,端口和 API 格式不变。
### Q: 如何添加新的路由?
A:
1.`routes_*.py` 中创建路由函数
2. 使用 `@router.get()``@router.post()` 装饰器
3.`main.py` 中用 `app.include_router()` 注册
示例:
```python
# 在 routes_custom.py 中
def create_custom_routes(server: TradingServer) -> APIRouter:
router = APIRouter()
@router.get("/custom_endpoint")
async def custom_handler():
return {"status": "ok"}
return router
# 在 main.py 中
from routes_custom import create_custom_routes
app.include_router(create_custom_routes(server))
```
### Q: TradingServer 实例在哪里创建?
A: 在 `main.py` 中创建全局实例,然后传递给所有路由函数。
### Q: 如何在开发时调试?
```bash
# 启用热重载和调试输出
uvicorn main:app --reload --log-level debug
# 或直接运行主文件
python main.py # 会看到详细日志
```
## 反向兼容性
**完全兼容**
- 所有现有客户端(EA、trade_client.py、api_examples.py)无需修改
- API 端口、路由、请求/响应格式完全一致
- 只是内部代码组织不同
## 下一步改进建议
1. **添加数据库支持**
- 将统计数据持久化(SQLite/PostgreSQL
- 交易历史记录
2. **增强监控**
- 将日志写入文件
- 添加性能指标(响应时间、吞吐量等)
3. **配置管理**
- 将服务参数移到配置文件
- 支持环境变量覆盖
4. **WebSocket 支持**
- 实时推送价格更新
- 订阅式通知
5. **测试完善**
- 单元测试(pytest
- 集成测试
- 负载测试
## 总结
新的模块化结构使代码更清晰、更易维护,同时保持 100% 的 API 兼容性。
迁移无缝,现有系统可立即采用新版本而无需任何修改。
---
**最后更新**: 2024-01-15
**版本**: 1.0.0 (模块化)