Page - Dashboard

abstract

Main trading dashboard — displays live equity curve, KPI stats, open positions, recent trades, and kill-switch status for the active MT5 account.

Route

PropertyValue
Path/
Filefrontend/src/app/page.tsx
Auth RequiredNo
LayoutRoot layout with sidebar
Dynamic SegmentNone

Component Tree

DashboardPage (page.tsx)
├── AppHeader (title="Dashboard")
├── KillSwitchBanner (shows alert if kill switch active)
├── DashboardProvider (WebSocket handler — feeds live data into store)
│   ├── KpiBar (balance, equity, margin, P&L)
│   ├── EquityChart (equity curve — last 24h by default)
│   ├── LivePositions (open positions table)
│   └── RecentTrades (last 20 trades)
└── Button ("Sync Orders" — manual MT5 sync)

Data Layer

Server State — Direct fetch (no React Query)

CallHook / APIEndpointTriggered When
Account statsaccountsApi.getStats(activeAccountId)GET /api/v1/accounts/{id}/statsOn mount + when activeAccountId changes
Equity historyaccountsApi.getEquityHistory(id, hours)GET /api/v1/accounts/{id}/equity-historyOn mount + equityHours changes
Account detailaccountsApi.get(activeAccountId)GET /api/v1/accounts/{id}On mount (fetches auto_trade_enabled)
Sync ordersaccountsApi.sync(activeAccountId)POST /api/v1/accounts/{id}/syncManual button click

Global State — Zustand

StoreFields ReadActions Called
useTradingStoreactiveAccountIdsetBalance, setOpenPositions (via WebSocket)

Local State — useState

VariableTypeInitialPurpose
statsAccountStats | nullnullKPI data (balance, equity, P&L)
statsLoadingbooleanfalseLoading state for KpiBar
equityDataEquityPoint[][]Chart data points
equityLoadingbooleanfalseLoading state for EquityChart
equityHoursnumber24Time window selector (24h default)
autoTradeEnabledbooleantrueReflects account auto_trade_enabled
syncingOrdersbooleanfalseLoading state for sync button

Page Lifecycle

Validation & Conditions

Render Conditions

ConditionWhat Shows
activeAccountId === nullEmpty state: "Select an account to view dashboard"
statsLoadingSkeleton in KpiBar
equityLoadingChart skeleton
killSwitch.is_activeRed KillSwitchBanner at top
!autoTradeEnabledWarning badge on KpiBar
Equity point already in dataDeduplicated — handleEquityUpdate uses Set of timestamps
RoleLink
Backend APIAPI-GET-v1-Accounts
StoreStore - TradingStore
DB SchemaDB - accounts
DB SchemaDB - trades