Dashboard
The Dashboard is the default Atlas workspace. The main area is an AG Grid–based positions view fed by the REST position snapshot plus merged WebSocket/live-store updates. A draggable vertical split separates this primary pane from an optional sidebar stack of widgets (defaults: P&L summary, Risk, Orders). Use Add widget on the toolbar to attach optional widgets such as Booked trades (from the Trades module).
Resize panels by dragging the split grip between primary and sidebar; widget layouts persist locally (atlas.dashboard.workspace.v1).
Overview
Section titled “Overview”| Area | Role |
|---|---|
| Toolbar | Saved grid views, add/remove sidebar widgets, reset dashboard layout |
| Grid tabs | Multiple tabs over the positions grid; each tab remembers column/group/filter layout separately (dashboard module scope) |
| Positions grid | Snapshot positions (SnapshotPosition) with pivot/group sidebar, charts, export |
| Sidebar widgets | Collapsible panels—typically P&L Summary, Risk (includes embedded exposure bars), Orders (TradeBlotterPanel) |
| Detail drawer | Opens when you select a leaf position row (position_line_key present) |
| Error banner | Shown if /positions/snapshot fails (with retry indication while TanStack Query refetches) |
Book tree
Section titled “Book tree”The Book tree panel lists live positions from the client store, grouped by book_id. Under each book it shows instrument_family values with a count of position rows in that family.
This is a lightweight structural rollup derived from streamed/merged grid data—not a separate navigational hierarchy selector. Use grouping or filters on the positions grid (for example by book_name, desk_id, entity_id) when you need entity/desk/strategy breakdowns from the full snapshot record.
Positions grid
Section titled “Positions grid”The grid renders SnapshotPosition rows from the frontend types package (frontends/atlas-web). Features include:
- Row grouping / pivot: row group panel always visible; pivot panel enabled; layouts persist per tab.
- Side bar: Columns / filters panel from the shared Atlas AG Grid theme.
- Cell flashing: optional directional highlights when values change (context menu).
- Context menu: decimal places, row height, font size, copy, chart range, CSV export.
- Selection: single-row selection; selecting a leaf row opens the detail drawer.
Default numeric formatting uses your grid preference decimal count (via context menu).
Column catalog
Section titled “Column catalog”Columns are defined in positionsGridColumnDefs.ts, aligned with Qt defaults where noted in source. Default visible is Yes when hide is false or omitted, No when hide: true.
| UI name | API field / colId | Default visible | Notes |
|---|---|---|---|
| Instrument | instrument | Yes | symbol → else venue_symbol → else instrument_id |
| Ticker | ticker | Yes | Same display chain as Instrument |
| Symbol | symbol | No | Raw symbol field |
| Venue Sym | venue_symbol | No | |
| Instrument ID | instrument_id | No | |
| Asset Class | asset_class | Yes | Displays instrument_family |
| CCY | denomination_ccy | Yes | Denomination currency |
| ISIN | isin | No | |
| CUSIP | cusip | No | |
| FIGI | figi | No | |
| Net Qty | quantity_signed | Yes | |
| Long Qty | qty_long | No | Derived from quantity_signed (non-positive → "0") |
| Short Qty | qty_short | No | Derived from quantity_signed (non-negative → "0") |
| Notional | outstanding_notional | Yes | |
| Mult | contract_multiplier | No | |
| Face Amt | face_amount | No | |
| Qty Basis | quantity_basis | No | |
| Inst Family | instrument_family | No | Also surfaced under Asset Class |
| Inst Kind | instrument_kind | No | |
| Mkt Price | mark_price | Yes | |
| Mkt Value | market_value_functional | Yes | |
| Clean MV | clean_market_value_functional | No | |
| Dirty MV | dirty_market_value_functional | No | |
| Accrued | accrued_interest_functional | No | |
| Mark Type | mark_type | No | |
| FX Rate | fx_rate_to_functional | No | |
| Mark CCY | mark_currency | No | |
| YTM | yield_to_maturity | No | |
| Unreal P&L | unrealized_pnl_functional | Yes | |
| Day P&L | pnl_functional_1d | Yes | |
| Valuation | valuation_status | Yes | Derived label from extensions.valuation_staleness_ms (see below) |
| MTD P&L | pnl_functional_1m | Yes | Field name *_1m in API payload |
| YTD P&L | pnl_functional_ytd | Yes | |
| Realised P&L | realized_pnl_functional_day | No | |
| Gamma | gamma | No | |
| Vega | vega | No | |
| Theta | theta | No | |
| PV (Mtm) | pv_functional | No | Value mirrors market_value_functional for aggregation |
| Pos Cat | position_category | No | |
| Book | book_name | Yes | |
| Book ID | book_id | No | |
| Entity | entity_id | No | |
| Entity Name | entity_name | No | |
| Account | account_id | No | |
| Desk | desk_id | No | |
| Strategy | strategy_id | No | |
| Reporting Entity | reporting_entity_id | No | |
| Functional CCY | functional_ccy | No | |
| Venue | primary_venue | No | |
| Settle Posture | settlement_posture | No | |
| Rho | rho | No | |
| Impl Vol | implied_vol | No | |
| Volga | volga | No | |
| Vanna | vanna | No | |
| PV01 | pv01_functional | No | |
| DV01 | dv01_functional | No | |
| CS01 | cs01_functional | No | |
| Delta | delta_functional | Yes | |
| Cash Delta | cash_delta | No | |
| Cash Gamma | cash_gamma | No | |
| Cash Vega | cash_vega | No | |
| Cash FX Delta | cash_fx_delta | No | |
| Cash Rho | cash_rho | No | |
| Cash Theta | cash_theta | No | |
| CVA | cva_functional | No | |
| DVA | dva_functional | No | |
| FVA | fva_functional | No | |
| Init Margin | initial_margin_functional | No | |
| Var Margin | variation_margin_functional | No | |
| Collateral MV | collateral_market_value_functional | No | |
| Haircut % | haircut_pct | No | |
| Avg Buy | mean_buy_price | No | |
| Avg Sell | mean_sell_price | No | |
| Bought | bought | No | |
| Sold | sold | No | |
| Past Cash | past_cash_functional | No | |
| 1W P&L | pnl_functional_1w | No | |
| Cost Basis | cost_basis_functional | No | |
| PnL Open | pnl_functional_since_open | No | |
| Ext | extensions_keys | No | Count of keys on extensions object |
| Snapshot ID | snapshot_id | No | |
| Source | source_system | No | |
| Valuation Model | valuation_model_id | No | |
| Snap Kind | snapshot_kind | No | |
| Line Key | position_line_key | No | Stable row key / leaf discriminator |
| Underlier | underlier_instrument_id | No | |
| Underlier Sym | underlier_symbol | No | |
| ASW (bps) | asw_spread_bps | No | |
| Notional CCY | notional_currency | No | |
| Trade Date | trade_date | Yes | |
| Snapshot TS | snapshot_ts | No |
When the column definition version (POSITIONS_GRID_COL_MODEL_VER) bumps, stored grid layouts below that version are reset so new defaults apply.
Toolbar
Section titled “Toolbar”The dashboard toolbar (DashboardToolbar) provides:
- Saved views (
SavedViewsMenu, moduledashboard): capture and restore AG Grid column state tied to the active grid tab API. - Add widget ▾: pick any sidebar widget not already shown (
pnl,risk,orders,trades). - Widget chips: quick-remove widgets already pinned to the sidebar (
×on each id). - Reset layout: restores default sidebar widgets (
pnl,risk,orders), default split ratio, and clears user split overrides.
Grid-level preferences (decimals, row height, font, flash) live in the positions grid context menu—not on this toolbar.
Detail drawer
Section titled “Detail drawer”Selecting a leaf row opens DetailDrawer on the right. Summary of tabs:
- Valuation: Position quantities and averages, market value (bond clean/dirty when applicable), P&L ladder, bond analytics or option fields when detected, full Greeks + cash Greeks, valuation curve metadata (
valuation_model_id, curves fromextensions, staleness ms, flags), instrument identifiers. - Calendar: Option expiry, upcoming bond coupons (from pricing context / generated schedule), dividend rows—loads
/atlas/instrument/pricing-contextfor the row’sinstrument_id. - Corp actions: Corporate-actions style schedule when data exists.
If rendering throws, an inline error boundary shows the message with Close.
Orders panel
Section titled “Orders panel”The sidebar Orders widget is implemented by TradeBlotterPanel (title Orders). It is not the legacy trade blotter: it loads working orders via useOrders() and renders them in AG Grid.
| UI name | API field | Default visible | Notes |
|---|---|---|---|
| Instrument | instrument_id | Yes | Pinned left |
| Order ID | order_id | No | |
| Client OID | client_order_id | Yes | |
| Side | side | Yes | Header defaults to field label |
| Type | order_type | Yes | |
| Qty | qty | Yes | Numeric column |
| Filled | filled_qty | Yes | |
| Remain | remaining_qty | Yes | |
| Limit Px | limit_price | Yes | |
| Avg Px | avg_fill_price | Yes | |
| State | state | Yes | |
| Venue | venue_id | Yes | |
| Entity | entity_id | Yes | |
| Account | account_id | No | |
| Created | created_at | Yes | |
| Updated | updated_at | No |
Row grouping is enabled on the orders grid (rowGroupPanelShow="always").
Booked trades vs orders
Section titled “Booked trades vs orders”Use Add widget → Booked trades for fills from the Trades module (TradesWidget + TradesGrid). Amend and cancel workflows apply to booked trades, not to the Orders grid.
P&L strip
Section titled “P&L strip”The P&L Summary sidebar widget (PnLSummaryPanel) calls /positions/summary and shows a compact KPI strip:
- MV (func) — gross market value functional
- Unrealised —
unrealized_pnl_functional - Realised day —
realized_pnl_functional_day - P&L 1w —
pnl_functional_1w - P&L YTD —
pnl_functional_ytd - Lines — position line count when provided
Loading and error states render inline in the panel. Values reuse shared summary normalization helpers so scalar envelopes match backend shapes.
Risk strip
Section titled “Risk strip”The Risk sidebar widget (RiskSidebarPanel) surfaces portfolio aggregates from the same /positions/summary envelope:
- Rate risk: DV01, CS01, PV01 (displayed via basis-points formatting helper).
- Greeks (func): Delta, Vega, Theta in functional currency units.
An embedded Exposure / 1d P&L section (ExposureChart) sits below the metrics.
Exposure chart
Section titled “Exposure chart”ExposureChart aggregates live positionsStore rows:
- Group by:
family(instrument_family),kind(instrument_kind), orccy(functional_ccy). - Metric: MV (
market_value_functional) or 1d P&L (pnl_functional_1dfalling back tounrealized_pnl_functional).
Bars sort by absolute magnitude; green/red indicates sign. A footer shows the bucket total.
Data freshness
Section titled “Data freshness”REST polling intervals
Section titled “REST polling intervals”TanStack Query hooks in positions.ts:
| Endpoint | Client staleTime | Behavior |
|---|---|---|
/positions/snapshot | 30s | Feeds initial rows into positionsStore; banner on hard failure |
/positions/summary | 15s | Powers P&L + Risk widgets; keeps previous data visible while refetching |
Live merges: websocket / store updates are folded into grid row data (mergePositionRowsForGrid) so cells can change between REST polls.
Valuation column (LIVE / WARN / STALE)
Section titled “Valuation column (LIVE / WARN / STALE)”The Valuation column reads extensions.valuation_staleness_ms (number or numeric string). Labels are computed in valuationStatusLabel:
| Label | Condition |
|---|---|
| N/A | Missing or non-finite staleness |
| LIVE | staleness_ms < 3_000 (under 3 seconds) |
| WARN | 3_000 ≤ staleness_ms < 30_000 (under 30 seconds) |
| STALE | staleness_ms ≥ 30_000 |
The detail drawer Valuation Curve section also prints raw valuation_staleness_ms when present.