diff --git a/dashboard/src/pages/Backtest.tsx b/dashboard/src/pages/Backtest.tsx index 3071616..48e6bba 100644 --- a/dashboard/src/pages/Backtest.tsx +++ b/dashboard/src/pages/Backtest.tsx @@ -4,11 +4,14 @@ import client from '../api/client'; import { EquityCurve } from '../components/EquityCurve'; import { MetricsRow } from '../components/MetricsRow'; +const DEFAULT_TICKERS = ['AAPL', 'TSLA', 'NVDA', 'MSFT', 'GOOGL']; + interface BacktestConfig { start_date: string; end_date: string; initial_capital: number; strategies: string[]; + tickers: string[]; } interface BacktestResult { @@ -37,6 +40,8 @@ export default function Backtest() { const [endDate, setEndDate] = useState('2026-01-01'); const [initialCapital, setInitialCapital] = useState(100000); const [selectedStrategies, setSelectedStrategies] = useState([]); + const [selectedTickers, setSelectedTickers] = useState([...DEFAULT_TICKERS]); + const [customTicker, setCustomTicker] = useState(''); const [currentRunId, setCurrentRunId] = useState(null); const { data: strategyOptions } = useQuery({ @@ -74,12 +79,13 @@ export default function Backtest() { }); const handleSubmit = () => { - if (!startDate || !endDate || selectedStrategies.length === 0) return; + if (!startDate || !endDate || selectedStrategies.length === 0 || selectedTickers.length === 0) return; runMutation.mutate({ start_date: startDate, end_date: endDate, initial_capital: initialCapital, strategies: selectedStrategies, + tickers: selectedTickers, }); }; @@ -89,6 +95,20 @@ export default function Backtest() { ); }; + const toggleTicker = (ticker: string) => { + setSelectedTickers((prev) => + prev.includes(ticker) ? prev.filter((t) => t !== ticker) : [...prev, ticker] + ); + }; + + const addCustomTicker = () => { + const ticker = customTicker.trim().toUpperCase(); + if (ticker && !selectedTickers.includes(ticker)) { + setSelectedTickers((prev) => [...prev, ticker]); + } + setCustomTicker(''); + }; + const metricsDisplay = result?.metrics ? [ { @@ -132,7 +152,7 @@ export default function Backtest() {

Configuration

-
+
+
+ +
+ +
+ +
+ {DEFAULT_TICKERS.map((ticker) => ( + + ))} + {selectedTickers + .filter((t) => !DEFAULT_TICKERS.includes(t)) + .map((ticker) => ( + + ))} +
+ setCustomTicker(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && addCustomTicker()} + placeholder="Add ticker..." + className="w-28 px-2 py-1 bg-slate-700 border border-slate-600 rounded text-white text-sm focus:outline-none focus:ring-1 focus:ring-blue-500" + /> + +
+
+