stock-ai-agent/docs/REAL_TRADING_MIGRATION_PLAN.md

15 KiB
Raw Blame History

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 必须解决的问题

  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. 验证稳定后: 逐步增加资金规模

方案制定完成,等待确认后开始实施