现象
两个不同的 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 持仓——停掉并平掉其一后,另一个仍在跑会把仓位再开出来,最后只能两个都停。
建议方案(择一)
- 最简守门(短期推荐):start 时若已有 running run 命中同
(account, venue, symbol),拒绝并返回明确错误(与现有 candidate 唯一性约束同风格)。
- per-run 持仓隔离:
positions 加 run/strategy 维度,账户内多 run 互不干扰。
- 子账户隔离:每个 run 一个 sub-account。
短期先上 #1 堵住误配;是否要 #2/#3 支持"同账户多策略并行同标的"看后续需求。
验收
- 同
(account, venue, symbol) 已有 running run 时,再 start 第二个 → 被拒 + 明确错误信息。
- 现有单 run 行为不变。
相关:#51(margin/perp 做空)属另一条线,与本 issue 无关。
现象
两个不同的 promoted candidate,在同一账户 + 同一 venue/symbol上各自 start 成 live run 时,它们共享同一行
positions(主键 =(account_id, venue, symbol)),彼此成交会改对方看到的持仓 → 互相打架:根因
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 持仓——停掉并平掉其一后,另一个仍在跑会把仓位再开出来,最后只能两个都停。建议方案(择一)
(account, venue, symbol),拒绝并返回明确错误(与现有 candidate 唯一性约束同风格)。positions加 run/strategy 维度,账户内多 run 互不干扰。短期先上 #1 堵住误配;是否要 #2/#3 支持"同账户多策略并行同标的"看后续需求。
验收
(account, venue, symbol)已有 running run 时,再 start 第二个 → 被拒 + 明确错误信息。