import { useState, useEffect, useRef } from "react"; interface TradingSettingsProps { settings: Record; onSave: (key: string, value: any) => Promise; saveError: string | null; } export default function TradingSettings({ settings, onSave, saveError }: TradingSettingsProps) { const [maxLossPercent, setMaxLossPercent] = useState(settings["trading.maxLossPercent"] ?? 2); const [positionSizePercent, setPositionSizePercent] = useState(settings["trading.positionSizePercent"] ?? 10); const [takeProfitPercent, setTakeProfitPercent] = useState(settings["trading.takeProfitPercent"] ?? 5); const [stopLossPercent, setStopLossPercent] = useState(settings["trading.stopLossPercent"] ?? 3); const [riskMethod, setRiskMethod] = useState(settings["trading.riskMethod"] ?? "percentage"); const saveTimersRef = useRef>>(new Map()); useEffect(() => { setMaxLossPercent(settings["trading.maxLossPercent"] ?? 2); setPositionSizePercent(settings["trading.positionSizePercent"] ?? 10); setTakeProfitPercent(settings["trading.takeProfitPercent"] ?? 5); setStopLossPercent(settings["trading.stopLossPercent"] ?? 3); setRiskMethod(settings["trading.riskMethod"] ?? "percentage"); }, [settings]); const debouncedSave = (key: string, value: any) => { if (saveTimersRef.current.has(key)) { clearTimeout(saveTimersRef.current.get(key)!); } const timer = setTimeout(() => { onSave(key, value); saveTimersRef.current.delete(key); }, 300); saveTimersRef.current.set(key, timer); }; useEffect(() => { return () => { saveTimersRef.current.forEach((timer) => clearTimeout(timer)); }; }, []); const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max); return (

Trading Defaults

Default risk management and position sizing parameters.

{saveError && (
{saveError}
)}
{ const v = clamp(parseFloat(e.target.value) || 0.1, 0.1, 100); setMaxLossPercent(v); debouncedSave("trading.maxLossPercent", v); }} className="w-32 border border-gray-300 rounded-lg px-4 py-2.5 text-gray-900 focus:ring-2 focus:ring-blue-500" />

Maximum portfolio percentage to risk on a single trade.

{ const v = clamp(parseInt(e.target.value) || 1, 1, 100); setPositionSizePercent(v); debouncedSave("trading.positionSizePercent", v); }} className="w-32 border border-gray-300 rounded-lg px-4 py-2.5 text-gray-900 focus:ring-2 focus:ring-blue-500" />

Default position size as percentage of available cash.

{ const v = clamp(parseFloat(e.target.value) || 0.1, 0.1, 100); setTakeProfitPercent(v); debouncedSave("trading.takeProfitPercent", v); }} className="w-32 border border-gray-300 rounded-lg px-4 py-2.5 text-gray-900 focus:ring-2 focus:ring-blue-500" />

Target profit percentage for auto take-profit orders.

{ const v = clamp(parseFloat(e.target.value) || 0.1, 0.1, 100); setStopLossPercent(v); debouncedSave("trading.stopLossPercent", v); }} className="w-32 border border-gray-300 rounded-lg px-4 py-2.5 text-gray-900 focus:ring-2 focus:ring-blue-500" />

Stop loss percentage below entry price.

); }