feat(shadow-desk): P1-b/c 影子柜台常驻进程+本地撮合broker+前端引擎选择: ShadowBroker(实时价±滑点即时成交/佣金印花最低佣金/A股整手/T+1日锁/资金不足拒单/均价加权/duck-typed BrokerBase协议); runner挂bullet_trade LiveEngine同实盘唯一差=broker_factory换影子(双轨对账基础),成交落paper_trades+30s快照落持仓净值; CLI单实例文件锁(python -m sanguo_trader.shadow); paper_accounts加engine列(eod_replay/shadow迁移); 前端:模拟盘新建组合卡撮合引擎单选+列表影子/日终徽标; 10 broker单测 [vps]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 9s

This commit is contained in:
2026-08-14 12:16:05 +08:00
parent 861c7faa8c
commit 8e7e7282de
12 changed files with 632 additions and 4 deletions
+4
View File
@@ -56,6 +56,8 @@ class PaperCreateRequest(BaseModel):
# 组合策略实走(E1):strategy_type=portfolio 时 mode 必须 live
# strategies[0].name=组合策略名,pool/max_pool/benchmark 进 params
strategy_type: str = "cta"
# 撮合引擎(影子柜台 P1):eod_replay=日终回放(NAS 20:30) / shadow=影子柜台(VPS 盘中实时)
engine: str = "eod_replay"
pool: str = "hs300_subset"
max_pool: int = 30
benchmark: str = "000300.XSHG"
@@ -71,6 +73,8 @@ def create_paper(req: PaperCreateRequest):
if req.strategy_type == "portfolio":
if req.mode != "live":
raise HTTPException(400, "组合策略模拟盘仅支持实走(live)模式;历史回放请用「组合回测」")
if req.engine not in ("eod_replay", "shadow"):
raise HTTPException(400, "engine 须为 eod_replay(日终回放) 或 shadow(影子柜台)")
payload = req.model_dump()
payload["symbols"] = [req.pool]
payload["strategies"] = [{