diff --git a/frontend/src/components/backtest/EquityCurve.vue b/frontend/src/components/backtest/EquityCurve.vue new file mode 100644 index 0000000..d34afa3 --- /dev/null +++ b/frontend/src/components/backtest/EquityCurve.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/frontend/src/views/backtest/Result.vue b/frontend/src/views/backtest/Result.vue index 1b5c970..6eee97b 100644 --- a/frontend/src/views/backtest/Result.vue +++ b/frontend/src/views/backtest/Result.vue @@ -14,6 +14,7 @@ import AlphaChart from '@/components/backtest/AlphaChart.vue' import BetaChart from '@/components/backtest/BetaChart.vue' import DrawdownChart from '@/components/backtest/DrawdownChart.vue' import VolatilityChart from '@/components/backtest/VolatilityChart.vue' +import EquityCurve from '@/components/backtest/EquityCurve.vue' const route = useRoute() const taskId = String(route.params.id) @@ -109,6 +110,12 @@ function filterDataByTimeRange(data: T): T { const filteredBenchmarkCurve = computed(() => filterDataByTimeRange(benchmarkCurve.value)) const filteredRiskSeries = computed(() => filterDataByTimeRange(riskSeries.value)) +// 净值曲线(走 equity-curve 接口,独立于 benchmark-curve)。benchmark-curve/risk-series +// 依赖 *_metrics.json,CTA 引擎当前未生成该文件 → 收益概述图全空;equity-curve 直接 +// 来自 BacktestResult.equity_curve(零成交也有 N 天平线),单独画保证"有结果就有图"。 +const equityDates = computed(() => equity.value.map((e) => fmtDate(e.date))) +const equityValues = computed(() => equity.value.map((e) => e.balance)) + onMounted(async () => { // 请求隔离:任一接口失败(如 benchmark-curve/risk-series 数据缺失)不得阻塞 // 其余请求。statistics/equity/trades 有数据时必须正常渲染。用 Promise.allSettled @@ -228,6 +235,9 @@ function fmtDate(d: string): string {
+ + +