fix(optimize): 参数优化端到端修复(空statistics/500/不跳页)

根因: vnpy run_optimization 孙进程 spawn re-import setting.py 重置 DB → load 0根 → 空 statistics;连带 task_id 不一致 + statistics 含 date/numpy 序列化失败 + 前端单页轮询 180s 超时。
修复(不动 vnpy 源码):
- cta_optimizer: vt_setting.json 适配(vnpy 原生机制 setting.py:43 load_json,孙进程拿到正确 DB) + task_id 贯通 + 主聚合持久化(combos) + 过滤空 statistics 记录
- result_store: _json_default(date→isoformat + numpy→原生),save_result 两处 json.dumps 加 default
- routes: optimization-results 改读 DB 主聚合, fallback 内存(重启不丢)
- runner: _opt_worker 加 task_id 参数 + submit_optimize 传递(对齐 _cta_worker)
- 前端: Optimize 提交后跳 progress;Progress 用 opt_ 前缀判断跳 optimize-result;新建 OptimizeResult 参数表格页;router 加路由
验证: 端到端 optimization-results http=200 + 4组合非空 statistics + 浏览器提交→跳 optimize-result 页表格渲染。
This commit is contained in:
2026-07-17 10:58:49 +08:00
parent 799292d89c
commit 6ed71ed8cf
8 changed files with 282 additions and 154 deletions
+9 -3
View File
@@ -8,6 +8,7 @@ const route = useRoute()
const router = useRouter()
const taskId = String(route.params.id)
const isFactor = computed(() => route.path.startsWith('/factor'))
const isOptimize = computed(() => taskId.startsWith('opt_'))
const { status, stage, start } = useTask(taskId)
@@ -37,8 +38,13 @@ onUnmounted(() => {
watch(status, (s) => {
if (s === 'done') {
const base = isFactor.value ? '/factor' : '/backtest'
router.push(`${base}/result/${taskId}`)
if (isFactor.value) {
router.push(`/factor/result/${taskId}`)
} else if (isOptimize.value) {
router.push(`/backtest/optimize-result/${taskId}`)
} else {
router.push(`/backtest/result/${taskId}`)
}
}
})
@@ -89,7 +95,7 @@ const statusChipClass: Record<string, string> = { running: 'st-running', done: '
<div class="page progress-page">
<div class="page-head">
<div>
<h2 class="page-title">{{ isFactor ? '因子分析' : '回测' }}进行中</h2>
<h2 class="page-title">{{ isFactor ? '因子分析' : isOptimize ? '参数优化' : '回测' }}进行中</h2>
<p class="page-subtitle">任务 ID<span class="mono">{{ taskId }}</span></p>
</div>
<span class="chip" :class="statusChipClass[status]">{{ statusLabel[status] }}</span>