Dashboard
Die erste Seite nach dem Anmelden – und tatsächlich die Seite, die Sie den ganzen Tag geöffnet lassen.
Die Landing Page (/, Components/Pages/Index.razor) ist ein Live-, Mobile-First-Kommandozentrum für
die Aktivitäten des eingeloggten Benutzers über cBot-Runs, Backtests, Ressourcen und (für Admins) den
Node-Cluster. Sie aktualisiert sich selbst, sieht auf dem Handy großartig aus und lässt Sie nie F5
drücken.
Was es zeigt
Von oben nach unten, priorisiert für ein Handy (jeder Block ist ein Vollbreiten-Stack-Item auf Mobile, ein responsives Grid auf Tablet/Desktop):
- Header — Titel, ein Live-Indikator (ein echter pulsierender Punkt; statisch unter
prefers-reduced-motion), die letzte Aktualisierungszeit und ein Perioden-Toggle (1H · 24H · 7D · 30D), das die KPIs und den Chart steuert. - Hero-KPIs — vier Blickfang-Karten, jeweils eine große Zahl + eine Inline-SVG-Sparkline und
(wo sinnvoll) ein Delta gegenüber der Vorperiode:
- Aktiv jetzt — Runs + Backtests, die gerade starten/laufen.
- Erfolgsrate — abgeschlossen ÷ (abgeschlossen + fehlgeschlagen) über den Zeitraum; Delta in Prozentpunkten.
- Abgeschlossen — beendete Runs/Backtests in dieser Periode; Delta gegenüber Vorperiode.
- Fehlgeschlagen — Fehler in dieser Periode; Delta (weniger ist besser, also zeigt ein Rückgang Grün).
- Aktivitäts-Chart — eine ApexCharts-Flächen-Zeitachse mit gestarteten / abgeschlossenen / fehlgeschlagen pro Zeitbucket.
- Instance-Status-Ring — ein Donut mit Running / Backtests / Pending / Completed / Failed, Gesamtzahl in der Mitte.
- Backtests — eine Drei-Kachel-Übersicht (Running / Completed / Failed), Klick durch zu
/backtest. - Copy-Trading — Ihre Copy-Trading-Profile mit Live-Status-Dot, Zielcount und einem Live-Badge
auf laufenden Profilen; Klick durch zu
/copy-trading. - KI-Agenten — Ihre persona-getriebenen Trading-Agenten mit Run-Status (Archetyp · Status) und
Zeitpunkt der letzten Aktion; Klick durch zu
/agent-studio. - Live-Aktivitäts-Feed — die 20 neuesten Ereignisse (neueste zuerst) mit farbcodiertem Status-Dot und relativer Zeitangabe.
- Cluster-Gesundheit (nur Admins) — Active-vs.-Total-Nodes und ein Kapazitäts-Nutzungs-Gauge.
- Ressourcen-Kacheln — cBots, Trading-Konten, cTrader-IDs, MCP-Schlüssel (Klick durch zu den jeweiligen Seiten).
Ihr Dashboard anpassen
Jeder oben genannte Block ist ein steuerbares Widget. Klicken Sie auf Anpassen (oben rechts im Header), um einen Dialog zu öffnen, in dem Sie jedes Widget ein-/ausblenden und mit Hoch-/Runter-Pfeilen neu anordnen können. Auf Standard zurücksetzen stellt die Katalogreihenfolge wieder her. Ihre Wahl wird serverseitig pro Benutzer persistiert, sodass sie Ihnen über Browser und Geräte hinweg folgt — nicht nur in diesem Tab.
- Feature-gesteuerte und Admin-only-Widgets (Copy-Trading, KI-Agenten, Cluster-Gesundheit) erscheinen nur dann im Dialog, wenn Ihr Deployment/Ihre Rolle sie nutzen kann.
- Der Widget-Katalog ist eine einzige Quelle der Wahrheit in
Core/Dashboard/DashboardWidgets.cs; die Darstellung (Label + Icon + Verfügbarkeit) lebt inComponents/Dashboard/DashboardWidgetMeta.cs.
Wie es live bleibt
Die Seite polled GET /api/dashboard/overview?period=<1h|24h|7d|30d> alle 10 Sekunden und rendert die
Widgets in-place neu — kein manuelles Neuladen. Ein vorübergehender Fetch-Fehler wird verschluckt und im
nächsten Tick erneut versucht; die Schleife stoppt sauber beim Dispose. Der erste Load zeigt ein Skeleton;
ein anhaltender Fehler zeigt eine Fehlerkarte mit Wiederholen; ein Benutzer ohne Daten sieht
nullsifizierte KPIs und leeren State-Text.
Backend
Endpoints/DashboardEndpoints.csmappt/overview(und behält die älteren skalaren/statsbei). Es ist pro Benutzer und Admin-gesteuert überICurrentUser; die Uhr kommt vonTimeProvider. Es mappt auchGET/PUT /api/dashboard/layout— das Widget-Layout des Benutzers, geladen beim Seitenstart und gespeichert aus dem Anpassen-Dialog.- Layout-Persistenz ist das
UserDashboard-Aggregate (Core/Dashboard/UserDashboard.cs): ein Board pro Benutzer (eindeutig aufUserId), das eine geordnete Liste von Widget-Einstellungen (sichtbar + Reihenfolge) alsjsonb-Spalte speichert. Die geordnete Liste wird nur überApply/Resetmutiert, die jeden Schlüssel gegen denDashboardWidgets-Katalog validieren und die Sammlung vollständig und dedupliziert halten. Unbekannte Schlüssel werden mit einerDomainException→400abgelehnt. Endpoints/DashboardQuery.csbaut das zusammengesetzteDashboardOverview-Read-Modell: eine Allzeit-Status-Snapshot (gruppierte Counts), ein windowed Set von Instanzen, einmalig materialisiert, und Ressourcen/Node-Counts. Instance-Status und Terminal-Timestamps leben auf TPH-Subtypen (nicht Spalten), sodass Zeilen im Speicher über die gemeinsamenInstanceEndpoints.GetStartedAt/GetStoppedAt-Helfer gelesen werden. Event-Zeit =stopped ?? started ?? created.Endpoints/DashboardModels.cshält die DTOs, den Period→(Window, Bucket-Count)-Plan undDashboardMath— rein, deterministisch, Bucketing + KPI/Delta-Mathematik (kein I/O,nowwird übergeben).
KPI-Deltas vergleichen das aktuelle Fenster mit dem unmittelbar vorhergehenden (die Abfrage holt ein doppeltes Fenster dafür). Es gibt keinen Live-Konto-P&L-Feed — die Plattform hat nur Equity für Backtests und Prop-Firm-Tracking — sodass das Dashboard bewusst operational ist (Aktivität, Durchsatz, Erfolgsrate), kein Brokerage-Bilanz-Ticker.
Design & Tokens
Alle Farbe kommt aus Design-Tokens (var(--app-success|-warning|-error|-info|-primary|-text*)), sodass
eine White-Label-Palette kostenlos durchfließt — einschließlich des Charts, dessen Serienfarben zur
Laufzeit aus den aufgelösten Tokens gelesen werden via window.appReadTokens (SVG kann CSS-Variablen
nicht direkt konsumieren). Keine hardcodierte Hex-Farbe irgendwo im Dashboard. Siehe
../ui-guidelines.md.
Der „Powered by cMind"-Link
Das Dashboard zeigt einen kleinen, geschmackvollen „Powered by cMind"-Link, der auf diese
Dokumentationsseite verweist. Er wird standardmäßig angezeigt — wir sind stolz auf das Projekt und
er hilft anderen Händlern, es zu finden — aber es ist ganz Ihre Entscheidung. Wiederverkäufer, die eine
vollständig white-labelte Instanz betreiben, setzen App:Branding:ShowSiteLink auf false und er
verschwindet. Siehe White-Label-Branding.
Tests
- Unit-Style (
tests/IntegrationTests/DashboardMathTests.cs) — Bucketing, Erfolgsrate, Vorperioden-Deltas, Perioden-Parsing, leer/grenzwertig (Event beinow, Division-by-Zero-Guard). - Unit (
tests/UnitTests/Dashboard/UserDashboardTests.cs) — dasUserDashboard-Aggregate: Standard-Seed, Apply-Reihenfolge/Sichtbarkeit, Append-Omited, Duplikat-Collapse, unbekannter-Schlüssel-Ablehnung, Reset. - Integration (
tests/IntegrationTests/DashboardQueryTests.cs,DashboardLayoutTests.cs) — das Read-Modell gegen echtes Postgres (Status/KPIs/Aktivität/Ressourcen, Admin-Node-Gesundheit, leerer-Benutzer-Pfad), die neuen Backtests/Copy-Profiles/Agenten-Abschnitte, und ein Layout Roundtrip (Custom-Layout speichern → neu laden → Reihenfolge + Sichtbarkeit persistiert). - E2E (
tests/E2ETests/DashboardTests.cs,DashboardCustomizeTests.cs) — Desktop + Mobile: KPI-Karten, Chart, Ring und Feed rendern; der Perioden-Toggle wechselt die aktive Periode und lädt neu; eine KPI bohrt durch zu/run; ein Widget ausblenden persistiert über einen Reload, Zurücksetzen stellt es wieder her, und der Anpassen-Dialog funktioniert auf einem Handy ohne horizontalen Overflow./ist auch inPageSmokeTests,MobileLayoutTests(Shell + kein Overflow) undMobileJourneyTests.