487 lines
15 KiB
Markdown
487 lines
15 KiB
Markdown
# 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. **验证稳定后**: 逐步增加资金规模
|
||
|
||
---
|
||
|
||
**方案制定完成,等待确认后开始实施**
|