Testanleitung: eigenes X-Display je Projekt fuer Parallelbetrieb
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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user