diff options
Diffstat (limited to 'frontend/src/pages')
| -rw-r--r-- | frontend/src/pages/ProjectResultsTab.svelte | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/frontend/src/pages/ProjectResultsTab.svelte b/frontend/src/pages/ProjectResultsTab.svelte index 5ff03c0..f479116 100644 --- a/frontend/src/pages/ProjectResultsTab.svelte +++ b/frontend/src/pages/ProjectResultsTab.svelte @@ -55,16 +55,22 @@ const result = $derived<BacktestResult | null>(run?.result ?? null); const hasEquity = $derived(!!result && result.equity.length > 0); - // long-format rows for the layerchart renderer ({ i, date, ...columns }) + // long-format rows for the layerchart renderer ({ i, date, ...columns }); + // equity rows同时携带 dd(当日回撤%),供 hover 提示读数 const equityData = $derived.by(() => { if (!result || !hasEquity) return []; - return result.equity.map((p, i) => ({ - i, - date: p.date, - equity: p.equity, - cash: p.cash, - benchmark: p.benchmark ?? undefined - })); + let peak = -Infinity; + return result.equity.map((p, i) => { + peak = Math.max(peak, p.equity); + return { + i, + date: p.date, + equity: p.equity, + cash: p.cash, + benchmark: p.benchmark ?? undefined, + dd: peak <= 0 ? 0 : -((peak - p.equity) / peak) * 100 + }; + }); }); const hasBench = $derived(equityData.some((r) => r.benchmark !== undefined && r.benchmark !== null)); @@ -193,9 +199,9 @@ <Button variant={chartMode === "drawdown" ? "default" : "outline"} size="sm" aria-pressed={chartMode === "drawdown"} onclick={() => (chartMode = "drawdown")}>回撤曲线</Button> </div> {#if chartMode === "equity"} - <Chart data={equityData} series={equitySeries} ariaLabel="策略权益曲线" height={340} /> + <Chart data={equityData} series={equitySeries} ariaLabel="策略权益曲线" height={340} extras={[{ key: 'dd', label: '回撤', color: '#134e4a' }]} /> {:else} - <Chart data={drawdownData} series={drawdownSeries} ariaLabel="回撤曲线" height={300} /> + <Chart data={drawdownData} series={drawdownSeries} ariaLabel="回撤曲线" height={300} valueFormatter={(v) => (typeof v === 'number' ? `${v.toFixed(2)}%` : String(v))} /> {/if} </div> |
