From 0a26b8563de88e93bc1ad66fc5fbf34fa94c52e1 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 6 Aug 2026 17:27:42 +0200 Subject: [PATCH] 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 --- docs/UI-SPEZIFIKATION-WinForms.md | 461 ++++++++++++++++++++++++++++++ 1 file changed, 461 insertions(+) create mode 100644 docs/UI-SPEZIFIKATION-WinForms.md diff --git a/docs/UI-SPEZIFIKATION-WinForms.md b/docs/UI-SPEZIFIKATION-WinForms.md new file mode 100644 index 0000000..c74be2d --- /dev/null +++ b/docs/UI-SPEZIFIKATION-WinForms.md @@ -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/.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 | 0–10 % — 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: + `"\n "` — 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` 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.