diff --git a/frontend/src/api/tradingHooks.ts b/frontend/src/api/tradingHooks.ts index 76cb2da..2b1e5c6 100644 --- a/frontend/src/api/tradingHooks.ts +++ b/frontend/src/api/tradingHooks.ts @@ -22,6 +22,8 @@ export interface TradingEngineStatus { portfolio_heat: number; portfolio_value: number; open_position_count: number; + max_open_positions: number; + absolute_position_cap: number; last_decision_at: string | null; micro_trading_enabled: boolean; uptime_seconds: number | null; diff --git a/frontend/src/pages/trading/TradingOverview.tsx b/frontend/src/pages/trading/TradingOverview.tsx index a36ae27..3a19375 100644 --- a/frontend/src/pages/trading/TradingOverview.tsx +++ b/frontend/src/pages/trading/TradingOverview.tsx @@ -35,6 +35,8 @@ export function TradingOverview() { const resume = useResumeTradingEngine(); const updateConfig = useUpdateTradingConfig(); const [selectedTier, setSelectedTier] = useState(null); + const [maxPositions, setMaxPositions] = useState(null); + const [positionCap, setPositionCap] = useState(null); if (isLoading) return ; if (!status) return

No trading status available

; @@ -131,6 +133,68 @@ export function TradingOverview() { + {/* Position Limits */} + +

Position Limits

+
+
+ +
+ setMaxPositions(Number(e.target.value))} + className="w-20 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" + /> + + + Current: {status.open_position_count ?? 0} / {status.max_open_positions ?? 10} + +
+
+
+ +
+ setPositionCap(Number(e.target.value))} + className="w-24 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" + /> + +
+
+
+
+ {/* Portfolio Heat Gauge */}

Portfolio Heat

diff --git a/services/trading/app.py b/services/trading/app.py index 3a4706d..e45f8d4 100644 --- a/services/trading/app.py +++ b/services/trading/app.py @@ -314,6 +314,8 @@ async def trading_status() -> dict[str, Any]: "reserve_pool": reserve_pool, "portfolio_heat": portfolio_heat, "open_positions": open_positions, + "max_open_positions": engine.config.max_open_positions, + "absolute_position_cap": engine.config.absolute_position_cap, "last_decision_at": None, }