bin/Custom/AddOns/SentinelDashboard_v1_0_0.cs
| Family | AddOns / runtime |
| Version | 1.0.0 |
| Size | 3763 lines |
| Scope | public — ships in sentinel-suite |
| Class | SentinelDashboardAddOn |
| Namespace | NinjaTrader.NinjaScript.AddOns.Sentinel |
| Documented by | no doc tracks this artifact |
Rendered from the published copy in
sentinel-suite/src/, not the author’s private tree — so this page describes the file you actually have.
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
one at https://mozilla.org/MPL/2.0/.
Copyright (c) 2026 silentsudo-io and the Sentinel Suite contributors.
─────────────────────────────────────────────────────────────────────────────
═════════════════════════════════════════════════════════════════════════════
SentinelDashboard — unified config/control window for the Sentinel Suite (NT8)
File: SentinelDashboard_v1_0_0.cs
Version: v1.1.9 (Accounts tab exposes the FULL governor — manual cap / reset hour / trailing DD / auto-flatten — no conf editing)
─────────────────────────────────────────────────────────────────────────────
WHAT THIS IS (see Docs/ROADMAP.md, memory: sentinel-suite-architecture)
The ONE window for the whole suite. Adds "Sentinel Suite" under Control Center > New.
A TabControl with one tab per Sentinel tool; each tab ATTACHES to that tool's headless
service singleton (e.g. SentinelCopierService_v0_1_0.Instance) — it does NOT own the
service, and closing this window never stops any service. Same attach pattern as
MAEDashboard → MAECaptureService.
A shared TOP BAR carries the suite-wide KILL-SWITCH (SentinelCore) and live status,
visible from every tab.
VERIFIED SCAFFOLDING (from in-repo BuySellVolumePressureDashboardAddOnV001 + MAEDashboard):
• Menu: OnWindowCreated(Window) → (window as ControlCenter).FindFirst("ControlCenterMenuItemNew")
as NTMenuItem; add an NTMenuItem child; open the window from Core.Globals.RandomDispatcher.
• Window derives from NTWindow (NinjaTrader.Gui.Tools); set Caption/Width/Height/Content.
• UI built in code (Grid/StackPanel/Border/TextBlock/Button/ComboBox/TextBox/CheckBox).
• Cross-thread brushes are Freeze()'d; background→UI updates via Dispatcher.InvokeAsync.
• Unsubscribe every handler in the Closed event.
CHANGELOG
v1.1.9 — (in-place) Accounts tab now exposes the FULL governor so nothing needs hand-editing Profiles.conf:
added Manual daily cap $ (0=R×target), Daily reset hour 0–23 (global — when the day rolls; 17=5pm
prop-firm), Trailing DD $ + DD type (trailing/static/eod) + DD flatten buffer $, and an Auto-flatten
(hardEnforce) checkbox. Save now MERGES into the account's existing conf line (preserves any field the
editor doesn't manage — previously a Save rebuilt the line from scratch and could silently wipe e.g.
ddFlat). ddFlat/resetHour aren't on AccountProfile so they load from the raw conf line / global state.
v1.1.8 — (in-place) EXCURSION TAB REDESIGN (was an early, cluttered single column): now a two-column
master/detail that uses the window width — compact header (controls · plain-language status
"N records · N signals · N files" w/ path tooltip · tiles · live configs), then LEFT = the ranked
edge list (clickable rows drive the detail; selected row highlights cyan + hover), RIGHT = the
selected signal's deep-dive (growth · outcome cloud · TP/SL grid · referees · Apply ◆). Removed the
redundant "Signal → excursion medians" wall-of-text table (duplicated the chart+detail) and the
long footer paragraph. The detail charts (growth line · outcome cloud · TP/SL grid) are now
RESPONSIVE — a ResponsiveHost redraws each at the right column's live width (fills the column,
tracks window resize; the right column constrains to viewport). No analytics lost — presentation only.
v1.1.7 — (in-place) new HOME tab (front page; first tab, selected on open). First item: a RED FOLDER NEWS
readout of the economic-calendar event veto — reads Sentinel\News.conf (written by the native
SentinelNewsService) directly, re-parsing only on mtime change but recomputing countdowns every
tick: tiles (protection LOCKED/CLEAR/STALE · next event countdown · windows loaded), the upcoming
red-folder schedule (local time + countdown + window, the active lockout highlighted), and a footer
(feeder status + News.conf freshness + source line). "Red folder" = impact:High from the feed — the
service already filters to HIGH, so News.conf IS the red-folder list. Room to grow more front-page items.
v1.1.6 — (in-place) Accounts tab clarity: GovernorCard shows live OPEN (unrealized) P&L inline + a sub-line
with the account's RAW realized ("matches NT" — g.DailyPnl is realized-SINCE-a-baseline for the
consistency rule, which reads ~0 after mid-day F5s; the raw figure mirrors NT's column so the card
is never confusingly blank). "Live P&L · today" tile now folds in open P&L. Pairs with
SentinelRiskService v1.0.8 persisting the governor daily baseline (survives F5/restart).
v1.1.5 — (in-place) Excursion tab: new ⑤ CONVICTION REFEREE in the per-signal detail — for COUNCIL
groups only, shows HIGH/MID/LOW conviction buckets (from SentinelExcursions v1.0.5 ByConviction)
+ a "does conviction pay?" verdict (ConvictionVerdictCode) that names the SentinelBridge
MinConviction floor to set. The COUNCIL group + Apply ◆ (→ <inst>_COUNCIL_<dir>.conf) already
worked via the generic by-signal code. Pairs with SentinelExcursionRecorder_v1_4 (schema 1.2).
v1.1.4 — (in-place) MORE VISUALS — reusable WPF chart primitives (dataviz method + Sentinel palette:
cyan=magnitude, green/red=money+polarity, no rainbow categorical) added near Track(): HBars
(horizontal magnitude), HDivBars (diverging around a center baseline, Canvas-positioned) and
Columns (vertical time histogram). Marks per spec: thin bars, rounded DATA end (square at the
baseline), recessive Faint/Edge gridlines, values/labels in TEXT tokens (never the bar hue).
Applied: SLIPPAGE = avg-slip-per-instrument diverging bars (red adverse / green improvement);
JOURNAL = activity histogram (events per hour today / per day for a window); LENS = net-ticks
diverging bars per strategy + instrument; EYE = signed-score diverging bars (green long / red
short); ARC = day-P&L per fleet slot; RISK = data-lag per feed (green/amber/red by threshold);
ACCOUNTS = fleet day-P&L per governed account. Charts sit ABOVE the existing text rows (chart +
table, per the accessibility rule). SignedBars auto-picks MAGNITUDE bars (full width) for
one-sided data and DIVERGING only when signs are mixed, so a chart never wastes half its width.
v1.1.3 — (in-place) new TEST tab — the "prove the safety system" surface: (1) ALERT CHANNEL config
(Enabled / Play-Info / Push-on-Info / throttle / wav paths / push cmd) with Save-&-apply
(SentinelAlertService.Apply → writes Alerts.conf + live-applies, no restart), Reload, and
Test Info/Critical buttons that fire a REAL alert (sound + push + ledger + Risk display);
(2) DRY-RUN ENTRY PROBE — GateEntry + SizeForRisk + TickValue for an account/instr/qty/stop/
risk with NO order submitted (engage the kill → gate returns HARD, safely); (3) SAFE SELF-
CHECKS — scoped-kill isolation (fake roots), sizer unaffordable→0/generous→≥1, TickValue>0,
green/red; (4) LEDGER AUDIT — today's kill/flatten/alert/restore/fill counts. Also: Journal
tab "▶ Live" toggle (2s auto-refresh tail; stopped on close). SentinelAlertService→v1.0.1.
v1.1.2 — (in-place) new SLIPPAGE tab + FILL events in Journal (Substrate 2, execution-quality view).
SentinelCore v1.1.0 gained Ledger.Fill (records intended-vs-actual fill price → adverse
slip ticks); GTrader21 (in-place, observability-only) now logs every realtime fill.
SLIPPAGE tab: window (Today / 7 / 30) → tiles (fills · avg slip · worst · adverse % · est.
$ impact via SentinelCore.TickValue), per-instrument drag (sorted), and worst individual
fills. Only stop/limit fills (a comparable intended price) count — pure-market fills are
excluded. Stop-fill slippage = the prop risk this surfaces. JOURNAL tab gained a Fills
tile + "Fills" filter + fill rows (colored by execution quality: adverse=red, improvement
=green). All still one stream, many views — no parallel journal.
v1.1.1 — (in-place) new JOURNAL tab (hardening Substrate 2 read side): a blotter + action-audit
VIEW of the SentinelCore.Ledger JSONL event stream. Window selector (Today / 7 / 30 local
days) + type filter (All / Orders / Actions / Alerts); hero tiles (events / orders /
actions / alerts / accounts / instruments); chronological newest-first rows — orders
colored by side (buy=green, sell=red) with instr·qty·type·px·acct·tag, actions/alerts
colored by kind (kill/flatten/crit=red, alert/block/halt=amber). Reads via new
Ledger.ReadRecent()/ReadDay()/Parse() (SentinelCore v1.1.0). On-demand, read-only; cached
parse so filter buttons don't re-hit disk. No parallel journal — one stream, many views.
v1.1.0 — VISUAL RESKIN (phase 1 — theme + chrome) to the "flight-instrument" design language (see
the design-direction mockup + the redesigned GTrader21 risk card). Repaletted all brushes to
the mockup tokens (void/panel/line/ink/mute + Green/Red=money, Amber=caution) and added a
cyan ACCENT (=live/watching) + Ink2/Faint/Card2. New TOP BAR: Sentinel "eye" brand mark
(glow), SENTINEL SUITE title, and the kill-switch as a rounded status pill (dot+label, red
when engaged). PILL TABS via a TabItem ControlTemplate (transparent idle, panel-toned +
cyan underline when selected, hover = ink2). All tab CONTENT inherits the new palette;
per-tab card/tile restyle is phase 2.
v1.0.9 — (in-place) new ACCOUNTS tab: per-account profile editor (account + firm-preset dropdown +
ratio/target/daily-loss/size/contracts/session) that writes Sentinel\Profiles.conf (upserts
the account's line); firm preset prefills ratio/loss; a live list of current profiles from
SentinelCore.AllAccountProfiles(). Feeds the Governor + (future) sizing.
v1.0.8 — (in-place) Risk tab: a "Consistency governor" section (per-account daily P&L vs cap/
loss-stop + status, from SentinelCore's governor registry). Excursion tab: a "Sync all
◆ configs" button (write every confident +EV signal's ◆ config in one click; refactored
ApplyBestRespToGTrader → WriteConfigFor). EyeVerdictCode now delegates to Group.
v1.0.7 — (in-place) Eye referee → ACTIONABLE: a green/amber recommendation line ("Eye-gate ON/OFF
for this signal") from EyeVerdictCode; and "Apply ◆" now writes useEyeGate=true/false into
the .conf when the referee is conclusive (GTrader21 v0.1.6 applies it). Closes the
referee→config→strategy loop for the Eye filter.
v1.0.6 — (in-place) Excursion tab: "Active lab configs" live section (which running GTrader21
instance is on which .conf + TP/SL, from SentinelCore's config-use registry, refreshed
on the timer); and a ④ "Eye referee" in the per-signal detail (endorsed vs not-endorsed
medians/expectancy + a plain-English verdict — fills in as Eye data accrues).
v1.0.5 — (in-place) Excursion viz: ★ mark now ORANGE / ◆ GREEN (colored Runs); per-signal
FIRE-RATE (n/day + days, in the text rows + detail header — a +EV signal that fires
rarely isn't a business); scatter EYE-ENDORSEMENT overlay (hollow rings on Eye-endorsed
fires + legend, accrues once Eye runs); "Apply ◆ to GTrader21 config" button writes the
best-responsible TP/SL to Sentinel\GTraderConfigs\<inst>_<signal>_<dir>.conf.
v1.0.4 — (in-place) Excursion viz CONFIDENCE + R:R honesty: edge chart dims small-sample rows
(n<30) + a "Confident only (n≥30)" filter on the chart & detail selector; expectancy
grid now shows R:R per config, marks the best RESPONSIBLE (stop≤TP) config with ◆
distinct from the raw ★, and dims wide-stop mirages; scatter faintly shades the win zone
(MFE≥TP & MAE<SL). Alias-safe (ShapeLine/Ellipse/Polyline; win-zone uses a Border).
v1.0.3 — (in-place) Excursion tab PER-SIGNAL DETAIL (WPF-drawn, System.Windows.Shapes): a signal
selector drives three linked visuals — ① growth line (median MFE/MAE at 5/15/60 min),
② outcome scatter (each fire MAE15×MFE15, colored by regime, with dashed TP/SL overlay
from the trend Best; strided to stay snappy on big clouds), ③ TP/stop expectancy grid
(all 12 configs from SentinelExcursions.TpStopGrid, diverging bars, ★ best). Summary is
cached so the selector redraws without reloading.
v1.0.2 — (in-place) Risk tab: a "Scoped instrument halts" section listing per-instrument kills
(SentinelRisk v1.0.4 now halts one root, not the whole suite); top line relabeled
"Global kill-switch". Excursion tab: a new EDGE CHART — a diverging bar per signal group
(trend regime), green median MFE to the right vs red median MAE to the left at 15 min,
ranked by edge — the at-a-glance "which signal has an edge" view above the text rows.
v1.0.1 — (in-place) Risk tab live-phase additions: "Re-request feeds" button
(SentinelRiskService.ReRequestAllFeeds), a contract-rollover countdown section
(days-to-roll per instrument, red when entries are blocked), and a news-lockout
section (active windows + next upcoming from Sentinel\News.conf). Feed rows now
tag watch-registered feeds and show recovery-attempt counts. Excursion status line
now reports UNIQUE record count + dupe-fire / legacy-v1.0 skips (SentinelExcursions v1.0.1).
v1.0.0 — initial dashboard. Control Center menu entry; NTWindow + TabControl shell;
shared kill-switch top bar (bound to SentinelCore); LIVE "Copy" tab that edits
the copier config (leader, provider policy, follower rows with per-follower
instrument-map DSL + multiplier) and pushes it via Reconfigure(). Placeholder
tabs for Log/Risk/Lens/Arc/Eye. Persistence (save/load config) is a follow-up —
Apply configures the LIVE service only.