Files
PolyTraderSharp/src/PolyTrader.App.Avalonia/Views/Modules/CopyTradingWindow.axaml
T
RichardandClaude Opus 5 28b3aedec7 Vier Befunde der Sichtpruefung behoben: Farbschema, Grids, Diagramme, Kontrast
#383 Farbschema "System" kehrte sein Versprechen um. ThemeManager.IsDark verglich
ActualThemeVariant der Anwendung mit Dark; bei "System" steht dort Default, waehrend
die Fenster selbst nach hell oder dunkel aufloesen. IsDark war damit im
Auslieferungszustand immer false - Symbol, Beschriftung und Toggle() haengen alle an
diesem Wert. Gelesen wird jetzt die angeforderte Variante, bei "System" die
Betriebssystem-Einstellung. Derselbe Fehler steckte in Brush(): die Methode suchte bei
"System" in den hellen Farben, waehrend dunkel gezeichnet wurde - betroffen war genau
das, wofuer es sie gibt (Zeilenfarben, KPI-Vorzeichen). Neu ist ausserdem, dass eine
Umstellung am Betriebssystem ThemeChanged ausloest, solange "System" gilt.

#384 Sternspalten quetschten die Endspalten weg. Der Merksatz aus #56 galt bisher nur
fuer gridTraders. Angewandt auf gridOpen und gridClosed sowie auf die uebrigen Grids,
deren Spaltensumme den sichtbaren Bereich uebersteigt (gridTrades, gridJobs, gridLedger,
gridCandidates, gridPositions, gridHistory). Auto statt Stern, dazu MaxWidth 360 - anders
als "Name" in #56 traegt "Markt" ganze Fragesaetze und wuerde die Zahlenspalten sonst aus
dem Blick schieben. Grids mit weniger Spalten als Platz behalten ihre Sternspalte.

#385 Gewinntage wurden rot gezeichnet. Eine ColumnSeries hat genau ein Fill fuer alle
ihre Balken; gefaerbt wurde deshalb nach der Summe ueber alle Tage. Jetzt zwei Reihen an
denselben Positionen - Gewinne in der einen, Verluste in der anderen, Luecken als null.
"PnL je Modul" faerbt ebenfalls nach Vorzeichen: zwei Diagramme nebeneinander mit
verschiedenen Leseweisen waeren schlechter als beide ohne.

#386 Drei Kleinigkeiten. Die Equity-Achse beschriftete zehn Teilstriche mit zwei Daten -
unter drei Tagen kommt jetzt die Uhrzeit dazu, darueber gilt hoechstens ein Teilstrich je
Tag. "Deaktivierte Module" sah aus, als fehle das Bedienelement: leere Nur-Lese-Felder
zeigen jetzt "—" in einer abgesetzten Flaeche. Die Abschnittsbeschriftungen der
Seitenleiste lagen bei 3,65:1 statt der geforderten 4,5:1 (im Bild sogar 1,83:1, weil
10 px mit Sperrung ausduennen) - AppCaptionTextBrush erreicht 4,61:1 hell und 6,21:1
dunkel und bleibt deutlich leiser als die Eintraege darunter.

Build gruen, 486 Tests gruen. Die Sichtpruefung auf der Linux-VM steht noch aus; die
drei rein visuellen Punkte sind aus dem Quelltext begruendet, nicht im Bild belegt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 10:17:49 +02:00

183 lines
13 KiB
XML
Raw 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.
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:PolyTrader.App.Avalonia.Controls"
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
xmlns:conv="using:PolyTrader.App.Avalonia.Converters"
xmlns:ct="using:PolyTraderSharp.Models"
x:Class="PolyTrader.App.Avalonia.Views.Modules.CopyTradingWindow">
<!--
Ein Fenster fürs ganze Modul, vier Tabs – Aufbau nach docs/UI-SPEZIFIKATION-WinForms.md.
Spaltenreihenfolge und -überschriften entsprechen der bisherigen Oberfläche; feste
Pixelbreiten sind in Sternbreiten übersetzt, damit das Fenster mitwächst.
-->
<DockPanel>
<TabControl>
<TabItem Header="Master-Trader">
<DockPanel>
<Border Classes="toolbar" DockPanel.Dock="Top">
<StackPanel Orientation="Horizontal" Spacing="4">
<Button Name="btnTraderRefresh" Content="Aktualisieren" />
<Button Name="btnTraderNew" Content="Neu" />
<Button Name="btnTraderSave" Content="Speichern" />
<Button Name="btnTraderDelete" Content="Löschen" />
<TextBlock Name="lblTraderHint" VerticalAlignment="Center"
Margin="12,0,0,0" Foreground="{DynamicResource AppMutedTextBrush}" />
</StackPanel>
</Border>
<Grid ColumnDefinitions="*,4,460">
<DataGrid Name="gridTraders" Grid.Column="0" x:DataType="ct:TrackedTrader">
<DataGrid.Columns>
<!-- Der Name steht vorn: er ist die wichtigste Information der
Zeile. Die Wallet-Adresse folgt gekuerzt (vollstaendig im
Tooltip) - in voller Laenge drueckte sie zusammen mit den
festen Breiten der uebrigen Spalten den Namen auf wenige
Pixel zusammen (Befund B-13).
KEINE Sternbreite in diesem Grid: zwoelf Spalten passen neben
dem 460 px breiten Detailbereich nicht ins Fenster. Eine
Sternspalte nimmt sich dann den Platz, den die festen
brauchen - beim Sichttest am 28.08.2026 blieben die letzten
fuenf Spalten (PnL, Copy-PnL, Profit-Faktor, Ø PnL/Trade,
Copy-Trades) als leere Streifen ohne Beschriftung uebrig.
Mit lauter Auto-Breiten behaelt jede Spalte ihre Breite und
das Grid laesst sich stattdessen waagerecht schieben. -->
<DataGridTextColumn Header="#" Width="Auto" Binding="{Binding Id}" />
<DataGridTextColumn Header="Name" Width="Auto" MinWidth="180" Binding="{Binding DisplayName}" />
<DataGridTemplateColumn Header="Wallet" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="ct:TrackedTrader">
<TextBlock Text="{Binding WalletAddress, Converter={x:Static conv:ShortAddressConverter.Instance}}"
ToolTip.Tip="{Binding WalletAddress}"
VerticalAlignment="Center" Margin="7,0" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Kategorie" Width="Auto" Binding="{Binding Category}" />
<DataGridCheckBoxColumn Header="Aktiv" Width="Auto" Binding="{Binding IsActive}" />
<DataGridTextColumn Header="Trades (7T)" Width="Auto" Binding="{Binding TotalTrades}" />
<DataGridTextColumn Header="Winrate %" Width="Auto" Binding="{Binding Winrate30t, StringFormat=\{0:F1\}}" />
<DataGridTextColumn Header="PnL (7T)" Width="Auto" Binding="{Binding TotalPnl, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Copy-PnL (30T)" Width="Auto" Binding="{Binding CopyPnl30d, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Profit-Faktor" Width="Auto" Binding="{Binding CopyProfitFactor, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Ø PnL/Trade" Width="Auto" Binding="{Binding CopyAvgPnlPerTrade, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Copy-Trades" Width="Auto" Binding="{Binding CopyTradeCount30d}" />
</DataGrid.Columns>
</DataGrid>
<GridSplitter Grid.Column="1" Background="{DynamicResource AppBorderBrush}" />
<DockPanel Grid.Column="2">
<HeaderedContentControl DockPanel.Dock="Bottom" Header="Zugewiesene Accounts"
Margin="8" Height="220">
<ListBox Name="listAccounts">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:AccountAssignment">
<CheckBox IsChecked="{Binding IsAssigned, Mode=TwoWay}"
Content="{Binding Label}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</HeaderedContentControl>
<controls:SettingsEditor Name="editorTrader" />
</DockPanel>
</Grid>
</DockPanel>
</TabItem>
<TabItem Header="Offene Trades">
<DockPanel>
<Border Classes="toolbar" DockPanel.Dock="Top">
<StackPanel Orientation="Horizontal">
<Button Name="btnOpenRefresh" Content="Aktualisieren" />
</StackPanel>
</Border>
<Border Classes="statusbar" DockPanel.Dock="Bottom">
<TextBlock Name="lblOpenSummary" Text="—" />
</Border>
<DataGrid Name="gridOpen" x:DataType="vm:CopyOpenTradeRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Account" Width="Auto" Binding="{Binding Account}" />
<DataGridTextColumn Header="Master-Trader" Width="Auto" Binding="{Binding Trader}" />
<DataGridTextColumn Header="Markt" Width="Auto" MinWidth="180" MaxWidth="360" Binding="{Binding Market}" />
<DataGridTextColumn Header="Outcome" Width="Auto" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Side" Width="Auto" Binding="{Binding Side}" />
<DataGridTextColumn Header="Entry" Width="Auto" Binding="{Binding Entry, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Aktuell" Width="Auto" Binding="{Binding Current, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Size" Width="Auto" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Einsatz" Width="Auto" Binding="{Binding Amount, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Wert" Width="Auto" Binding="{Binding Value, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Buchgewinn" Width="Auto" Binding="{Binding Unrealized, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Buchgew. %" Width="Auto" Binding="{Binding UnrealizedPct, StringFormat=\{0:F1\}}" />
<DataGridTextColumn Header="Status" Width="Auto" Binding="{Binding Status}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</TabItem>
<TabItem Header="Geschlossene Trades">
<DockPanel>
<Border Classes="toolbar" DockPanel.Dock="Top">
<StackPanel Orientation="Horizontal" Spacing="8">
<Button Name="btnClosedRefresh" Content="Aktualisieren" />
<TextBlock Text="Markt:" VerticalAlignment="Center" />
<TextBox Name="tbClosedMarket" MinWidth="200" Watermark="Suche …" />
<TextBlock Text="Master:" VerticalAlignment="Center" />
<ComboBox Name="cbClosedMaster" MinWidth="160" />
<TextBlock Text="Ergebnis:" VerticalAlignment="Center" />
<ComboBox Name="cbClosedResult" MinWidth="120" />
<TextBlock Text="Von:" VerticalAlignment="Center" />
<CalendarDatePicker Name="dtClosedFrom" MinWidth="140" />
<TextBlock Text="Bis:" VerticalAlignment="Center" />
<CalendarDatePicker Name="dtClosedTo" MinWidth="140" />
<Button Name="btnClosedReset" Content="Zurücksetzen" />
</StackPanel>
</Border>
<Border Classes="statusbar" DockPanel.Dock="Bottom">
<TextBlock Name="lblClosedSummary" Text="—" />
</Border>
<DataGrid Name="gridClosed" x:DataType="vm:CopyClosedTradeRow">
<DataGrid.Columns>
<DataGridTextColumn Header="#" Width="Auto" Binding="{Binding TradeId}" />
<DataGridTextColumn Header="Account" Width="Auto" Binding="{Binding Account}" />
<DataGridTextColumn Header="Master-Trader" Width="Auto" Binding="{Binding Trader}" />
<DataGridTextColumn Header="Markt" Width="Auto" MinWidth="180" MaxWidth="360" Binding="{Binding Market}" />
<DataGridTextColumn Header="Outcome" Width="Auto" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Side" Width="Auto" Binding="{Binding Side}" />
<DataGridTextColumn Header="Entry" Width="Auto" Binding="{Binding Entry, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Exit" Width="Auto" Binding="{Binding Exit, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Size" Width="Auto" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="PnL" Width="Auto" Binding="{Binding Pnl, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="PnL %" Width="Auto" Binding="{Binding PnlPercent, StringFormat=\{0:F1\}}" />
<DataGridTextColumn Header="Eröffnet" Width="Auto" Binding="{Binding OpenedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Geschlossen" Width="Auto" Binding="{Binding ClosedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</TabItem>
<TabItem Header="Account-Einstellungen">
<DockPanel>
<Border Classes="toolbar" DockPanel.Dock="Top">
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBlock Text="Konto:" VerticalAlignment="Center" />
<ComboBox Name="cbSettingsAccount" MinWidth="240" />
<Button Name="btnSettingsSave" Content="Speichern" />
<TextBlock Name="lblSettingsHint" VerticalAlignment="Center" Foreground="{DynamicResource AppMutedTextBrush}" />
</StackPanel>
</Border>
<controls:SettingsEditor Name="editorAccount" />
</DockPanel>
</TabItem>
</TabControl>
</DockPanel>
</UserControl>