Testanleitung: eigenes X-Display je Projekt fuer Parallelbetrieb
CI / Build & Tests (Linux) (push) Canceled after 0s
CI / Plattformneutralität & Hygiene (push) Canceled after 0s

Damit mehrere Agenten gleichzeitig Oberflaechen testen koennen, bekommt jedes
Projekt eine feste Displaynummer (Vorgabe Richard):

  :99 PolyTrader, :98 Predictalytics, :97 ClawdDotNet, :96 IBKRTrader,
  :95 und absteigend fuer kuenftige Projekte.

Zwei Prozesse auf demselben Display sehen die Fenster des jeweils anderen -
Klicks landen im falschen Programm, Aufnahmen zeigen fremde Anwendungen.

Beim Durcharbeiten fielen zwei weitere Kollisionspunkte auf, die zum
Parallelbetrieb dazugehoeren und mit aufgenommen wurden:

- Screenshot- und Logdateien in /tmp brauchen ein Projektpraefix. /tmp/v_1.png
  ueberschreiben sich parallel laufende Projekte gegenseitig.
- "xvfb-run -a" darf NICHT mehr verwendet werden: Das -a sucht sich selbst ein
  freies Display und beginnt dabei bei :99 - ausgerechnet PolyTraders Nummer.
  Stattdessen "xvfb-run -n <nummer>".

Die Warnung ist nicht theoretisch: Auf der VM lag ein verwaister X98-Socket,
entstanden durch genau so einen "xvfb-run -a"-Aufruf beim smoke-ui-Test, als
:99 belegt war. Er blockierte Predictalytics' reservierte Nummer, ohne dass ein
Prozess lief. Entfernt, und die Anleitung erklaert jetzt, wie man verwaiste
Sockets erkennt (ls /tmp/.X11-unix/ gegen pgrep -a Xvfb lesen) und aufraeumt.

Weiter ergaenzt:
- pkill nie ohne Displaynummer - "pkill Xvfb" erschlaegt die Sitzungen aller
  anderen Projekte.
- DISPLAY in jedem Skript setzen, sonst landet man auf :0, dem echten Desktop.
- Die Skriptvorlage hat jetzt einen Kopf mit PROJEKT/DISP/FENSTER; das ist
  alles, was sich je Projekt unterscheidet. Praktisch gegengetestet.
- Aufraeumabschnitt und Belegungsliste um Displays und Verzeichnisse erweitert.

Nebenbei aufgefallen: Das PolyTrader-Publish lag unter ~/pt-test statt
~/polytrader-test und verletzte damit die eigene Verzeichniskonvention.
Umbenannt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-27 20:49:28 +02:00
co-authored by Claude Opus 5
parent 62570cfdd8
commit 9b2294cb4c
33 changed files with 979 additions and 244 deletions
@@ -1,4 +1,4 @@
<UserControl xmlns="https://github.com/avaloniaui"
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:acc="using:PolyTrader.Modules.Accounting.Models"
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
@@ -88,14 +88,14 @@
<DataGrid Name="gridMonthly" Margin="12" x:DataType="vm:MonthlyRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Monat" Width="140" Binding="{Binding Month}" />
<DataGridTextColumn Header="Handelsergebnis" Width="160" Binding="{Binding Net}" />
<DataGridTextColumn Header="Einzahlungen" Width="140" Binding="{Binding Deposits}" />
<DataGridTextColumn Header="Auszahlungen" Width="140" Binding="{Binding Withdrawals}" />
<DataGridTextColumn Header="Fees" Width="120" Binding="{Binding Fees}" />
<DataGridTextColumn Header="Volumen" Width="140" Binding="{Binding Volume}" />
<DataGridTextColumn Header="Trades" Width="90" Binding="{Binding Trades}" />
<DataGridTextColumn Header="Endsaldo" Width="*" Binding="{Binding Closing}" />
<DataGridTextColumn Header="Monat" Width="Auto" Binding="{Binding Month}" />
<DataGridTextColumn Header="Handelsergebnis" Width="Auto" Binding="{Binding Net}" />
<DataGridTextColumn Header="Einzahlungen" Width="Auto" Binding="{Binding Deposits}" />
<DataGridTextColumn Header="Auszahlungen" Width="Auto" Binding="{Binding Withdrawals}" />
<DataGridTextColumn Header="Fees" Width="Auto" Binding="{Binding Fees}" />
<DataGridTextColumn Header="Volumen" Width="Auto" Binding="{Binding Volume}" />
<DataGridTextColumn Header="Trades" Width="Auto" Binding="{Binding Trades}" />
<DataGridTextColumn Header="Endsaldo" Width="*" MinWidth="180" Binding="{Binding Closing}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
@@ -114,17 +114,17 @@
<DataGrid Name="gridLedger" x:DataType="acc:LedgerEntry">
<DataGrid.Columns>
<DataGridTextColumn Header="Zeitpunkt" Width="150" Binding="{Binding Timestamp, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Typ" Width="120" Binding="{Binding EventType}" />
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding MarketSlug}" />
<DataGridTextColumn Header="Outcome" Width="80" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Side" Width="60" Binding="{Binding Side}" />
<DataGridTextColumn Header="Size" Width="90" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Preis" Width="80" Binding="{Binding PriceUsdc, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Brutto" Width="100" Binding="{Binding GrossUsdc, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Fee" Width="90" Binding="{Binding FeeUsdc, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Netto" Width="100" Binding="{Binding NetUsdc, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Quelle" Width="110" Binding="{Binding Source}" />
<DataGridTextColumn Header="Zeitpunkt" Width="Auto" Binding="{Binding Timestamp, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Typ" Width="Auto" Binding="{Binding EventType}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding MarketSlug}" />
<DataGridTextColumn Header="Outcome" Width="Auto" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Side" Width="Auto" Binding="{Binding Side}" />
<DataGridTextColumn Header="Size" Width="Auto" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Preis" Width="Auto" Binding="{Binding PriceUsdc, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Brutto" Width="Auto" Binding="{Binding GrossUsdc, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Fee" Width="Auto" Binding="{Binding FeeUsdc, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Netto" Width="Auto" Binding="{Binding NetUsdc, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Quelle" Width="Auto" Binding="{Binding Source}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
@@ -144,13 +144,13 @@
<DataGrid Name="gridRuns" x:DataType="acc:IngestRun">
<DataGrid.Columns>
<DataGridTextColumn Header="Start" Width="160" Binding="{Binding StartedAt, StringFormat=\{0:dd.MM.yyyy HH:mm:ss\}}" />
<DataGridTextColumn Header="Ende" Width="160" Binding="{Binding FinishedAt, StringFormat=\{0:dd.MM.yyyy HH:mm:ss\}}" />
<DataGridCheckBoxColumn Header="Backfill" Width="80" Binding="{Binding Backfill}" />
<DataGridCheckBoxColumn Header="Erfolg" Width="70" Binding="{Binding Success}" />
<DataGridTextColumn Header="Neu" Width="70" Binding="{Binding NewEntries}" />
<DataGridTextColumn Header="Duplikate" Width="90" Binding="{Binding DuplicateEntries}" />
<DataGridTextColumn Header="Meldung" Width="*" Binding="{Binding Message}" />
<DataGridTextColumn Header="Start" Width="Auto" Binding="{Binding StartedAt, StringFormat=\{0:dd.MM.yyyy HH:mm:ss\}}" />
<DataGridTextColumn Header="Ende" Width="Auto" Binding="{Binding FinishedAt, StringFormat=\{0:dd.MM.yyyy HH:mm:ss\}}" />
<DataGridCheckBoxColumn Header="Backfill" Width="Auto" Binding="{Binding Backfill}" />
<DataGridCheckBoxColumn Header="Erfolg" Width="Auto" Binding="{Binding Success}" />
<DataGridTextColumn Header="Neu" Width="Auto" Binding="{Binding NewEntries}" />
<DataGridTextColumn Header="Duplikate" Width="Auto" Binding="{Binding DuplicateEntries}" />
<DataGridTextColumn Header="Meldung" Width="*" MinWidth="180" Binding="{Binding Message}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
@@ -1,7 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui"
<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">
@@ -29,18 +30,31 @@
<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}" />
<!-- Der Name steht vorn und bekommt den freien Platz: 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). -->
<DataGridTextColumn Header="#" Width="Auto" Binding="{Binding Id}" />
<DataGridTextColumn Header="Name" Width="*" 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>
@@ -78,19 +92,19 @@
<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}" />
<DataGridTextColumn Header="Account" Width="Auto" Binding="{Binding Account}" />
<DataGridTextColumn Header="Master-Trader" Width="Auto" Binding="{Binding Trader}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" 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>
@@ -120,19 +134,19 @@
<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\}}" />
<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="*" MinWidth="180" 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>
@@ -1,4 +1,4 @@
<UserControl xmlns="https://github.com/avaloniaui"
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:PolyTrader.App.Avalonia.Controls"
xmlns:rf="using:PolyTrader.Modules.ResolutionFarming.Models"
@@ -21,14 +21,14 @@
<TabItem Header="Kandidaten">
<DataGrid Name="gridCandidates" x:DataType="rf:RfCandidate">
<DataGrid.Columns>
<DataGridTextColumn Header="Gescannt" Width="140" Binding="{Binding ScannedAt, StringFormat=\{0:dd.MM. HH:mm\}}" />
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Outcome" Width="80" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Kategorie" Width="120" Binding="{Binding Category}" />
<DataGridTextColumn Header="Ask" Width="70" Binding="{Binding Ask, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Fee (bps)" Width="80" Binding="{Binding FeeBps}" />
<DataGridTextColumn Header="Netto-Edge %" Width="110" Binding="{Binding NetEdgePct, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Score" Width="80" Binding="{Binding Score, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Gescannt" Width="Auto" Binding="{Binding ScannedAt, StringFormat=\{0:dd.MM. HH:mm\}}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Outcome" Width="Auto" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Kategorie" Width="Auto" Binding="{Binding Category}" />
<DataGridTextColumn Header="Ask" Width="Auto" Binding="{Binding Ask, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Fee (bps)" Width="Auto" Binding="{Binding FeeBps}" />
<DataGridTextColumn Header="Netto-Edge %" Width="Auto" Binding="{Binding NetEdgePct, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Score" Width="Auto" Binding="{Binding Score, StringFormat=\{0:F2\}}" />
</DataGrid.Columns>
</DataGrid>
</TabItem>
@@ -40,15 +40,15 @@
</Border>
<DataGrid Name="gridPositions" x:DataType="rf:RfPosition">
<DataGrid.Columns>
<DataGridTextColumn Header="Eröffnet" Width="140" Binding="{Binding OpenedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Outcome" Width="80" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Kategorie" Width="120" Binding="{Binding Category}" />
<DataGridTextColumn Header="Entry" Width="70" Binding="{Binding EntryPrice, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Size" Width="80" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Einsatz" Width="90" Binding="{Binding AmountUsd, StringFormat=\{0:F2\}}" />
<DataGridCheckBoxColumn Header="Demo" Width="60" Binding="{Binding IsDemo}" />
<DataGridTextColumn Header="Auflösung" Width="140" Binding="{Binding EndDate, StringFormat=\{0:dd.MM.yyyy\}}" />
<DataGridTextColumn Header="Eröffnet" Width="Auto" Binding="{Binding OpenedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Outcome" Width="Auto" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Kategorie" Width="Auto" Binding="{Binding Category}" />
<DataGridTextColumn Header="Entry" Width="Auto" Binding="{Binding EntryPrice, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Size" Width="Auto" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="Einsatz" Width="Auto" Binding="{Binding AmountUsd, StringFormat=\{0:F2\}}" />
<DataGridCheckBoxColumn Header="Demo" Width="Auto" Binding="{Binding IsDemo}" />
<DataGridTextColumn Header="Auflösung" Width="Auto" Binding="{Binding EndDate, StringFormat=\{0:dd.MM.yyyy\}}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
@@ -61,15 +61,15 @@
</Border>
<DataGrid Name="gridHistory" x:DataType="rf:RfClosedTrade">
<DataGrid.Columns>
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Outcome" Width="80" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Kategorie" Width="120" Binding="{Binding Category}" />
<DataGridTextColumn Header="Entry" Width="70" Binding="{Binding EntryPrice, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Exit" Width="70" Binding="{Binding ExitPrice, StringFormat=\{0:F3\}}" />
<DataGridTextColumn Header="Size" Width="80" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="PnL" Width="90" Binding="{Binding RealizedPnl, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="PnL %" Width="80" Binding="{Binding PnlPercent, StringFormat=\{0:F1\}}" />
<DataGridCheckBoxColumn Header="Demo" Width="60" Binding="{Binding IsDemo}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Outcome" Width="Auto" Binding="{Binding Outcome}" />
<DataGridTextColumn Header="Kategorie" Width="Auto" Binding="{Binding Category}" />
<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\}}" />
<DataGridCheckBoxColumn Header="Demo" Width="Auto" Binding="{Binding IsDemo}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
@@ -1,4 +1,4 @@
<UserControl xmlns="https://github.com/avaloniaui"
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
xmlns:sup="using:PolyTrader.Modules.Supervisor.Persistence"
@@ -63,11 +63,11 @@
<Grid ColumnDefinitions="*,4,*">
<DataGrid Name="gridSignals" Grid.Column="0" x:DataType="svc:SignalSummary">
<DataGrid.Columns>
<DataGridTextColumn Header="Zeit" Width="130" Binding="{Binding FirstSeen, StringFormat=\{0:dd.MM. HH:mm\}}" />
<DataGridTextColumn Header="Modul" Width="110" Binding="{Binding ModuleName}" />
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Side" Width="60" Binding="{Binding Side}" />
<DataGridTextColumn Header="Entscheidung" Width="120" Binding="{Binding LastDecision}" />
<DataGridTextColumn Header="Zeit" Width="Auto" Binding="{Binding FirstSeen, StringFormat=\{0:dd.MM. HH:mm\}}" />
<DataGridTextColumn Header="Modul" Width="Auto" Binding="{Binding ModuleName}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Side" Width="Auto" Binding="{Binding Side}" />
<DataGridTextColumn Header="Entscheidung" Width="Auto" Binding="{Binding LastDecision}" />
</DataGrid.Columns>
</DataGrid>
@@ -89,12 +89,12 @@
</Border>
<DataGrid Name="gridReports" x:DataType="sup:SupervisorReport">
<DataGrid.Columns>
<DataGridTextColumn Header="Erstellt" Width="150" Binding="{Binding CreatedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Profil" Width="140" Binding="{Binding Profile}" />
<DataGridTextColumn Header="Modell" Width="200" Binding="{Binding Model}" />
<DataGridTextColumn Header="Frage" Width="300" Binding="{Binding Question}" />
<DataGridTextColumn Header="Antwort" Width="*" Binding="{Binding Answer}" />
<DataGridTextColumn Header="Tools" Width="70" Binding="{Binding ToolCallCount}" />
<DataGridTextColumn Header="Erstellt" Width="Auto" Binding="{Binding CreatedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Profil" Width="Auto" Binding="{Binding Profile}" />
<DataGridTextColumn Header="Modell" Width="Auto" Binding="{Binding Model}" />
<DataGridTextColumn Header="Frage" Width="Auto" Binding="{Binding Question}" />
<DataGridTextColumn Header="Antwort" Width="*" MinWidth="180" Binding="{Binding Answer}" />
<DataGridTextColumn Header="Tools" Width="Auto" Binding="{Binding ToolCallCount}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
@@ -107,12 +107,12 @@
</Border>
<DataGrid Name="gridCounterfactual" x:DataType="cf:CounterfactualRecord">
<DataGrid.Columns>
<DataGridTextColumn Header="Geprüft" Width="150" Binding="{Binding CheckedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Modul" Width="120" Binding="{Binding ModuleName}" />
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Grund der Ablehnung" Width="260" Binding="{Binding Reason}" />
<DataGridTextColumn Header="Signalpreis" Width="100" Binding="{Binding SignalPrice, StringFormat=\{0:F3\}}" />
<DataGridCheckBoxColumn Header="Wäre Gewinner" Width="120" Binding="{Binding IsWinner}" />
<DataGridTextColumn Header="Geprüft" Width="Auto" Binding="{Binding CheckedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
<DataGridTextColumn Header="Modul" Width="Auto" Binding="{Binding ModuleName}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding MarketQuestion}" />
<DataGridTextColumn Header="Grund der Ablehnung" Width="Auto" Binding="{Binding Reason}" />
<DataGridTextColumn Header="Signalpreis" Width="Auto" Binding="{Binding SignalPrice, StringFormat=\{0:F3\}}" />
<DataGridCheckBoxColumn Header="Wäre Gewinner" Width="Auto" Binding="{Binding IsWinner}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>