fix(paper): 实走/影子隐藏起止日期(用户指正:开放账户区间无意义): 前端仅回放显示日期,卡片标题资金与区间→资金+说明文案; 后端非回放强制start=创建当天end空(组合日终重放依赖start_date空值会崩); 区间断言进测试 [nas]
CI/CD / test (push) Successful in 15s
CI/CD / nas-deploy (push) Successful in 31s
CI/CD / nas-verify (push) Successful in 13s

This commit is contained in:
2026-08-14 19:45:09 +08:00
parent f00730482f
commit c9bc654d3a
3 changed files with 32 additions and 7 deletions
+19 -7
View File
@@ -153,6 +153,11 @@ async function onSubmit(): Promise<void> {
}
// 影子模式: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 {
</el-card>
<el-card class="blk" shadow="never">
<template #header><span class="section-title">资金与区间</span></template>
<template #header>
<span class="section-title">{{ form.mode === 'replay' ? '资金与区间' : '资金' }}</span>
</template>
<el-form :model="form" label-width="120px">
<el-form-item label="起始资金">
<el-input-number v-model="form.initial_capital" :min="10000" :step="100000" style="width: 220px" />
<span class="muted form-hint">单位</span>
</el-form-item>
<el-form-item label="开始日期">
<el-date-picker v-model="form.start" type="date" value-format="YYYY-MM-DD" style="width: 220px" />
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker v-model="form.end" type="date" value-format="YYYY-MM-DD" style="width: 220px" />
</el-form-item>
<template v-if="form.mode === 'replay'">
<el-form-item label="开始日期">
<el-date-picker v-model="form.start" type="date" value-format="YYYY-MM-DD" style="width: 220px" />
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker v-model="form.end" type="date" value-format="YYYY-MM-DD" style="width: 220px" />
</el-form-item>
</template>
<div v-else class="muted" style="font-size: 12px; margin: -8px 0 4px">
{{ form.mode === 'shadow' ? '影子柜台从创建当天开始实时跟踪,无结束日期' : '每日 20:30 从创建当天开始结算,无结束日期' }}
</div>
</el-form>
</el-card>
+7
View File
@@ -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)模式;历史回放请用「组合回测」")
+6
View File
@@ -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):