darkeril

实盘开发计划

套利引擎从模拟盘到实盘的完整开发计划(v1.1 含前端页面设计+阈值配置)

实盘开发计划 v1.1

v1.0: 2026-03-02 露露初版 v1.1: 2026-03-02 露露×小范(xiaofan)讨论定稿

前置条件(范总准备)

  • Binance API Key(开通合约权限,IP白名单绑小周服务器34.153.223.176)
  • Portfolio Margin(可选,降低保证金占用)
  • 测试资金:100U起步($2=1R最小量测试)

P0:必须完成

1. API Key 加密存储

  • 方案:GCP Secret Manager(主) + .env(本地fallback)
  • 启动时拉取一次,缓存在内存,零交易延迟
  • Key不进Git,不写配置文件
  • GCP项目:gen-lang-client-0835616737

2. 交易执行模块(live_executor.py)

  • 信号接收方式:PostgreSQL LISTEN/NOTIFY(不轮询)
    • signal_engine写入信号后执行 NOTIFY new_signal
    • live_executor通过 LISTEN new_signal 实时接收
    • 信号→开仓延迟从~0.5秒压到**<100ms**
  • 调币安API下单/平仓/改止损
  • 开仓:市价单(MARKET),确保成交
  • 止损:STOP_MARKET挂单
  • TP1:TAKE_PROFIT_MARKET挂单(半仓)
  • TP2:TAKE_PROFIT_MARKET挂单(半仓)
  • TP1触发后:撤原SL → 挂保本SL(entry ± 0.05%)
  • 仓位大小:risk_usd / risk_distance 个币,按币安精度取整
  • 逐仓模式,杠杆倍数自动设置
  • 保护单裸奔监控:记录 protection_gap_sec(开仓成交→SL挂单成功)

3. 仓位同步(position_sync.py)

  • 每30秒对账:本地DB状态 vs 币安实际持仓
  • 检测项:
    • 仓位数量差(张数+名义价值)
    • 挂单差(本地x个/交易所y个)
    • 方向不一致 → 最高级告警
    • 差异持续时间:>60秒自动升级告警级别
  • SL缺失自动补挂
    • 第1次检测缺失 → 立即补挂
    • 3秒后复检,仍缺 → 再补挂一次
    • 连续2次失败 → 红灯 + 只减仓模式 + Discord通知
  • 对账面板提供修复建议按钮(重挂保护单/同步仓位/强制平仓)
  • 默认不自动平仓,除非熔断策略明确要求

4. 风控熔断(risk_guard.py)

  • 单日最大亏损:已实现R + 未实现亏损预估 > -5R → 全平 + 停机
  • 连续亏损:5连亏 → 暂停开仓1小时
  • API连接异常:断开>30秒 → 暂停开仓 + 告警
  • 余额不足:可用余额 < 单笔风险×2 → 拒绝开仓
  • 杠杆异常:实际杠杆>预期×1.5 → 告警
  • 数据新鲜度:行情/账户/下单回执超时 → 禁止新开仓
  • 熔断状态写DB:触发规则、触发时间、恢复条件
  • 所有事件 Discord即时通知

5. Discord实时通知

  • 每笔开仓:币种、方向、价格、仓位、SL/TP、裸奔时间
  • 每笔平仓:盈亏R+$、持仓时间、出场原因、滑点
  • 异常告警:风控触发、API错误、对账不一致、SL补挂
  • 每日汇总:总盈亏、胜率、持仓数、成本占比

P1:建议完成

6. 执行质量追踪

  • 记录全链路时间戳:signal_ts → order_submit_ts → exchange_ack_ts → fill_ts
  • 滑点:signal_price vs avg_fill_price(按币种分档统计)
  • 拒单率、部分成交率
  • P50/P95滑点看板

7. 实盘 vs 模拟盘对照面板

  • 按同一信号ID匹配
  • 对比:入场价差、退出价差、R差
  • 按币种/时段统计偏差 → 区分策略问题 vs 执行问题

8. 资金费率结算追踪

  • 持仓跨8h结算节点时记录FR收支
  • 纳入净PnL计算
  • PnL拆解:gross_pnl / fee / funding / slippage / net_pnl

实盘前端页面设计(/live)

第零层:顶部固定风险条(sticky,永远可见)

字段数据源刷新告警
交易状态本地配置实时停机=红
可执行锁状态risk_guard实时禁新开仓/只减仓/手动接管 是否生效
熔断状态+原因+恢复条件risk_guard实时触发=红+文字说明
今日R预算:已实现R / 未实现R / 合计R / 日限额Rlive_trades每笔>80%黄, >100%红
系统健康(WS延迟/API成功率/数据新鲜度)心跳5秒详见阈值JSON
对账状态(含差异量化)position_sync30秒不一致=红,>60s升级
距清算最小距离%币安API10秒<20%黄/<12%红/<8%黑

第一层:一键止血区

  • 🔴 紧急平全仓 — 二次确认,显示影响金额
  • 🟡 禁新开仓 — 保留现有仓位+保护单
  • 🟠 只减仓模式 — 只允许平仓和移SL
  • 每个操作记录:操作人、时间、原因
  • 恢复按钮(需二次确认)

第二层:账户概览(8卡片)

账户权益 | 可用保证金 | 已用保证金 | 有效杠杆 | 今日净PnL(R+$) | 总净PnL(R+$) | 成本占比 | 今日成交额

第三层:当前持仓(WS实时1-5秒)

每个仓位卡片:

  • 币种、方向、入场价+时间(ms)、现价、实时R+$
  • SL/TP1/TP2价格 + 挂单是否存在(✅/❌,缺失=红框最高危)
  • 持仓时间(>45min黄, >60min红)
  • 距清算%、开仓评分、币安订单ID
  • 单仓操作按钮:手动平仓、手动移SL

第四层:执行质量面板(15-60秒刷新)

  • 按币种分两档阈值(BTC/ETH vs XRP/SOL)
  • 信号→下单延迟、下单→成交延迟、滑点bps、拒单率、部分成交率
  • 裸奔时间(protection_gap_sec):黄>2s, 红>5s
  • P50/P95滑点统计

第五层:对账面板(30秒)

  • 三张表:本地仓位 vs 币安仓位 / 本地挂单 vs 币安挂单 / 差异项
  • 差异量化:数量差、名义值差、挂单差、差异持续时间
  • 修复建议按钮

第六层:风控状态(实时)

  • 当前状态:正常🟢 / 告警🟡 / 熔断🔴
  • 触发规则明文 + 触发时间 + 恢复条件
  • 风控参数表 + 历史熔断记录

第七层:实时通知流(实时)

  • 时间线,最新在上
  • 分类标签:开仓(绿)、平仓(蓝)、风控(红)、对账(橙)、系统(灰)

第八层:实盘 vs 模拟盘对照(每笔更新)

  • 按同一信号ID匹配
  • 入场价差、R差、差异原因(滑点/延迟/价格偏差)
  • 汇总统计

第九层:权益曲线+回撤(每笔平仓更新)

  • 累计PnL + 回撤曲线
  • 可叠加模拟盘曲线对比

第十层:历史交易表(15-60秒)

  • 含实际成交价、滑点bps、手续费$、资金费$、币安订单ID
  • PnL拆解:gross / fee / funding / slippage / net

第十一层:系统健康详情(底部运维区,5秒)

  • WS连接状态+延迟+最后消息时间
  • API成功率、429次数、时钟偏移
  • 各进程心跳
  • 最后行情时间、最后账户回报时间、最后下单回执时间

阈值配置(露露×小范讨论定稿)

{
  "livePageThresholds": {
    "liquidationDistancePct": {
      "yellow": 20,
      "red": 12,
      "critical": 8,
      "actions": {
        "yellow": ["warn_ui"],
        "red": ["warn_ui", "block_new_entries"],
        "critical": ["warn_ui", "reduce_only_mode"]
      }
    },
    "holdTimeMinutes": {
      "yellow": 45,
      "red": 60,
      "autoCloseGraceMin": 10,
      "actions": {
        "yellow": ["warn_ui"],
        "red": ["warn_ui", "enqueue_timeout_review", "notify_discord", "start_countdown_10min"],
        "graceExpired": ["market_close", "notify_discord"]
      },
      "note": "60min进处置队列+10min倒计时,范总未处理则70min自动市价平仓"
    },
    "protectionOrderPolicy": {
      "autoRehangEnabled": true,
      "rehangRetryDelaysSec": [0, 3],
      "maxRetries": 2,
      "onFailureActions": ["warn_ui", "reduce_only_mode", "notify_discord"]
    },
    "protectionGapSec": {
      "yellow": 2,
      "red": 5,
      "actions": {
        "yellow": ["warn_ui"],
        "red": ["warn_ui", "notify_discord"]
      }
    },
    "executionQuality": {
      "BTC_ETH": {
        "signalToOrderMs": { "yellow": 250, "red": 1200 },
        "orderToFillMs": { "yellow": 600, "red": 3500 },
        "slippageBps": { "yellow": 2.5, "red": 8 },
        "rejectRate5mPct": { "yellow": 2, "red": 6 },
        "partialFillRatePct": { "yellow": 8, "red": 20 }
      },
      "XRP_SOL": {
        "signalToOrderMs": { "yellow": 300, "red": 1500 },
        "orderToFillMs": { "yellow": 900, "red": 5000 },
        "slippageBps": { "yellow": 5, "red": 15 },
        "rejectRate5mPct": { "yellow": 3, "red": 8 },
        "partialFillRatePct": { "yellow": 12, "red": 30 }
      }
    },
    "dataFreshness": {
      "marketDataStaleSec": { "yellow": 5, "red": 10 },
      "accountUpdateStaleSec": { "yellow": 10, "red": 20 },
      "orderAckStaleSec": { "yellow": 3, "red": 8 },
      "onRedActions": ["block_new_entries"]
    },
    "reconciliation": {
      "checkIntervalSec": 30,
      "mismatchEscalationSec": 60,
      "fields": [
        "position_qty_diff",
        "position_notional_diff",
        "open_orders_local_vs_exchange"
      ]
    },
    "riskGuard": {
      "dailyLossLimitR": -5,
      "consecutiveLossLimit": 5,
      "consecutiveLossCooldownMin": 60,
      "apiDisconnectThresholdSec": 30,
      "minAvailableBalanceMultiple": 2,
      "maxLeverageMultiple": 1.5,
      "triggerLogic": "realized_r + max(unrealized_loss_estimate, 0)"
    },
    "refreshIntervals": {
      "L0_riskBar_positionsSec": 5,
      "L1_executionQuality_tradesSec": 30,
      "L2_equityCurve": "per_close",
      "L3_historicalStatsSec": 30
    }
  }
}

技术架构

signal_engine.py (不变)
    ↓ 信号写入DB
live_executor.py (新)  ←  读DB新信号 → 调币安API

position_sync.py (新)  ←  每30秒对账 + SL自动补挂

risk_guard.py (新)     ←  实时风控检查

Discord通知
  • live_executor 替代 paper_monitor 的角色
  • paper_monitor 继续运行(模拟盘不停,持续AB对照)
  • 新增 live_trades 表,结构同 paper_trades,加 binance_order_idfill_priceslippageprotection_gap_mssignal_to_order_msorder_to_fill_ms 字段

币安API要点

  • 端点:https://fapi.binance.com(正式)/ https://testnet.binancefuture.com(测试网)
  • 签名:HMAC SHA256
  • 下单:POST /fapi/v1/order
  • 查仓位:GET /fapi/v2/positionRisk
  • 查挂单:GET /fapi/v1/openOrders
  • 设杠杆:POST /fapi/v1/leverage
  • 设逐仓:POST /fapi/v1/marginType
  • Rate Limit:1200次/分钟(足够)

时间估算

  • P0开发:3-5天
  • P0测试(Testnet + 最小量实盘):1-2天
  • P1开发:2-3天
  • 总计:约1周

测试计划

  1. Testnet先跑:币安测试网(testnet.binancefuture.com),用假钱验证全链路
  2. 最小量实盘:100U,$2=1R,验证开/平仓/SL/TP全流程
  3. 观察3天:对比模拟盘结果,确认无偏差
  4. 逐步加仓:$10→$50→$200/R

v1.0 创建:2026-03-02 露露 v1.1 更新:2026-03-02 露露×小范讨论定稿(新增前端页面设计+阈值JSON+对账补挂策略+数据新鲜度+清算距离三档+R拆分) 状态:待开发(等AB测试冻结期结束~03-16)

On this page