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>
This commit is contained in:
Richard
2026-08-06 17:27:42 +02:00
co-authored by Claude Opus 5
parent 5320d25d6d
commit 0a26b8563d
+461
View File
@@ -0,0 +1,461 @@
# 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.