#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>
167 lines
9.7 KiB
XML
167 lines
9.7 KiB
XML
<UserControl xmlns="https://github.com/avaloniaui"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
|
|
xmlns:lvc="using:LiveChartsCore.SkiaSharpView.Avalonia"
|
|
x:Class="PolyTrader.App.Avalonia.Views.DashboardWindow"
|
|
x:DataType="vm:DashboardChartsModel">
|
|
|
|
<!--
|
|
Modulübergreifendes Dashboard aus dem Core-Trade-Log.
|
|
Aufbau übernommen aus der WinForms-Fassung (docs/UI-SPEZIFIKATION-WinForms.md):
|
|
Tab „Dashboard" mit KPI-Kacheln und drei Diagrammen, Tab „Tradehistorie" mit
|
|
gefilterter Liste, Tab „Module" zum Aktivieren/Deaktivieren (wirkt nach Neustart).
|
|
|
|
Die Diagramme sind jetzt echte Steuerelemente (LiveCharts2) statt gerenderter Bitmaps —
|
|
damit interaktiv (Tooltips, Zoom) und ohne System.Drawing.
|
|
-->
|
|
<DockPanel>
|
|
<Border Classes="toolbar" DockPanel.Dock="Top">
|
|
<StackPanel Orientation="Horizontal" Spacing="8">
|
|
<Button Name="btnRefresh" Content="Aktualisieren" />
|
|
<TextBlock Text="Konto:" VerticalAlignment="Center" />
|
|
<ComboBox Name="cbAccount" MinWidth="180" />
|
|
<TextBlock Text="Modul:" VerticalAlignment="Center" />
|
|
<ComboBox Name="cbModule" MinWidth="150" />
|
|
<TextBlock Text="Modus:" VerticalAlignment="Center" />
|
|
<ComboBox Name="cbMode" MinWidth="100" />
|
|
<TextBlock Text="Zeitraum:" VerticalAlignment="Center" />
|
|
<ComboBox Name="cbRange" MinWidth="110" />
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<TabControl Name="tabs">
|
|
|
|
<TabItem Header="Dashboard">
|
|
<Grid RowDefinitions="Auto,*" Margin="10">
|
|
|
|
<!-- KPI-Kacheln: zweizeilig (Titel oben, Wert darunter) wie zuvor. -->
|
|
<WrapPanel Grid.Row="0" Orientation="Horizontal">
|
|
<Border Classes="kpi">
|
|
<StackPanel>
|
|
<TextBlock Classes="caption" Text="Netto-PnL" />
|
|
<TextBlock Name="kpiPnl" Classes="value" Text="—" />
|
|
</StackPanel>
|
|
</Border>
|
|
<Border Classes="kpi">
|
|
<StackPanel>
|
|
<TextBlock Classes="caption" Text="Winrate" />
|
|
<TextBlock Name="kpiWin" Classes="value" Text="—" />
|
|
</StackPanel>
|
|
</Border>
|
|
<Border Classes="kpi">
|
|
<StackPanel>
|
|
<TextBlock Classes="caption" Text="Trades" />
|
|
<TextBlock Name="kpiTrades" Classes="value" Text="—" />
|
|
</StackPanel>
|
|
</Border>
|
|
<Border Classes="kpi">
|
|
<StackPanel>
|
|
<TextBlock Classes="caption" Text="Ø PnL/Trade" />
|
|
<TextBlock Name="kpiAvg" Classes="value" Text="—" />
|
|
</StackPanel>
|
|
</Border>
|
|
<Border Classes="kpi">
|
|
<StackPanel>
|
|
<TextBlock Classes="caption" Text="Profit-Faktor" />
|
|
<TextBlock Name="kpiPf" Classes="value" Text="—" />
|
|
</StackPanel>
|
|
</Border>
|
|
</WrapPanel>
|
|
|
|
<Grid Grid.Row="1" RowDefinitions="*,*" ColumnDefinitions="*,*" Margin="0,12,0,0">
|
|
<Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
|
|
BorderBrush="{DynamicResource AppBorderBrush}" BorderThickness="1" Margin="0,0,0,8">
|
|
<DockPanel>
|
|
<TextBlock DockPanel.Dock="Top" Margin="8,6"
|
|
FontWeight="SemiBold" Text="Equity-Kurve (kumulierter PnL)" />
|
|
<lvc:CartesianChart Name="chartEquity"
|
|
Series="{Binding EquitySeries}"
|
|
XAxes="{Binding EquityXAxes}"
|
|
TooltipPosition="Top" />
|
|
</DockPanel>
|
|
</Border>
|
|
|
|
<Border Grid.Row="1" Grid.Column="0"
|
|
BorderBrush="{DynamicResource AppBorderBrush}" BorderThickness="1" Margin="0,0,4,0">
|
|
<DockPanel>
|
|
<TextBlock DockPanel.Dock="Top" Margin="8,6"
|
|
FontWeight="SemiBold" Text="PnL je Modul" />
|
|
<lvc:CartesianChart Name="chartModule"
|
|
Series="{Binding ModuleSeries}"
|
|
XAxes="{Binding ModuleXAxes}" />
|
|
</DockPanel>
|
|
</Border>
|
|
|
|
<Border Grid.Row="1" Grid.Column="1"
|
|
BorderBrush="{DynamicResource AppBorderBrush}" BorderThickness="1" Margin="4,0,0,0">
|
|
<DockPanel>
|
|
<TextBlock DockPanel.Dock="Top" Margin="8,6"
|
|
FontWeight="SemiBold" Text="PnL je Tag" />
|
|
<lvc:CartesianChart Name="chartDay"
|
|
Series="{Binding DaySeries}"
|
|
XAxes="{Binding DayXAxes}" />
|
|
</DockPanel>
|
|
</Border>
|
|
</Grid>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<TabItem Header="Tradehistorie">
|
|
<DockPanel>
|
|
<Border Classes="toolbar" DockPanel.Dock="Top">
|
|
<StackPanel Orientation="Horizontal" Spacing="8">
|
|
<TextBlock Text="Suche:" VerticalAlignment="Center" />
|
|
<TextBox Name="tbSearch" MinWidth="260" Watermark="Markt oder Outcome …" />
|
|
<TextBlock Text="Ergebnis:" VerticalAlignment="Center" />
|
|
<ComboBox Name="cbWinLoss" MinWidth="130" />
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<DataGrid Name="gridTrades" x:DataType="vm:DashboardTradeRow">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Modul" Width="Auto" Binding="{Binding Module}" />
|
|
<DataGridTextColumn Header="Konto" Width="Auto" Binding="{Binding Account}" />
|
|
<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 EntryPrice, StringFormat=\{0:F3\}}" />
|
|
<DataGridTextColumn Header="Exit" Width="Auto" Binding="{Binding ExitPrice, StringFormat=\{0:F3\}}" />
|
|
<DataGridTextColumn Header="Size" Width="Auto" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
|
|
<DataGridTextColumn Header="PnL" Width="Auto" Binding="{Binding RealizedPnl, StringFormat=\{0:F2\}}" />
|
|
<DataGridTextColumn Header="PnL %" Width="Auto" Binding="{Binding PnlPercent, StringFormat=\{0:F1\}}" />
|
|
<DataGridTextColumn Header="Geschlossen" Width="Auto" Binding="{Binding ClosedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</DockPanel>
|
|
</TabItem>
|
|
|
|
<TabItem Name="tabModules" Header="Module">
|
|
<DockPanel>
|
|
<TextBlock DockPanel.Dock="Top" Margin="10" TextWrapping="Wrap"
|
|
Text="Module aktivieren/deaktivieren. Änderungen greifen nach dem nächsten Neustart von PolyTrader." />
|
|
|
|
<DataGrid Name="gridModules" x:DataType="vm:ModuleRow">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Modul" Width="Auto" Binding="{Binding Modul}" />
|
|
<DataGridTextColumn Header="Status" Width="Auto" Binding="{Binding Status}" />
|
|
<DataGridTextColumn Header="Hinweis" Width="*" MinWidth="180" Binding="{Binding Hinweis}" />
|
|
<DataGridTemplateColumn Header="Aktion" Width="Auto">
|
|
<DataGridTemplateColumn.CellTemplate>
|
|
<DataTemplate x:DataType="vm:ModuleRow">
|
|
<Button Content="{Binding Aktion}"
|
|
Margin="2" Padding="8,2"
|
|
Click="OnModuleActionClick"
|
|
IsEnabled="{Binding CanToggle}" />
|
|
</DataTemplate>
|
|
</DataGridTemplateColumn.CellTemplate>
|
|
</DataGridTemplateColumn>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</DockPanel>
|
|
</TabItem>
|
|
|
|
</TabControl>
|
|
</DockPanel>
|
|
|
|
</UserControl>
|