diff --git a/frontend/src/views/paper/New.vue b/frontend/src/views/paper/New.vue index 44cfadb..044332a 100644 --- a/frontend/src/views/paper/New.vue +++ b/frontend/src/views/paper/New.vue @@ -153,6 +153,11 @@ async function onSubmit(): Promise { } // 影子模式:engine=shadow(VPS 柜台盘中实时撮合);其余 eod_replay(回放/日终) payload.engine = payload.mode === 'shadow' ? 'shadow' : 'eod_replay' + // 实走/影子是开放账户:起止日期无意义,开始=创建当天,结束留空(回放才需要历史区间) + if (payload.mode !== 'replay') { + payload.start = new Date().toISOString().slice(0, 10) + payload.end = '' + } const aid = await createPaper(payload) ElMessage.success(payload.mode === 'shadow' ? `已创建影子柜台模拟盘 #${aid}(VPS 柜台运行期间盘中实时结算)` @@ -284,18 +289,25 @@ function onSymbols(v: string): void { - + 单位:元 - - - - - - + +
+ {{ form.mode === 'shadow' ? '影子柜台从创建当天开始实时跟踪,无结束日期' : '每日 20:30 从创建当天开始结算,无结束日期' }} +
diff --git a/sanguo_api/routes_paper.py b/sanguo_api/routes_paper.py index 47267c0..1712984 100644 --- a/sanguo_api/routes_paper.py +++ b/sanguo_api/routes_paper.py @@ -70,6 +70,13 @@ def create_paper(req: PaperCreateRequest): db = _db_path["path"] or ":memory:" init_db(db) + # 实走/影子是开放账户:起止日期无意义,开始=创建当天(组合日终重放依赖 start_date, + # 空值会崩),结束留空;仅回放保留用户填的历史区间 + if req.mode in ("live", "shadow"): + from datetime import date + + req.start = date.today().isoformat() + req.end = "" if req.strategy_type == "portfolio": if req.mode not in ("live", "shadow"): raise HTTPException(400, "组合策略模拟盘仅支持实走(live)/影子(shadow)模式;历史回放请用「组合回测」") diff --git a/tests/api/test_paper_routes.py b/tests/api/test_paper_routes.py index 7424d6e..2358be4 100644 --- a/tests/api/test_paper_routes.py +++ b/tests/api/test_paper_routes.py @@ -63,8 +63,14 @@ def test_create_shadow_mode(tmp_path): cta = by_id[r1.json()["account_id"]] assert cta["mode"] == "shadow" assert cta["engine"] == "shadow" + # 实走/影子是开放账户:用户填的区间被忽略,开始=创建当天,结束留空 + from datetime import date + + assert cta["start_date"] == date.today().isoformat() + assert not cta["end_date"] pf = by_id[r2.json()["account_id"]] assert pf["mode"] == "shadow" and pf["engine"] == "shadow" + assert not pf["end_date"] def test_create_portfolio_rejects_replay(tmp_path):