Sicherungscommit vor dem Aufraeumen des Repos, damit nachvollziehbar bleibt, welcher Stand vor der Bereinigung galt. Build gruen, 476 Tests gruen. Zwei Straenge, die sich ueber .csproj, Program.cs und appsettings.json ueberschneiden und darum gemeinsam abgelegt werden: Deploymentcenter-Integration (P3c, Plan D-0 bis D-5 code-seitig fertig): - Deploymentcenter.Client 2.5.0 als lokales Paket, Source-Mapping erweitert - DeploymentcenterOptions, DeploymentcenterErrorReporter, LicenseGate/LicenseCli - WatchdogHeartbeatService auf die Deploymentcenter-API umgestellt (version, os, checks, metrics, status stopped) - Security: MasterKeyResolver, SecretRedactor, FilePermissions - Directory.Build.props mit zentraler Version 0.1.0 (Packager-Versionsdisziplin) - deploy/: Packager-Vorlage und systemd-Unit; echte Zugangsdaten bleiben ueber .gitignore aussen vor - setup.json fuer die Erstinstallation - UMSETZUNGSPLAN-Deploymentcenter-Integration.md; ANALYSE-Linux-Portierung.md verweist auf den neuen Plan Einfenster-Shell (UI-Redesign): - ShellWindow + ShellNavModel als Seitenleisten-Shell - WindowMenuBar und WindowMenuModel entfallen - Modul- und Kernfenster auf die Shell-Einbettung angepasst Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
160 lines
11 KiB
XML
160 lines
11 KiB
XML
<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: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>
|
||
<DataGridTextColumn Header="#" Width="50" Binding="{Binding Id}" />
|
||
<DataGridTextColumn Header="Wallet" Width="170" Binding="{Binding WalletAddress}" />
|
||
<DataGridTextColumn Header="Name" Width="*" Binding="{Binding DisplayName}" />
|
||
<DataGridTextColumn Header="Kategorie" Width="110" Binding="{Binding Category}" />
|
||
<DataGridCheckBoxColumn Header="Aktiv" Width="50" Binding="{Binding IsActive}" />
|
||
<DataGridTextColumn Header="Trades (7T)" Width="90" Binding="{Binding TotalTrades}" />
|
||
<DataGridTextColumn Header="Winrate %" Width="90" Binding="{Binding Winrate30t, StringFormat=\{0:F1\}}" />
|
||
<DataGridTextColumn Header="PnL (7T)" Width="100" Binding="{Binding TotalPnl, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Copy-PnL (30T)" Width="110" Binding="{Binding CopyPnl30d, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Profit-Faktor" Width="100" Binding="{Binding CopyProfitFactor, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Ø PnL/Trade" Width="100" Binding="{Binding CopyAvgPnlPerTrade, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Copy-Trades" Width="90" 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="120" Binding="{Binding Account}" />
|
||
<DataGridTextColumn Header="Master-Trader" Width="120" Binding="{Binding Trader}" />
|
||
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding Market}" />
|
||
<DataGridTextColumn Header="Outcome" Width="80" Binding="{Binding Outcome}" />
|
||
<DataGridTextColumn Header="Side" Width="55" Binding="{Binding Side}" />
|
||
<DataGridTextColumn Header="Entry" Width="65" Binding="{Binding Entry, StringFormat=\{0:F3\}}" />
|
||
<DataGridTextColumn Header="Aktuell" Width="65" Binding="{Binding Current, StringFormat=\{0:F3\}}" />
|
||
<DataGridTextColumn Header="Size" Width="70" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Einsatz" Width="80" Binding="{Binding Amount, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Wert" Width="80" Binding="{Binding Value, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Buchgewinn" Width="90" Binding="{Binding Unrealized, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="Buchgew. %" Width="80" Binding="{Binding UnrealizedPct, StringFormat=\{0:F1\}}" />
|
||
<DataGridTextColumn Header="Status" Width="90" 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="60" Binding="{Binding TradeId}" />
|
||
<DataGridTextColumn Header="Account" Width="130" Binding="{Binding Account}" />
|
||
<DataGridTextColumn Header="Master-Trader" Width="130" Binding="{Binding Trader}" />
|
||
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding Market}" />
|
||
<DataGridTextColumn Header="Outcome" Width="80" Binding="{Binding Outcome}" />
|
||
<DataGridTextColumn Header="Side" Width="60" Binding="{Binding Side}" />
|
||
<DataGridTextColumn Header="Entry" Width="70" Binding="{Binding Entry, StringFormat=\{0:F3\}}" />
|
||
<DataGridTextColumn Header="Exit" Width="70" Binding="{Binding Exit, StringFormat=\{0:F3\}}" />
|
||
<DataGridTextColumn Header="Size" Width="70" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="PnL" Width="80" Binding="{Binding Pnl, StringFormat=\{0:F2\}}" />
|
||
<DataGridTextColumn Header="PnL %" Width="70" Binding="{Binding PnlPercent, StringFormat=\{0:F1\}}" />
|
||
<DataGridTextColumn Header="Eröffnet" Width="130" Binding="{Binding OpenedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
|
||
<DataGridTextColumn Header="Geschlossen" Width="130" 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>
|