15 KiB
15 KiB
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):
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 订单类型
# 订单方向
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 风险控制参数设置
# .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
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
核心方法:
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 配置开关设计
# 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 服务切换逻辑
# 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 资金管理建议
# 资金管理配置
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 必需监控指标
# 实时监控
- 账户余额变化
- 持仓盈亏实时状态
- 订单执行状态
- API 调用成功率
- 系统响应时间
6.2 告警机制
# 飞书告警场景
- 订单执行失败
- 止损/止盈触发
- 账户余额异常变化
- API 连接失败
- 系统异常错误
6.3 日志记录
# 实盘交易必需日志
- 每笔订单的完整生命周期
- API 请求和响应记录
- 价格监控日志
- 错误和异常详情
七、实施时间表
| 阶段 | 任务 | 预计时间 | 依赖 |
|---|---|---|---|
| 阶段一 | 准备工作 | 1-2天 | - |
| 阶段二 | 实盘服务开发 | 2-3天 | 阶段一完成 |
| 阶段三 | 集成与切换 | 1-2天 | 阶段二完成 |
| 阶段四 | 测试验证 | 2-3天 | 阶段三完成 |
| 总计 | 6-10天 |
八、关键决策点
8.1 必须解决的问题
-
✅ 订单映射
- 模拟交易订单 ↔ Bitget 实盘订单 ID
- 状态同步机制
-
✅ 持仓同步
- 定期从 Bitget 获取实际持仓
- 与本地数据库保持一致
-
✅ 止损策略
- 模拟交易:本地价格轮询检查
- 实盘交易:可使用 Bitget 条件单 API
-
✅ 错误处理
- API 失败时的降级策略
- 部分成交处理
8.2 可选优化
-
⭕ 条件单 API
- 使用 Bitget 条件单实现止损止盈
- 减少本地轮询,降低 API 调用
-
⭕ WebSocket 推送
- 使用 Bitget WebSocket 实时获取成交和持仓更新
- 降低延迟
-
⭕ 仓位管理优化
- 根据账户余额动态调整仓位
- 凯利公式资金管理
九、推荐实施顺序
第一步:最小化实盘功能 (3-4天)
- ✅ 实现
BitgetTradingAPI基础下单/撤单/平仓 - ✅ 实现
RealTradingService核心功能 - ✅ 测试网验证
第二步:完整集成 (2-3天)
- ✅ 添加配置开关
- ✅ 修改现有调用逻辑
- ✅ 数据库适配
第三步:生产验证 (持续)
- ✅ 小资金试运行
- ✅ 监控告警完善
- ✅ 逐步增加资金规模
十、总结与建议
✅ 可行性评估
| 方面 | 评估 | 说明 |
|---|---|---|
| 技术可行性 | ✅ 高 | Bitget API 完善,所有功能都支持 |
| 实施复杂度 | ⚠️ 中 | 需要处理订单同步、状态管理 |
| 风险可控性 | ✅ 高 | 测试网 + 小资金 + 双重确认 |
| 时间投入 | ⚠️ 中 | 6-10天完整实施 |
⚠️ 重要提醒
-
先在测试网充分验证
- 所有功能都在测试网验证通过
- 模拟各种异常情况
-
小资金试运行
- 初期使用最小可交易资金
- 验证1-2周后再逐步增加
-
保留模拟交易
- 双模式并存,随时可切回模拟
- 用于策略回测和新功能验证
-
严格风控
- 实盘杠杆低于模拟
- 仓位控制更保守
- 止损必须执行
📋 下一步行动
如果你确认要实施实盘交易,建议按以下顺序进行:
- 立即: 申请 Bitget 测试网账户和 API 密钥
- 第1天: 创建
BitgetTradingAPI基础类 - 第2-3天: 实现核心交易功能(下单、撤单、平仓)
- 第4-5天: 测试网验证所有功能
- 第6-7天: 小资金实盘测试(100 USDT)
- 验证稳定后: 逐步增加资金规模
方案制定完成,等待确认后开始实施