Files
PolyTraderSharp/docs/UI-SPEZIFIKATION-WinForms.md
RichardandClaude Opus 5 0a26b8563d UI-Spezifikation der WinForms-Oberflaeche gesichert (Rekonstruktionsvorlage)
Vor dem Entfernen der WinForms-UI: maschinell aus allen .Designer.cs extrahierte
Spezifikation aller 16 Fenster - Groessen, Tabs, Beschriftungen, Schaltflaechen und
saemtliche Grid-Spalten mit Reihenfolge, Format und Breite. Dazu uebergreifende
Gestaltungsregeln, Farbwerte der PnL-Zeilenfaerbung, Symbol-Schluessel je Fenster
und Verhaltensnotizen aus dem Code-Behind.

Damit laesst sich die Avalonia-UI moeglichst 1:1 nachbauen. Der Originalcode bleibt
zusaetzlich im Tag winforms-final; das Dokument empfiehlt, dort einmalig Screenshots
mit echten Daten zu ziehen (optischer Gesamteindruck, den kein Text ersetzt).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 17:27:42 +02:00

462 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# UI-Spezifikation der WinForms-Oberfläche (Rekonstruktionsvorlage für Avalonia)
**Stand:** 06.08.2026 · **Zweck:** Die WinForms-UI wird im Zuge der Linux-Portierung entfernt.
Dieses Dokument hält fest, **wie sie aussah und was sie konnte**, damit die Avalonia-Umsetzung
so nah wie möglich am Original bleibt.
> **Der Originalcode ist nicht verloren.** Der Git-Tag **`winforms-final`** enthält den vollständigen
> letzten Stand. Auschecken und ansehen:
>
> ```bash
> git checkout winforms-final
> ```
>
> Dieses Dokument ist die *lesbare Zusammenfassung* — für Details (Pixelabstände, Andockung,
> Farbwerte) immer in den Tag schauen. Die Angaben unten sind maschinell aus den
> `.Designer.cs`-Dateien extrahiert, also exakt und nicht aus dem Gedächtnis rekonstruiert.
## Screenshots — bitte einmal selbst anlegen
Was dieses Dokument **nicht** leisten kann, ist der optische Gesamteindruck: Proportionen,
Abstände, Farbwirkung, wie voll die Fenster im Alltag aussehen. Dafür lohnt sich einmalig:
```bash
git checkout winforms-final
```
Dann die App starten, jedes Fenster **mit echten Daten** öffnen und einen Screenshot ablegen
(Vorschlag: `docs/ui-referenz/<Fenstername>.png`). Zehn Minuten Arbeit, die beim Nachbau mehr
wert sind als jede Beschreibung. Danach mit `git checkout main` zurück.
---
## Übergreifende Gestaltungsregeln
Diese Muster ziehen sich durch alle Fenster und sollten in Avalonia erhalten bleiben:
| Regel | Umsetzung in WinForms | Entsprechung in Avalonia |
|---|---|---|
| **Alle Fenster maximiert öffnen** | `WindowState = Maximized`, `StartPosition = CenterScreen` (`ShellUiHost.OpenView`) | `WindowState="Maximized"` |
| **Gemeinsame Fenster-Menüleiste** auf JEDEM Fenster | `WindowMenu.Wire()` hängt oben einen `MenuStrip` an; alle Fenster nebeneinander mit Icon, aktuelles fett + angehakt | `Menu` mit `ItemsSource`-Bindung (deklarativ!) |
| **Rechte Menüaktion kontextabhängig** | Launcher → „Beenden" (mit Sicherheitsabfrage); alle anderen Fenster → „Fenster schließen" | `DockPanel` — Avalonia kennt kein `ToolStripItemAlignment.Right` |
| **Ein Fenster je View** | `ShellUiHost` hält höchstens eine Instanz, holt sie sonst nach vorn | gleiche Logik; der Contract ist bereits toolkit-neutral |
| **Zahlenformate in Tabellen** | `DefaultCellStyle.Format` (`N2`, `N1`, …) | `Binding StringFormat` |
| **Schriftart** | „Segoe UI" (21×), Terminal „Consolas" (1×) | Systemschrift + Monospace-Fallback — Segoe UI gibt es auf Linux nicht |
| **Zeilenfärbung nach PnL** | `TradeRowColoring` lieferte die Farbe direkt in `DefaultCellStyle.BackColor` | bereits umgestellt: Logik liefert `TradeRowTint`, die UI mappt auf Farbe |
**Farbwerte der Zeilenfärbung** (aus `TradeRowPalette` — unverändert übernehmen):
| Kategorie | RGB | Bedeutung |
|---|---|---|
| `Loss` | 245, 200, 200 | < 0 % — rot |
| `SmallWin` | 212, 240, 212 | 010 % — hellgrün |
| `BigWin` | 140, 214, 140 | > 10 % — grün |
**Symbol-Schlüssel je Fenster** (siehe `Ui/ViewIcons.cs` — die Schlüssel bleiben gültig):
| View-ID | Schlüssel | Bildressource |
|---|---|---|
| `core.dashboard` | `dashboard` | dashboard.png |
| `core.settings` | `settings` | setting_tools.png |
| `core.terminal` | `terminal` | error_log.png |
| `core.jobs` | `jobs` | system_time.png |
| `copytrading.main` | `copytrading` | cross_reference.png |
| `resolutionfarming.main` | `resolutionfarming` | file_start_workflow.png |
| `supervisor.main` | `supervisor` | emotion_batman.png |
| `accounting.main` | `accounting` | coins_in_hand.png |
Die PNG-Dateien liegen weiterhin in `Resources/` und können unverändert weiterverwendet werden.
---
## A. Modul-Fenster (in diesem Schritt entfernt)
### CopyTradingMainForm — Hauptfenster Copytrading
**Fenstergröße:** 1714 × 1167 px
**Tabs (Reihenfolge):** Master-Trader | Offene Trades | Geschlossene Trades | Account-Einstellungen
**Steuerelemente:** TabPage ×4, TabControl ×1, MasterTradersView ×1, OpenTradesView ×1, ClosedTradesView ×1, AccountSettingsView ×1
### MasterTradersView — Tab „Master-Trader“
**Tabellenspalten** (Reihenfolge = Anzeigereihenfolge):
| # | Spaltenkopf | Feldname | Format | Breite |
|--:|---|---|---|---|
| 1 | # | `colId` | — | 50 px |
| 2 | Wallet | `colWallet` | — | 170 px |
| 3 | Name | `colName` | — | Rest/Auto |
| 4 | Kategorie | `colCategory` | — | 110 px |
| 5 | Aktiv | `colActive` | — | 50 px |
| 6 | Trades (7T) | `colTrades` | — | 90 px |
| 7 | Winrate % | `colWinrate` | — | 90 px |
| 8 | PnL (7T) | `colPnl` | — | 100 px |
| 9 | Copy-PnL (30T) | `colCopyPnl` | — | 110 px |
| 10 | Profit-Faktor | `colCopyPf` | — | 100 px |
| 11 | Ø PnL/Trade | `colCopyAvg` | — | 100 px |
| 12 | Copy-Trades | `colCopyCount` | — | 90 px |
**Steuerelemente:** DataGridViewTextBoxColumn ×11, ToolStripButton ×4, Panel ×2, ToolStrip ×1, ToolStripSeparator ×1, DataGridView ×1, DataGridViewCheckBoxColumn ×1, Splitter ×1, PropertyGrid ×1, GroupBox ×1, CheckedListBox ×1, Label ×1
### OpenTradesView — Tab „Offene Trades“
**Beschriftungen:**
- `lblSummary` = „—"
**Tabellenspalten** (Reihenfolge = Anzeigereihenfolge):
| # | Spaltenkopf | Feldname | Format | Breite |
|--:|---|---|---|---|
| 1 | Account | `colAccount` | — | Fill 120 |
| 2 | Master-Trader | `colTrader` | — | Fill 120 |
| 3 | Markt | `colMarket` | — | Fill 240 |
| 4 | Outcome | `colOutcome` | — | Fill 80 |
| 5 | Side | `colSide` | — | Fill 55 |
| 6 | Entry | `colEntry` | — | Fill 65 |
| 7 | Aktuell | `colCurrent` | — | Fill 65 |
| 8 | Size | `colSize` | — | Fill 70 |
| 9 | Einsatz | `colAmount` | — | Fill 80 |
| 10 | Wert | `colValue` | — | Fill 80 |
| 11 | Buchgewinn | `colUnrealized` | — | Fill 90 |
| 12 | Buchgew. % | `colUnrealizedPct` | — | Fill 80 |
| 13 | Status | `colStatus` | — | Fill 90 |
**Steuerelemente:** DataGridViewTextBoxColumn ×13, ToolStrip ×1, ToolStripButton ×1, DataGridView ×1, Panel ×1, Label ×1
### ClosedTradesView — Tab „Geschlossene Trades“
**Beschriftungen:**
- `lblSummary` = „—"
- `lblMarkt` = „Markt:"
- `lblMaster` = „Master:"
- `lblErgebnis` = „Ergebnis:"
- `lblVon` = „Von:"
- `lblBis` = „Bis:"
**Schaltflächen:** „Zurücksetzen"
**Tabellenspalten** (Reihenfolge = Anzeigereihenfolge):
| # | Spaltenkopf | Feldname | Format | Breite |
|--:|---|---|---|---|
| 1 | # | `colTradeId` | — | 60 px |
| 2 | Account | `colAccount` | — | 130 px |
| 3 | Master-Trader | `colTrader` | — | 130 px |
| 4 | Markt | `colMarket` | — | Rest/Auto |
| 5 | Outcome | `colOutcome` | — | 80 px |
| 6 | Side | `colSide` | — | 60 px |
| 7 | Entry | `colEntry` | — | 70 px |
| 8 | Exit | `colExit` | — | 70 px |
| 9 | Size | `colSize` | — | 70 px |
| 10 | PnL | `colPnl` | — | 80 px |
| 11 | PnL % | `colPnlPct` | — | 70 px |
| 12 | Eröffnet | `colOpenedAt` | — | 130 px |
| 13 | Geschlossen | `colClosedAt` | — | 130 px |
**Steuerelemente:** DataGridViewTextBoxColumn ×13, Label ×6, Panel ×2, ComboBox ×2, DateTimePicker ×2, ToolStrip ×1, ToolStripButton ×1, DataGridView ×1, TextBox ×1, Button ×1
### AccountSettingsView — Tab „Account-Einstellungen“
**Steuerelemente:** ToolStrip ×1, ToolStripLabel ×1, ToolStripComboBox ×1, ToolStripSeparator ×1, ToolStripButton ×1, PropertyGrid ×1, Panel ×1, Label ×1
### ResolutionFarmingMainForm
**Fenstergröße:** 1429 × 1030 px
**Tabs (Reihenfolge):** Kandidaten | Positionen | Historie / Statistik | Settings
**Beschriftungen:**
- `lblCandKonto` = „Konto:"
- `lblSetKonto` = „Konto:"
**Schaltflächen:** „Aktualisieren", „Speichern"
**Steuerelemente:** TabPage ×4, Panel ×4, Label ×4, Button ×4, DataGridView ×3, ComboBox ×2, TabControl ×1, PropertyGrid ×1
### SupervisorMainForm
**Fenstergröße:** 1786 × 1163 px
**Tabs (Reihenfolge):** Analyse | Dossiers | Berichte | Counterfactual
**Beschriftungen:**
- `lblProfil` = „Profil:"
- `lblModel` = „Modell:"
- `lblSignal` = „SignalId:"
**Schaltflächen:** „Aktualisieren", „Dossier öffnen", „Senden", „Verlauf leeren"
**Steuerelemente:** ToolStripButton ×5, TabPage ×4, ToolStrip ×4, ToolStripLabel ×3, TextBox ×3, DataGridView ×3, ToolStripTextBox ×2, ToolStripSeparator ×2, SplitContainer ×2, TabControl ×1, ToolStripComboBox ×1, RichTextBox ×1, Panel ×1, Button ×1, Label ×1
### AccountingMainForm
**Fenstergröße:** 1571 × 1067 px
**Tabs (Reihenfolge):** Übersicht / BWA | Ledger | Abruf / Status
**Beschriftungen:**
- `lblKpiNet` = „Netto-Handelsergebnis ↵ —"
- `lblKpiClosing` = „Endsaldo ↵ —"
- `lblKpiDeposits` = „Einzahlungen ↵ —"
- `lblKpiWithdrawals` = „Auszahlungen ↵ —"
- `lblKpiFees` = „Fees ↵ —"
- `lblKpiRewards` = „Rewards ↵ —"
- `lblKpiVolume` = „Handelsvolumen ↵ —"
- `lblKpiTrades` = „Trades ↵ —"
- `lblWaehrung` = „Währung:"
- `lblBis` = „Bis:"
- `lblVon` = „Von:"
- `lblOvKonto` = „Konto:"
- `lblLedgerKonto` = „Konto:"
- `lblStatusKonto` = „Konto:"
**Schaltflächen:** „Aktualisieren", „Backfill (volle Historie)", „Berechnen", „CSV-Export", „Inkrement jetzt", „PDF-Export"
**Steuerelemente:** Label ×13, ToolStripButton ×4, TabPage ×3, Button ×3, DataGridView ×3, ToolStripSeparator ×3, ComboBox ×2, DateTimePicker ×2, ToolStrip ×2, ToolStripLabel ×2, ToolStripComboBox ×2, TabControl ×1, Panel ×1, FlowLayoutPanel ×1
---
## B. Core-/Shell-Fenster (bleiben vorerst bestehen)
### LauncherForm — Startleiste
**Fenstergröße:** 2599 × 669 px
**Beschriftungen:**
- `lbl_trading` = „Trading: —"
- `lbl_modules` = „Module: —"
- `lbl_ratelimit` = „API: —"
**Schaltflächen:** „API: —", „Accounting", „CopyTrading", „Dashboard", „DemoTrading (—)", „LiveTrading (—)", „ResolutionFarming", „Server Jobs", „Settings", „Supervisor", „Terminal / Logs"
**Tabellenspalten** (Reihenfolge = Anzeigereihenfolge):
| # | Spaltenkopf | Feldname | Format | Breite |
|--:|---|---|---|---|
| 1 | Account | `colAccName` | — | 113 px |
| 2 | Module | `colAccModules` | — | 109 px |
| 3 | Polymarket | `colAccPoly` | — | 106 px |
| 4 | Wallet (USDC) | `colAccBalance` | — | 157 px |
| 5 | 3T PnL | `colAccPnl3d` | — | Rest/Auto |
| 6 | 3T Winrate % | `colAccWin3d` | — | 153 px |
| 7 | Overall P/L | `colAccOverall` | — | 133 px |
**Steuerelemente:** ToolStripButton ×10, DataGridViewTextBoxColumn ×6, ToolStripStatusLabel ×3, ToolStrip ×2, ToolStripSeparator ×2, MenuStrip ×1, StatusStrip ×1, DataGridView ×1, DataGridViewButtonColumn ×1, LauncherWidgetsPanel ×1
### LauncherWidgetsPanel — Live-Überblick
**Tabs (Reihenfolge):** Auffällige Trades (24h)
**Tabellenspalten** (Reihenfolge = Anzeigereihenfolge):
| # | Spaltenkopf | Feldname | Format | Breite |
|--:|---|---|---|---|
| 1 | Zeit | `colAlertTime` | — | 70 px |
| 2 | Level | `colAlertLevel` | — | 70 px |
| 3 | Nachricht | `colAlertMsg` | — | Rest/Auto |
| 4 | Modul | `colNotModule` | — | 100 px |
| 5 | Markt | `colNotMarket` | — | Rest/Auto |
| 6 | PnL | `colNotPnl` | — | 80 px |
| 7 | PnL % | `colNotPnlPct` | — | 70 px |
**Steuerelemente:** DataGridViewTextBoxColumn ×7, GroupBox ×3, DataGridView ×2, TableLayoutPanel ×1, FlowLayoutPanel ×1, RichTextBox ×1
### DashboardView
**Fenstergröße:** 1714 × 1083 px
**Tabs (Reihenfolge):** Dashboard | Tradehistorie | Module
**Beschriftungen:**
- `lblKpiPnl` = „Netto-PnL ↵ —"
- `lblKpiWin` = „Winrate ↵ —"
- `lblKpiTrades` = „Trades ↵ —"
- `lblKpiAvg` = „Ø PnL/Trade ↵ —"
- `lblKpiPf` = „Profit-Faktor ↵ —"
- `lblErgebnis` = „Ergebnis:"
- `lblSuche` = „Suche:"
- `lblModulesInfo` = „Module aktivieren/deaktivieren. Änderungen greifen nach dem nächsten Neustart von PolyTrader."
**Tabellenspalten** (Reihenfolge = Anzeigereihenfolge):
| # | Spaltenkopf | Feldname | Format | Breite |
|--:|---|---|---|---|
| 1 | Modul | `colModule` | — | 110 px |
| 2 | Konto | `colAccount` | — | 130 px |
| 3 | Markt | `colMarket` | — | Rest/Auto |
| 4 | Outcome | `colOutcome` | — | 80 px |
| 5 | Side | `colSide` | — | 60 px |
| 6 | Entry | `colEntry` | — | 70 px |
| 7 | Exit | `colExit` | — | 70 px |
| 8 | Size | `colSize` | — | 70 px |
| 9 | PnL | `colPnl` | — | 80 px |
| 10 | PnL % | `colPnlPct` | — | 70 px |
| 11 | Geschlossen | `colClosedAt` | — | 140 px |
| 12 | Modul | `colModName` | — | 220 px |
| 13 | Status | `colModStatus` | — | 260 px |
| 14 | Hinweis | `colModHint` | — | Rest/Auto |
| 15 | Aktion | `colModAction` | — | 160 px |
**Steuerelemente:** DataGridViewTextBoxColumn ×14, Label ×8, ToolStripLabel ×4, ToolStripComboBox ×4, TabPage ×3, PictureBox ×3, Panel ×2, DataGridView ×2, ToolStrip ×1, ToolStripButton ×1, TabControl ×1, FlowLayoutPanel ×1, TextBox ×1, ComboBox ×1, DataGridViewButtonColumn ×1
### TerminalView
**Fenstergröße:** 1429 × 1083 px
**Tabs (Reihenfolge):** Live | Log Viewer
**Beschriftungen:**
- `lblFilter` = „Level:"
- `lblViewerStatus` = „—"
- `lblVText` = „Text:"
- `lblVCid` = „CID:"
- `lblVLevel` = „Level:"
- `lblVDatum` = „Datum:"
**Schaltflächen:** „Alles auswählen", „Alles kopieren", „Kopieren", „Laden", „Stop Autoscroll", „Terminal leeren"
**Steuerelemente:** Label ×6, ToolStripMenuItem ×4, DataGridViewTextBoxColumn ×4, TabPage ×2, Panel ×2, ComboBox ×2, Button ×2, TextBox ×2, TabControl ×1, RichTextBox ×1, ContextMenuStrip ×1, ToolStripSeparator ×1, DateTimePicker ×1, DataGridView ×1
### SettingsView
**Fenstergröße:** 1185 × 820 px
**Tabs (Reihenfolge):** General Settings | Polymarket Accounts
**Schaltflächen:** „Lizenz prüfen / setzen …", „Load Settings from File", „Löschen", „Master-Key erzeugen", „Neuer Account", „OpenRouter-Key setzen …", „Save Changes", „Test-Heartbeat senden", „Watchdog-Token setzen …"
**Steuerelemente:** ToolStripButton ×9, PropertyGrid ×2, TabPage ×2, ToolStrip ×2, DataGridViewTextBoxColumn ×2, DataGridViewCheckBoxColumn ×2, TabControl ×1, DataGridView ×1
### JobsView
**Fenstergröße:** 1429 × 833 px
**Tabellenspalten** (Reihenfolge = Anzeigereihenfolge):
| # | Spaltenkopf | Feldname | Format | Breite |
|--:|---|---|---|---|
| 1 | Job Name | `colJobName` | — | 150 px |
| 2 | Status | `colStatus` | — | 150 px |
| 3 | Zuletzt ausgeführt | `colLastRun` | — | 130 px |
| 4 | Nächster Lauf | `colNextRun` | — | 130 px |
| 5 | Aktiv | `col_dgv_jobs_Enabled` | — | 60 px |
| 6 | Aktion | `col_dgv_jobs_Run` | — | 90 px |
| 7 | Beschreibung | `colDescription` | — | Rest/Auto |
**Steuerelemente:** DataGridViewTextBoxColumn ×5, DataGridView ×1, DataGridViewCheckBoxColumn ×1, DataGridViewButtonColumn ×1, ToolStrip ×1, ToolStripButton ×1
### LicenseDialog
**Beschriftungen:**
- `lblHeadline` = „Für PolyTrader wird eine gültige Lizenz benötigt."
- `lblStatus` = „Status:"
- `lblHwCaption` = „Hardware-ID dieses Rechners (für die Aktivierung):"
- `lblKeyCaption` = „Lizenzschlüssel:"
**Schaltflächen:** „Kopieren", „Ohne Lizenz starten (eingeschränkt)", „Validieren"
**Steuerelemente:** Label ×5, Button ×3, TextBox ×2
### ShutdownConfirmDialog
**Beschriftungen:**
- `lblTitle` = „PolyTrader sicher beenden?"
- `lblCountdown` = „Beenden möglich in 10 s …"
**Schaltflächen:** „Abbrechen", „Beenden (10 s)"
**Steuerelemente:** Label ×3, Button ×2, Timer ×1
---
## Verhaltensnotizen aus dem Code-Behind
Was die Designer-Dateien nicht zeigen — Verhalten, das beim Nachbau leicht untergeht:
### Copytrading
- **MasterTradersView**: Links das Grid, rechts ein `PropertyGrid` für den gewählten Trader, darunter
eine `CheckedListBox` „Zugewiesene Accounts". Getrennt durch einen `Splitter`. Nach dem Speichern
erscheint ein Hinweistext mit Uhrzeit: „Gespeichert: #ID Name (n Account(s)) um HH:mm:ss".
- **OpenTradesView / ClosedTradesView**: Die Zeilenfärbung wird bei `DataBindingComplete` neu gesetzt.
Unter dem Grid zeigt eine Zusammenfassungszeile (`lblSummary`) die Summen.
- **ClosedTradesView**: Filterleiste mit Markt-Suche, Master-Auswahl, Ergebnis-Auswahl
(Alle / Gewinner / Verlierer) und Datumsbereich; dazu „Zurücksetzen".
- **AccountSettingsView**: Konto-Auswahl in der Toolbar, darunter ein `PropertyGrid` auf
`CopyTradingAccountSettings`. **Die `[Description]`-Attribute der Modellklasse sind die
Feldbeschreibungen — beim Nachbau als Tooltips oder Hilfetexte übernehmen.**
### ResolutionFarming
Vier Tabs (Kandidaten / Positionen / Historie + Statistik / Settings), je ein Grid mit einer
„Aktualisieren"-Schaltfläche und Konto-Auswahl oben. Der Settings-Tab zeigt ein `PropertyGrid`
plus „Speichern" mit Bestätigungstext samt Uhrzeit.
### Supervisor
- **Analyse-Tab**: chat-artig — `RichTextBox` für den Verlauf (je Eintrag Zeitstempel + Sprecher),
Eingabefeld, „Senden", „Verlauf leeren"; Profil- und Modellauswahl in der Toolbar.
- **Dossiers-Tab**: Grid plus „Dossier öffnen".
- **Berichte / Counterfactual**: Grid plus „Aktualisieren", Filterung über `SignalId`.
### Accounting
- Drei Tabs: Übersicht/BWA, Ledger, Abruf/Status.
- **KPI-Kacheln** in einem `FlowLayoutPanel`: Netto-Handelsergebnis, Endsaldo, Einzahlungen,
Auszahlungen, Fees, Rewards, Handelsvolumen, Trades. Format je Kachel zweizeilig:
`"<Titel>\n<Wert:N2> <Währung>"` — der Wert steht unter dem Titel.
- Zeitraumwahl über zwei `DateTimePicker` (Von/Bis), dazu Währungs- und Kontoauswahl.
- Export über „PDF-Export" und „CSV-Export"; im Status-Tab „Inkrement jetzt" und
„Backfill (volle Historie)".
### Shell
- **LauncherForm**: Startleiste mit einem Button je Fenster (angehakt, wenn das Fenster offen ist),
Schnellaktionen „LiveTrading" und „DemoTrading" (dreistufig: Inactive → SellOnly → Active),
Statuszeile mit Trading-Status, Modul-Status und API-Ratelimit. Darunter die Account-Übersicht
und der Live-Überblick (`LauncherWidgetsPanel`).
- **Das Schließen-X ist abgefangen** und läuft über dieselbe Sicherheitsabfrage wie „Beenden".
- **ShutdownConfirmDialog**: Die Beenden-Schaltfläche ist **10 Sekunden gesperrt**, mit Countdown im
Text („Beenden möglich in 10 s"); Abbrechen ist jederzeit möglich.
- **TerminalView**: Live-Tab mit farbigen Log-Zeilen und abschaltbarem Autoscroll, Kontextmenü
(Alles auswählen / Alles kopieren), Auto-Clear bei Erreichen der RAM-Grenze. Log-Viewer-Tab mit
Filtern über Datum, Level, CID und Volltext.
- **DashboardView**: KPI-Kacheln (Netto-PnL, Winrate, Trades, Ø PnL/Trade, Profit-Faktor), drei
Diagramme (Equity-Kurve, PnL je Modul, PnL je Tag), Tradehistorie mit Suche und
Gewinner/Verlierer-Filter sowie ein Modul-Tab zum Aktivieren/Deaktivieren (wirkt nach Neustart).
**Der Profit-Faktor zeigt „∞", wenn es keine Verluste gab.**
---
## Was beim Nachbau bewusst *anders* werden darf
Nicht alles ist erhaltenswert — diese Punkte sind Altlasten der WinForms-Umsetzung:
1. **Die `PropertyGrid`-Fenster** (Settings, Account-Einstellungen, Master-Trader,
ResolutionFarming): statt einer alphabetischen Reflection-Liste künftig fachlich gruppierte
Formulare mit Validierung, Einheiten am Feld und abhängigen Feldern. Die `[Description]`-Attribute
liefern die Texte, die `[Browsable(false)]`-Markierungen die auszublendenden Felder.
2. **Menüaufbau zur Laufzeit** (`WindowMenu.Populate` leert und füllt `menu.Items`): verstößt gegen
die neue Layout-Regel. In Avalonia ein deklaratives `Menu` mit `ItemsSource`-Bindung.
3. **Diagramme als Bitmap** (ScottPlot → PNG → `PictureBox`): entfällt mit LiveCharts2.
4. **Das `RichTextBox`-Terminal**: als virtualisiertes `ItemsControl` über eine
`ObservableCollection<LogLine>` neu bauen — das löst nebenbei das RAM-Problem, wegen dem heute
ein Auto-Clear nötig ist.
5. **Feste Pixelbreiten** in den Grids: in Avalonia besser mit `*`-Sternbreiten arbeiten. Die Werte
in den Tabellen oben geben die *Proportionen* vor, nicht die absoluten Zahlen.