stock-ai-agent/docs/REAL_TRADING_MIGRATION_PLAN.md

487 lines
15 KiB
Markdown
Raw 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.

# Bitget 实盘交易迁移方案
> **目标**: 将当前的模拟交易系统切换到 Bitget 实盘合约交易
>
> **状态**: 方案制定中 - 未实施
---
## 一、当前系统架构分析
### 1.1 模拟交易系统现状
**核心文件**: `backend/app/services/paper_trading_service.py`
**主要功能**:
- ✅ 订单创建 (`create_order_from_signal`)
- ✅ 订单平仓 (`_close_order`, `close_order_manual`)
- ✅ 止盈止损检查 (`check_price_triggers`)
- ✅ 移动止损逻辑
- ✅ 账户余额管理
- ✅ 持仓信息查询
**订单状态管理**:
- `PENDING` - 挂单中(等待入场价格)
- `OPEN` - 已开仓
- `CLOSED` - 已平仓
**配置参数** (`.env`):
```bash
PAPER_TRADING_ENABLED=true # 启用模拟交易
PAPER_TRADING_INITIAL_BALANCE=10000 # 初始本金
PAPER_TRADING_LEVERAGE=20 # 杠杆倍数
PAPER_TRADING_MARGIN_PER_ORDER=1000 # 每单保证金
PAPER_TRADING_MAX_ORDERS=10 # 最大订单数
PAPER_TRADING_AUTO_CLOSE_OPPOSITE=false # 自动平反向持仓
PAPER_TRADING_TRAILING_STOP_ENABLED=true # 移动止损
```
### 1.2 数据流向
```
LLM 分析信号 → PaperTradingService → 数据库记录
本地模拟执行
止盈止损检查(本地价格轮询)
```
---
## 二、实盘交易架构设计
### 2.1 整体方案
**方案 A - 双模式并存** (推荐)
- 保留模拟交易作为回测和测试
- 新增实盘交易服务
- 通过配置开关切换
**方案 B - 完全替换**
- 直接将模拟交易改为实盘
- 风险较高,不推荐
### 2.2 核心组件设计
```
┌─────────────────────────────────────────────────────────────┐
│ 交易服务层 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ PaperTradingService │ │ RealTradingService │ │
│ │ (模拟交易) │ │ (实盘交易) │ │
│ └──────────────────┘ └──────────────────┘ │
│ │ │ │
│ └────────────┬───────────────┘ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ TradingInterface │ (统一接口) │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ BitgetTradingAPI │ │
│ │ (实盘交易API) │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
---
## 三、Bitget 实盘 API 需求
### 3.1 需要 API 功能
| 功能 | Bitget API 端点 | 说明 |
|------|----------------|------|
| **下单** | `POST /api/mix/v1/order/placeOrder` | U本位合约下单 |
| **撤单** | `POST /api/mix/v1/order/cancelOrder` | 撤销挂单 |
| **平仓** | `POST /api/mix v1/order/closePosition` | 平仓持仓 |
| **查询持仓** | `GET /api/mix/v1/position/allPosition` | 获取当前持仓 |
| **查询订单** | `GET /api/mix/v1/order/orderInfo` | 获取订单状态 |
| **修改订单** | `POST /api/mix/v1/order/modifyOrder` | 修改挂单价格 |
| **账户余额** | `GET /api/mix/v1/account/account` | 获取账户余额 |
| **设置杠杆** | `POST /api/mix/v1/account/setLeverage` | 设置杠杆倍数 |
### 3.2 Bitget 订单类型
```python
# 订单方向
side_map = {
'long': 'open_long', # 开多
'short': 'open_short', # 开空
}
# 订单类型
order_type_map = {
'limit': 'limit', # 限价单(挂单)
'market': 'market', # 市价单
}
# 产品类型
product_type = 'USDT-FUTURES' # U本位永续合约
```
### 3.3 订单参数映射
| 模拟交易参数 | Bitget API 参数 | 说明 |
|-------------|----------------|------|
| `symbol` | `symbol` | 交易对 (如 BTCUSDT) |
| `side` | `side` | open_long/close_long/open_short/close_short |
| `order_type` | `orderType` | limit/market |
| `quantity` | `size` | 数量(张数) |
| `entry_price` | `price` | 委托价格 |
| `stop_loss` | `stopLoss` | 止损价格 |
| `take_profit` | `takeProfit` | 止盈价格 |
| `leverage` | `leverage` | 杠杆倍数 |
---
## 四、实施步骤
### 阶段一:准备工作 (1-2天)
#### 1.1 Bitget API 密钥申请
- [ ] 注册 Bitget 账户
- [ ] 开启合约交易功能
- [ ] 创建 API Key
- [ ] 配置 IP 白名单
- [ ] **选择测试网进行初期测试**
#### 1.2 测试网环境搭建
- [ ] 获取 Bitget 测试网凭证
- [ ] 配置测试网 API 端点:`https://api-testnet.bitget.com`
- [ ] 验证 API 连接性
#### 1.3 风险控制参数设置
```bash
# .env 新增配置
BITGET_API_KEY=your_api_key
BITGET_API_SECRET=your_api_secret
BITGET_PASSPHRASE=your_passphrase # 如果需要
BITGET_USE_TESTNET=true # 初期使用测试网
# 实盘交易配置
REAL_TRADING_ENABLED=false # 实盘交易总开关
REAL_TRADING_MAX_POSITION=5000 # 单笔最大持仓 (USDT)
REAL_TRADING_MAX_TOTAL_RATIO=0.5 # 最大总仓位比例账户的50%
REAL_TRADING_DEFAULT_LEVERAGE=10 # 默认杠杆(低于模拟)
REAL_TRADING_RISK_PER_TRADE=0.02 # 每笔交易风险2%
```
### 阶段二:实盘交易服务开发 (2-3天)
#### 2.1 创建 `BitgetTradingAPI` 类
**文件**: `backend/app/services/bitget_trading_api.py`
```python
class BitgetTradingAPI:
"""Bitget 实盘交易 API"""
def __init__(self, api_key: str, api_secret: str, use_testnet: bool = True):
self.api_key = api_key
self.api_secret = api_secret
self.base_url = TESTNET_URL if use_testnet else PROD_URL
def place_order(self, symbol: str, side: str, size: float,
price: float = None, order_type: str = 'limit') -> dict:
"""下单"""
# POST /api/mix/v1/order/placeOrder
def cancel_order(self, symbol: str, order_id: str) -> dict:
"""撤单"""
# POST /api/mix/v1/order/cancelOrder
def close_position(self, symbol: str, side: str, size: float) -> dict:
"""平仓"""
# POST /api/mix/v1/order/closePosition
def get_position(self, symbol: str = None) -> list:
"""查询持仓"""
# GET /api/mix/v1/position/allPosition
def get_balance(self) -> dict:
"""查询余额"""
# GET /api/mix/v1/account/account
def set_leverage(self, symbol: str, leverage: int) -> dict:
"""设置杠杆"""
# POST /api/mix/v1/account/setLeverage
```
#### 2.2 创建 `RealTradingService` 类
**文件**: `backend/app/services/real_trading_service.py`
**核心方法**:
```python
class RealTradingService:
"""实盘交易服务 - 接口与 PaperTradingService 保持一致"""
def create_order_from_signal(self, signal: Dict, current_price: float) -> Dict:
"""从信号创建实盘订单"""
# 1. 风险检查(仓位、杠杆、余额)
# 2. 调用 BitgetTradingAPI.place_order()
# 3. 记录订单到数据库
# 4. 发送通知
def check_price_triggers(self, symbol: str, price: float) -> List:
"""检查止盈止损(从 Bitget 获取持仓状态)"""
# 1. 获取实际持仓状态
# 2. 判断是否触发止盈止损
# 3. 调用平仓 API
def get_account_status(self) -> Dict:
"""获取账户状态"""
# 调用 Bitget API 获取真实余额和持仓
```
### 阶段三:集成与切换 (1-2天)
#### 3.1 配置开关设计
```python
# config.py
class Settings(BaseSettings):
# 交易模式选择
trading_mode: str = "paper" # "paper" 或 "real"
# 模拟交易配置(保留)
paper_trading_enabled: bool = True
# 实盘交易配置
real_trading_enabled: bool = False
# Bitget API 配置
bitget_api_key: str = ""
bitget_api_secret: str = ""
bitget_use_testnet: bool = True
```
#### 3.2 服务切换逻辑
```python
# crypto_agent.py 或根据 trading_mode 动态选择
if settings.trading_mode == "paper":
from app.services.paper_trading_service import get_paper_trading_service
trading_service = get_paper_trading_service()
else:
from app.services.real_trading_service import get_real_trading_service
trading_service = get_real_trading_service()
```
#### 3.3 修改的文件清单
| 文件 | 修改内容 |
|------|---------|
| `config.py` | 添加实盘交易配置项 |
| `crypto_agent.py` | 添加交易模式选择逻辑 |
| `main.py` | 价格监控适配实盘交易 |
| `api/paper_trading.py` | 添加实盘交易 API 端点 |
### 阶段四:测试验证 (2-3天)
#### 4.1 测试网测试
- [ ] 下单功能测试
- [ ] 撤单功能测试
- [ ] 平仓功能测试
- [ ] 持仓查询测试
- [ ] 止盈止损触发测试
#### 4.2 小资金实盘测试
- [ ] 使用小额资金(如 100 USDT
- [ ] 执行 10-20 笔交易
- [ ] 验证盈亏计算准确性
- [ ] 验证通知及时性
#### 4.3 压力测试
- [ ] 极端行情下系统稳定性
- [ ] API 限频处理
- [ ] 网络异常恢复
- [ ] 订单状态同步
---
## 五、风险控制
### 5.1 技术风险
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| API 故障 | 无法交易 | 多重异常处理 + 飞书告警 |
| 网络延迟 | 滑点增大 | 限价单为主,设置合理价格偏差 |
| 订单状态不同步 | 重复开仓 | 定期同步持仓状态 |
| 限频被封 | 暂停交易 | 请求频率控制 + 重试机制 |
### 5.2 交易风险
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 策略失效 | 亏损 | 测试网充分验证 + 小资金试运行 |
| 极端行情 | 爆仓 | 严格止损 + 仓位控制 |
| 误操作 | 意外亏损 | 双重确认 + 实盘交易前测试 |
| API 泄露 | 资金风险 | IP 白名单 + 只读权限分离 |
### 5.3 资金管理建议
```python
# 资金管理配置
MAX_ACCOUNT_RATIO = 0.5 # 最大使用账户50%资金
MAX_SINGLE_POSITION = 0.1 # 单笔最大10%仓位
MAX_TOTAL_POSITION = 0.3 # 总持仓最大30%
DEFAULT_LEVERAGE = 10 # 实盘杠杆低于模拟(20x)
STOP_LOSS_PERCENT = 0.02 # 每笔最大亏损2%
```
---
## 六、监控与告警
### 6.1 必需监控指标
```python
# 实时监控
- 账户余额变化
- 持仓盈亏实时状态
- 订单执行状态
- API 调用成功率
- 系统响应时间
```
### 6.2 告警机制
```python
# 飞书告警场景
- 订单执行失败
- 止损/止盈触发
- 账户余额异常变化
- API 连接失败
- 系统异常错误
```
### 6.3 日志记录
```python
# 实盘交易必需日志
- 每笔订单的完整生命周期
- API 请求和响应记录
- 价格监控日志
- 错误和异常详情
```
---
## 七、实施时间表
| 阶段 | 任务 | 预计时间 | 依赖 |
|------|------|---------|------|
| **阶段一** | 准备工作 | 1-2天 | - |
| **阶段二** | 实盘服务开发 | 2-3天 | 阶段一完成 |
| **阶段三** | 集成与切换 | 1-2天 | 阶段二完成 |
| **阶段四** | 测试验证 | 2-3天 | 阶段三完成 |
| **总计** | | **6-10天** | |
---
## 八、关键决策点
### 8.1 必须解决的问题
1.**订单映射**
- 模拟交易订单 ↔ Bitget 实盘订单 ID
- 状态同步机制
2.**持仓同步**
- 定期从 Bitget 获取实际持仓
- 与本地数据库保持一致
3.**止损策略**
- 模拟交易:本地价格轮询检查
- 实盘交易:可使用 Bitget 条件单 API
4.**错误处理**
- API 失败时的降级策略
- 部分成交处理
### 8.2 可选优化
1.**条件单 API**
- 使用 Bitget 条件单实现止损止盈
- 减少本地轮询,降低 API 调用
2.**WebSocket 推送**
- 使用 Bitget WebSocket 实时获取成交和持仓更新
- 降低延迟
3.**仓位管理优化**
- 根据账户余额动态调整仓位
- 凯利公式资金管理
---
## 九、推荐实施顺序
### 第一步:最小化实盘功能 (3-4天)
- ✅ 实现 `BitgetTradingAPI` 基础下单/撤单/平仓
- ✅ 实现 `RealTradingService` 核心功能
- ✅ 测试网验证
### 第二步:完整集成 (2-3天)
- ✅ 添加配置开关
- ✅ 修改现有调用逻辑
- ✅ 数据库适配
### 第三步:生产验证 (持续)
- ✅ 小资金试运行
- ✅ 监控告警完善
- ✅ 逐步增加资金规模
---
## 十、总结与建议
### ✅ 可行性评估
| 方面 | 评估 | 说明 |
|------|------|------|
| **技术可行性** | ✅ 高 | Bitget API 完善,所有功能都支持 |
| **实施复杂度** | ⚠️ 中 | 需要处理订单同步、状态管理 |
| **风险可控性** | ✅ 高 | 测试网 + 小资金 + 双重确认 |
| **时间投入** | ⚠️ 中 | 6-10天完整实施 |
### ⚠️ 重要提醒
1. **先在测试网充分验证**
- 所有功能都在测试网验证通过
- 模拟各种异常情况
2. **小资金试运行**
- 初期使用最小可交易资金
- 验证1-2周后再逐步增加
3. **保留模拟交易**
- 双模式并存,随时可切回模拟
- 用于策略回测和新功能验证
4. **严格风控**
- 实盘杠杆低于模拟
- 仓位控制更保守
- 止损必须执行
### 📋 下一步行动
**如果你确认要实施实盘交易,建议按以下顺序进行**:
1. **立即**: 申请 Bitget 测试网账户和 API 密钥
2. **第1天**: 创建 `BitgetTradingAPI` 基础类
3. **第2-3天**: 实现核心交易功能(下单、撤单、平仓)
4. **第4-5天**: 测试网验证所有功能
5. **第6-7天**: 小资金实盘测试100 USDT
6. **验证稳定后**: 逐步增加资金规模
---
**方案制定完成,等待确认后开始实施**