fix(backtest): 结果页指标全显"—" + 任务重启后404

两个根因:

1. relative_metrics 缺字段(routes.py): get_result 的 relative_fields 列表
   漏了 total_return/annual_return/sharpe_ratio/max_drawdown 4 个字段, 导致
   这 4 个指标永远进不了响应 → 前端 MetricCards 显"—"。补全为 11 字段。

2. 任务 task_id 不持久(runner/cta_engine): submit_cta 用 cta_{symbol}_{id(params)}
   (内存地址) 作 runner id, 而 run_cta_backtest 内部另生成 cta_{uuid} 存 DB,
   两者持久层不相交 → 重启后 pool 内存映射丢失, get_result(runner_id) 的
   load_result_by_task_id 查不到 → /result 404 → 前端指标全 0 + 图表无数据。
   改为 submit 前置生成稳定 uuid, 透传给 run_cta_backtest 复用, 使
   runner-id == DB task_id (单一 id, 重启可查)。

附: Dashboard 最近任务"策略/因子"列 min-width 150→190(长策略名不再截断)
测试: test_runner task_id 断言同步新格式
This commit is contained in:
2026-07-11 22:10:48 +08:00
parent 41a788c431
commit 59da65b839
5 changed files with 21 additions and 11 deletions
+4 -2
View File
@@ -52,7 +52,9 @@ class TestOrchestrator:
assert orchestrator._pending[task_id]["end"] == end
assert orchestrator._pending[task_id]["cfg"] == cfg
assert task_id.startswith("cta_AAPL_")
# Durable uuid format: cta_<8hex> (reused as persisted DB task_id)
assert task_id.startswith("cta_")
assert task_id != "cta_AAPL_" and len(task_id) == len("cta_") + 8
@patch('sanguo_orchestrator.runner.TaskPool')
def test_get_status(self, mock_pool_class):
@@ -144,7 +146,7 @@ class TestOrchestratorAsync:
Mock(), "600000", {}, "2024-01-01", "2024-06-30", cfg=Mock()
)
assert task_id.startswith("cta_600000")
assert task_id.startswith("cta_") and len(task_id) == len("cta_") + 8
orchestrator.pool.executor.submit.assert_called_once()
@pytest.mark.asyncio