Files
PolyTraderSharp/docs/UI-SPEZIFIKATION-WinForms.md
T
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

20 KiB
Raw Blame History

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:

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:

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.