Skip to content

[paper] 同账户同 venue/symbol 多 run 共享一行持仓,互相打架 #108

Description

@mirror29

现象

两个不同的 promoted candidate,在同一账户 + 同一 venue/symbol上各自 start 成 live run 时,它们共享同一行 positions(主键 = (account_id, venue, symbol)),彼此成交会改对方看到的持仓 → 互相打架:

  • PnL 归属错乱(两个 run 的 cumulative_pnl 都从同一行持仓派生)
  • 决策日志交叉污染
  • 一个 run 的出场 / guard 平掉的是"共享仓",顺带动了另一个 run 的持仓
  • 运维手动平仓会被另一个仍在跑的 run 下一根 bar 顶掉

根因

  • positions 主键 = (account_id, venue, symbol),一标的一仓,无 per-run 维度
  • strategy_runs 只有 UNIQUE(candidate_id) WHERE status='running'(防同一 candidate 跑两次),没挡"同 account+venue+symbol、不同 candidate 同时 running"

实际遇到

排查并平仓一个现货 long-only 漂移 run(裸空 bug,已修)时发现:两个 run(前缀 d4404933 / 4864b9e7)都在同一 dev 账户跑 binance/BTC/USDT,共享同一行 BTC 持仓——停掉并平掉其一后,另一个仍在跑会把仓位再开出来,最后只能两个都停。

建议方案(择一)

  1. 最简守门(短期推荐):start 时若已有 running run 命中同 (account, venue, symbol),拒绝并返回明确错误(与现有 candidate 唯一性约束同风格)。
  2. per-run 持仓隔离:positions 加 run/strategy 维度,账户内多 run 互不干扰。
  3. 子账户隔离:每个 run 一个 sub-account。

短期先上 #1 堵住误配;是否要 #2/#3 支持"同账户多策略并行同标的"看后续需求。

验收

  • (account, venue, symbol) 已有 running run 时,再 start 第二个 → 被拒 + 明确错误信息。
  • 现有单 run 行为不变。

相关:#51(margin/perp 做空)属另一条线,与本 issue 无关。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions