import { useState } from 'react'; import { useBacktestLaunch, useBacktestResult } from '../../api/tradingHooks'; import { Card, LoadingSpinner } from '../../components/ui'; import { LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid, } from 'recharts'; const RISK_TIERS = ['conservative', 'moderate', 'aggressive']; function fmtUsd(v: number | null | undefined) { if (v == null) return '—'; return `$${v.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; } function fmtPct(v: number | null | undefined) { if (v == null) return '—'; return `${(v * 100).toFixed(2)}%`; } export function BacktestPanel() { const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); const [initialCapital, setInitialCapital] = useState('100000'); const [riskTier, setRiskTier] = useState('moderate'); const [backtestId, setBacktestId] = useState(undefined); const launch = useBacktestLaunch(); const { data: result, isLoading: resultLoading } = useBacktestResult(backtestId); function handleLaunch() { if (!startDate || !endDate) return; launch.mutate( { start_date: startDate, end_date: endDate, initial_capital: Number(initialCapital), risk_tier: riskTier, }, { onSuccess: (data) => setBacktestId(data.id), }, ); } const equityCurve = (result?.equity_curve ?? []).map((pt) => ({ date: new Date(pt.date).toLocaleDateString(undefined, { month: 'short', day: 'numeric' }), value: pt.portfolio_value, })); return (
{/* Configuration Form */}

Backtest Configuration

setStartDate(e.target.value)} className="w-full rounded-md border border-surface-700 bg-surface-950 px-2 py-1.5 text-sm text-gray-200 focus:border-brand-500 focus:outline-none" />
setEndDate(e.target.value)} className="w-full rounded-md border border-surface-700 bg-surface-950 px-2 py-1.5 text-sm text-gray-200 focus:border-brand-500 focus:outline-none" />
setInitialCapital(e.target.value)} className="w-full rounded-md border border-surface-700 bg-surface-950 px-2 py-1.5 text-sm text-gray-200 focus:border-brand-500 focus:outline-none" />
{launch.isError && (

Failed to launch backtest

)}
{/* Results */} {resultLoading && } {result && ( <> {/* Summary Metrics */}

Backtest Results

Trades: {result.trade_count ?? 0} Status: {result.status} Capital: {fmtUsd(result.initial_capital)}
{/* Equity Curve */} {equityCurve.length > 0 && (

Equity Curve

`$${(v / 1000).toFixed(0)}k`} /> [fmtUsd(value as number), 'Portfolio Value']} />
)} )}
); } function MetricCard({ label, value }: { label: string; value: string }) { return (
{value}
{label}
); }