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,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:lvc="using:LiveChartsCore.SkiaSharpView.Avalonia"
|
||||
@@ -119,17 +119,17 @@
|
||||
|
||||
<DataGrid Name="gridTrades" x:DataType="vm:DashboardTradeRow">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Modul" Width="110" Binding="{Binding Module}" />
|
||||
<DataGridTextColumn Header="Konto" Width="130" Binding="{Binding Account}" />
|
||||
<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 EntryPrice, StringFormat=\{0:F3\}}" />
|
||||
<DataGridTextColumn Header="Exit" Width="70" Binding="{Binding ExitPrice, StringFormat=\{0:F3\}}" />
|
||||
<DataGridTextColumn Header="Size" Width="70" Binding="{Binding Size, StringFormat=\{0:F2\}}" />
|
||||
<DataGridTextColumn Header="PnL" Width="80" Binding="{Binding RealizedPnl, StringFormat=\{0:F2\}}" />
|
||||
<DataGridTextColumn Header="PnL %" Width="70" Binding="{Binding PnlPercent, StringFormat=\{0:F1\}}" />
|
||||
<DataGridTextColumn Header="Geschlossen" Width="140" Binding="{Binding ClosedAt, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" />
|
||||
<DataGridTextColumn Header="Modul" Width="Auto" Binding="{Binding Module}" />
|
||||
<DataGridTextColumn Header="Konto" Width="Auto" Binding="{Binding Account}" />
|
||||
<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 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>
|
||||
@@ -142,10 +142,10 @@
|
||||
|
||||
<DataGrid Name="gridModules" x:DataType="vm:ModuleRow">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Modul" Width="220" Binding="{Binding Modul}" />
|
||||
<DataGridTextColumn Header="Status" Width="260" Binding="{Binding Status}" />
|
||||
<DataGridTextColumn Header="Hinweis" Width="*" Binding="{Binding Hinweis}" />
|
||||
<DataGridTemplateColumn Header="Aktion" Width="160">
|
||||
<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}"
|
||||
|
||||
@@ -140,7 +140,7 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
(!since.HasValue || t.ClosedAt >= since.Value)).ToList();
|
||||
|
||||
UpdateKpis(scoped);
|
||||
_charts.Update(scoped);
|
||||
_charts.Update(scoped, since);
|
||||
|
||||
_historyBase = scoped.OrderByDescending(t => t.ClosedAt).Select(ToRow).ToList();
|
||||
ApplyHistoryFilter();
|
||||
|
||||
@@ -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:models="using:PolyTraderSharp.Models"
|
||||
x:Class="PolyTrader.App.Avalonia.Views.JobsWindow">
|
||||
@@ -19,17 +19,17 @@
|
||||
|
||||
<DataGrid Name="gridJobs" x:DataType="models:JobStatusRow">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Job Name" Width="150"
|
||||
<DataGridTextColumn Header="Job Name" Width="Auto"
|
||||
Binding="{Binding JobName}" />
|
||||
<DataGridTextColumn Header="Status" Width="150"
|
||||
<DataGridTextColumn Header="Status" Width="Auto"
|
||||
Binding="{Binding StatusText}" />
|
||||
<DataGridTextColumn Header="Zuletzt ausgeführt" Width="130"
|
||||
<DataGridTextColumn Header="Zuletzt ausgeführt" Width="Auto"
|
||||
Binding="{Binding LastRun, StringFormat=\{0:HH:mm:ss\}}" />
|
||||
<DataGridTextColumn Header="Nächster Lauf" Width="130"
|
||||
<DataGridTextColumn Header="Nächster Lauf" Width="Auto"
|
||||
Binding="{Binding NextRun, StringFormat=\{0:HH:mm:ss\}}" />
|
||||
<DataGridCheckBoxColumn Header="Aktiv" Width="60" IsReadOnly="False"
|
||||
<DataGridCheckBoxColumn Header="Aktiv" Width="Auto" IsReadOnly="False"
|
||||
Binding="{Binding IsEnabled}" />
|
||||
<DataGridTemplateColumn Header="Aktion" Width="90">
|
||||
<DataGridTemplateColumn Header="Aktion" Width="Auto">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate x:DataType="models:JobStatusRow">
|
||||
<Button Content="Run Now"
|
||||
@@ -40,7 +40,7 @@
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
<DataGridTextColumn Header="Beschreibung" Width="*"
|
||||
<DataGridTextColumn Header="Beschreibung" Width="*" MinWidth="180"
|
||||
Binding="{Binding Description}" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
|
||||
@@ -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:shell="using:PolyTrader.App.Avalonia.Shell"
|
||||
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
|
||||
@@ -71,9 +71,9 @@
|
||||
<HeaderedContentControl Header="Account-Übersicht">
|
||||
<DataGrid Name="gridAccounts" x:DataType="vm:AccountOverviewRow" Height="180">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Account" Width="180" Binding="{Binding Name}" />
|
||||
<DataGridTextColumn Header="Module" Width="220" Binding="{Binding Modules}" />
|
||||
<DataGridTemplateColumn Header="Polymarket" Width="110">
|
||||
<DataGridTextColumn Header="Account" Width="Auto" Binding="{Binding Name}" />
|
||||
<DataGridTextColumn Header="Module" Width="Auto" Binding="{Binding Modules}" />
|
||||
<DataGridTemplateColumn Header="Polymarket" Width="Auto">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate x:DataType="vm:AccountOverviewRow">
|
||||
<Button Content="Profil"
|
||||
@@ -83,10 +83,10 @@
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
<DataGridTextColumn Header="Wallet (USDC)" Width="130" Binding="{Binding Balance, StringFormat=\{0:N2\}}" />
|
||||
<DataGridTextColumn Header="3T PnL" Width="120" Binding="{Binding Pnl3d, StringFormat=\{0:N2\}}" />
|
||||
<DataGridTextColumn Header="3T Winrate %" Width="120" Binding="{Binding WinRate3d, StringFormat=\{0:N1\}}" />
|
||||
<DataGridTextColumn Header="Overall P/L" Width="130" Binding="{Binding OverallPnl, StringFormat=\{0:N2\}}" />
|
||||
<DataGridTextColumn Header="Wallet (USDC)" Width="Auto" Binding="{Binding Balance, StringFormat=\{0:N2\}}" />
|
||||
<DataGridTextColumn Header="3T PnL" Width="Auto" Binding="{Binding Pnl3d, StringFormat=\{0:N2\}}" />
|
||||
<DataGridTextColumn Header="3T Winrate %" Width="Auto" Binding="{Binding WinRate3d, StringFormat=\{0:N1\}}" />
|
||||
<DataGridTextColumn Header="Overall P/L" Width="Auto" Binding="{Binding OverallPnl, StringFormat=\{0:N2\}}" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</HeaderedContentControl>
|
||||
@@ -106,11 +106,19 @@
|
||||
CornerRadius="4"
|
||||
Background="{DynamicResource AppCardBrush}"
|
||||
Padding="10,8" Margin="0,0,8,8" Width="250">
|
||||
<!--
|
||||
Die Vorzeichenfarbe kommt ueber Klassen + DynamicResource, nicht
|
||||
mehr als im Code aufgeloester Pinsel: der wurde beim Themenwechsel
|
||||
nicht neu ausgewertet und blieb dann auf der Hell-Farbe stehen -
|
||||
dunkelgruen auf dunklem Grund, 2,3:1 statt der geforderten 4,5:1
|
||||
(Befund B-6 des Linux-Sichttests).
|
||||
-->
|
||||
<StackPanel Spacing="4">
|
||||
<TextBlock Text="{Binding ModuleName}" FontWeight="SemiBold" FontSize="13" />
|
||||
<TextBlock Text="{Binding Text}"
|
||||
Foreground="{Binding ForegroundBrush}"
|
||||
FontFamily="Consolas,Menlo,monospace"
|
||||
Classes.positive="{Binding IsPositive}"
|
||||
Classes.negative="{Binding IsNegative}"
|
||||
FontFamily="{DynamicResource AppFontMono}"
|
||||
FontSize="11" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
@@ -125,10 +133,10 @@
|
||||
<HeaderedContentControl Grid.Column="0" Header="Auffällige Trades (24h)" Height="250">
|
||||
<DataGrid Name="gridNotable" x:DataType="vm:NotableTradeRow">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Modul" Width="110" Binding="{Binding Module}" />
|
||||
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding Market}" />
|
||||
<DataGridTextColumn Header="PnL" Width="85" Binding="{Binding Pnl, StringFormat=\{0:F2\}}" />
|
||||
<DataGridTextColumn Header="PnL %" Width="75" Binding="{Binding PnlPct, StringFormat=\{0:F1\}}" />
|
||||
<DataGridTextColumn Header="Modul" Width="Auto" Binding="{Binding Module}" />
|
||||
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding Market}" />
|
||||
<DataGridTextColumn Header="PnL" Width="Auto" Binding="{Binding Pnl, StringFormat=\{0:F2\}}" />
|
||||
<DataGridTextColumn Header="PnL %" Width="Auto" Binding="{Binding PnlPct, StringFormat=\{0:F1\}}" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</HeaderedContentControl>
|
||||
@@ -139,9 +147,9 @@
|
||||
<HeaderedContentControl Grid.Column="2" Name="grpAlerts" Header="Warnungen & Fehler (heute)" Height="250">
|
||||
<DataGrid Name="gridAlerts" x:DataType="vm:LogAlertRow">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Zeit" Width="75" Binding="{Binding Time}" />
|
||||
<DataGridTextColumn Header="Level" Width="80" Binding="{Binding Level}" />
|
||||
<DataGridTextColumn Header="Nachricht" Width="*" Binding="{Binding Message}" />
|
||||
<DataGridTextColumn Header="Zeit" Width="Auto" Binding="{Binding Time}" />
|
||||
<DataGridTextColumn Header="Level" Width="Auto" Binding="{Binding Level}" />
|
||||
<DataGridTextColumn Header="Nachricht" Width="*" MinWidth="180" Binding="{Binding Message}" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</HeaderedContentControl>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
@@ -398,8 +398,10 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
var k7 = TradeAnalytics.ComputeKpis(moduleTrades.Where(t => t.ClosedAt >= week));
|
||||
var k30 = TradeAnalytics.ComputeKpis(moduleTrades);
|
||||
|
||||
string text = $"{module}\n" +
|
||||
$"Heute: {todayPnl:+0.00;-0.00} USDC\n" +
|
||||
// Ohne den Modulnamen: die Kachel traegt ihn bereits als Ueberschrift, im Textblock
|
||||
// stand er ein zweites Mal ("CopyTrading / CopyTrading / Heute: ...") und sah aus
|
||||
// wie ein Darstellungsfehler (Befund B-7 des Linux-Sichttests).
|
||||
string text = $"Heute: {todayPnl:+0.00;-0.00} USDC\n" +
|
||||
$"7T: {k7.NetPnl:+0.00;-0.00} · {k7.WinRatePct:0}% · {k7.TradeCount} Tr.\n" +
|
||||
$"30T: {k30.NetPnl:+0.00;-0.00} · {k30.WinRatePct:0}%";
|
||||
|
||||
@@ -419,7 +421,9 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
try
|
||||
{
|
||||
string logsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");
|
||||
string path = Path.Combine(logsDir, $"{DateTime.Now:yyyy-MM-dd}.jsonl");
|
||||
// Tagesdatei nach der Anzeige-Zeitzone, nicht nach der Systemzeit - sonst greift
|
||||
// die Startseite auf einem UTC-Server abends in die Datei des Vortags (§8).
|
||||
string path = Path.Combine(logsDir, $"{AppTimeZone.Today:yyyy-MM-dd}.jsonl");
|
||||
var rows = new List<LogAlertRow>();
|
||||
if (File.Exists(path))
|
||||
{
|
||||
@@ -504,8 +508,13 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
|
||||
// ===== Helfer =====
|
||||
|
||||
// Als DateTimeOffset lesen und die Uhrzeit SO anzeigen, wie sie in der Datei steht:
|
||||
// DateTime.TryParse haette den Zeitstempel zusaetzlich in die Systemzeit gerueckt.
|
||||
private static string ShortTime(string iso) =>
|
||||
DateTime.TryParse(iso, out var dt) ? dt.ToString("HH:mm:ss") : iso;
|
||||
DateTimeOffset.TryParse(iso, System.Globalization.CultureInfo.InvariantCulture,
|
||||
System.Globalization.DateTimeStyles.None, out var dt)
|
||||
? dt.ToString("HH:mm:ss")
|
||||
: iso;
|
||||
|
||||
private static string OneLine(string s) =>
|
||||
(s ?? string.Empty).Replace("\r", " ").Replace("\n", " ").Trim();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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:models="using:PolyTraderSharp.Models"
|
||||
@@ -56,10 +56,10 @@
|
||||
<Grid ColumnDefinitions="380,4,*">
|
||||
<DataGrid Name="gridAccounts" Grid.Column="0" x:DataType="models:AccountState">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="#" Width="50" Binding="{Binding AccountId}" />
|
||||
<DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}" />
|
||||
<DataGridCheckBoxColumn Header="Demo" Width="60" Binding="{Binding IsDemo}" />
|
||||
<DataGridCheckBoxColumn Header="Aktiv" Width="60" Binding="{Binding IsActive}" />
|
||||
<DataGridTextColumn Header="#" Width="Auto" Binding="{Binding AccountId}" />
|
||||
<DataGridTextColumn Header="Name" Width="*" MinWidth="180" Binding="{Binding Name}" />
|
||||
<DataGridCheckBoxColumn Header="Demo" Width="Auto" Binding="{Binding IsDemo}" />
|
||||
<DataGridCheckBoxColumn Header="Aktiv" Width="Auto" Binding="{Binding IsActive}" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
|
||||
|
||||
@@ -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"
|
||||
x:Class="PolyTrader.App.Avalonia.Views.TerminalWindow">
|
||||
@@ -77,10 +77,10 @@
|
||||
|
||||
<DataGrid Name="gridLogs" x:DataType="vm:LogViewerRow">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Zeit" Width="90" Binding="{Binding Time}" />
|
||||
<DataGridTextColumn Header="Level" Width="110" Binding="{Binding Level}" />
|
||||
<DataGridTextColumn Header="CID" Width="160" Binding="{Binding Cid}" />
|
||||
<DataGridTextColumn Header="Nachricht" Width="*" Binding="{Binding Message}" />
|
||||
<DataGridTextColumn Header="Zeit" Width="Auto" Binding="{Binding Time}" />
|
||||
<DataGridTextColumn Header="Level" Width="Auto" Binding="{Binding Level}" />
|
||||
<DataGridTextColumn Header="CID" Width="Auto" Binding="{Binding Cid}" />
|
||||
<DataGridTextColumn Header="Nachricht" Width="*" MinWidth="180" Binding="{Binding Message}" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</DockPanel>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
@@ -63,7 +63,7 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
cbLevel.SelectedIndex = 0;
|
||||
cbViewerLevel.SelectedIndex = 0;
|
||||
|
||||
this.FindControl<CalendarDatePicker>("dtViewerDate")!.SelectedDate = DateTime.Now;
|
||||
this.FindControl<CalendarDatePicker>("dtViewerDate")!.SelectedDate = AppTimeZone.Today;
|
||||
|
||||
this.FindControl<Button>("btnAutoscroll")!.Click += (_, _) => ToggleAutoscroll();
|
||||
this.FindControl<Button>("btnClear")!.Click += (_, _) => { _lines.Clear(); UpdateLiveStatus(); };
|
||||
@@ -123,9 +123,9 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
processed++;
|
||||
if (filter != "Alle" && e.Level.ToString() != filter) continue;
|
||||
|
||||
// Anzeige-Zeitzone aus den Server-Settings (siehe AppTimeZone) – nicht mehr fest
|
||||
// gegen eine Windows-Zeitzonen-ID gerechnet.
|
||||
DateTime t = AppTimeZone.ToDisplay(e.Timestamp);
|
||||
// Der Zeitstempel steht seit dem 27.08.2026 bereits in der Anzeige-Zeitzone
|
||||
// (siehe AppTimeZone.Now) - hier wird nicht noch einmal umgerechnet.
|
||||
DateTimeOffset t = e.Timestamp;
|
||||
|
||||
_lines.Add(new LogLine
|
||||
{
|
||||
@@ -187,7 +187,7 @@ namespace PolyTrader.App.Avalonia.Views
|
||||
var status = this.FindControl<TextBlock>("lblViewerStatus")!;
|
||||
try
|
||||
{
|
||||
DateTime day = this.FindControl<CalendarDatePicker>("dtViewerDate")!.SelectedDate ?? DateTime.Now;
|
||||
DateTime day = this.FindControl<CalendarDatePicker>("dtViewerDate")!.SelectedDate ?? AppTimeZone.Today;
|
||||
string path = Path.Combine(AppContext.BaseDirectory, "Logs", $"{day:yyyy-MM-dd}.jsonl");
|
||||
|
||||
_viewerRows.Clear();
|
||||
|
||||
Reference in New Issue
Block a user