17.Dashboards & watchlists
User-defined widget dashboards as your morning landing page, watchlists with per-symbol context menus, screener / scanner presets bookmarked, and the 16-symbol world-markets snapshot grid that runs on a 60 s cache.
The default Dashboard
The Dashboard tile (Cmd+Opt+D) renders a fixed default layout if you haven't created a custom one:
- Equity curve — your account equity over the selected date range.
- Top stats strip — YTD P&L, MTD P&L, win rate, expectancy, profit factor.
- R-distribution mini-chart — current account, configurable lookback.
- Open positions list — live mark-to-market.
- World markets grid — 16 symbols across regions, on a 60 s cache.
- Today's catalysts — last 10 from the catalyst radar (step 07).
- Recent halts — last 5 from the halt feed.
The default is sized to look right on a 1080p monitor and reflow to a single column on phone-narrow widths (mostly relevant in web mode).
Custom dashboards
GET/POST /api/dashboards. Build your own from the widget palette. A dashboard is a 12-column grid; widgets place at (col, row, w, h). Available widgets:
- Equity curve — account / date range parameter.
- Stat tile — pick a stat from a long enum (win rate, expectancy, max drawdown, current streak, days-since-loss, etc.).
- Watchlist — references a watchlist ID; renders live quotes + sparklines.
- Scanner / Screener — references a saved screener / scanner preset; renders top N results.
- Symbol chart — uPlot mini-chart, configurable timeframe + overlays.
- Custom indicator value — current value of a referenced custom indicator, as a number / gauge / spark.
- News / catalyst feed — filtered by symbol / source.
- Heatmap — sector / S&P / watchlist.
- HTML note — a markdown-rendered text widget. Pin your daily checklist here.
Multiple dashboards per user; the sidebar lists them. Each dashboard has a slug; bookmark the dashboard URL for one-click access.
Watchlists
- Per-account, per-user. Watchlists live in
watchlists+watchlist_symbols. Each symbol row has an optional note (your thesis on the name) and a tag set. - Live quotes. The watchlist view subscribes to
WS /ws/ticksfor its symbols; price / change / volume update live. - Sparkline — last 5d intraday or last 30d daily, configurable.
- Per-symbol ctxmenu — the standard 6-way Charts / Options / Research / Earnings / News / Copy menu, plus watchlist-specific actions (Remove, Add note, Tag).
- Bulk add — paste a comma-separated list of tickers; unknown tickers are flagged.
Screener & scanner presets as bookmarks
Screener (step 08) and scanner (step 09) outputs are URL-addressable with the filter set + preset name in the query string. Save a preset → it shows up in the launcher tile filter AND becomes a candidate for dashboard widgets. Saved screeners + scanners are first-class watchlists in everything but name.
World markets snapshot
GET /api/markets/snapshot. 16 symbols across regions:
S&P 500 / NASDAQ / Russell 2000 / Dow Jones / DAX / FTSE 100 / CAC 40 / Euro Stoxx 50 / Nikkei 225 / Hang Seng / Shanghai Comp / KOSPI / ASX 200 / TSX / Bovespa / Sensex
The snapshot route fans out to Yahoo v8 with futures_util::future::join_all — real concurrency, not serial. Caches in-process for 60 s so the dashboard widget doesn't re-fan-out on every browser refresh.
Pre-market variant (GET /api/premarket/snapshot) replaces the world-equity grid with futures + commodities + crypto + FX + econ events (step 06).
Live Positions tile
The Live Positions tile is the live version of the Trades view filtered to status = 'open'. Real-time unrealized P&L via WS /ws/ticks. Per-row ctxmenu adds:
- Set stop / target — writes to
trade.planned_stop/trade.planned_target. Used by the alert engine to ping you when the level is touched. - Move to breakeven — sets stop to entry-avg.
- Open chart with markers — same as Trades view.