fix(paper): 实走/影子隐藏起止日期(用户指正:开放账户区间无意义): 前端仅回放显示日期,卡片标题资金与区间→资金+说明文案; 后端非回放强制start=创建当天end空(组合日终重放依赖start_date空值会崩); 区间断言进测试 [nas]
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -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)模式;历史回放请用「组合回测」")
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user