Statt je Ansicht ein eigenes Fenster (3 Launcher-Buttons) gibt es jetzt EIN
Modul-Fenster mit Tabs – wie im alten PolyTrader. Skaliert sauber, wenn weitere
Module dazukommen (ein Button je Modul).
- MasterTradersView/ClosedTradesView/AccountSettingsView: von Form -> UserControl
(Tab-Inhalte); Designer-Root auf Size statt ClientSize/Text/MinimumSize.
- Neu: CopyTradingMainForm (Designer) mit TabControl + 3 TabPages, hostet die
drei UserControls; Initialize(IServiceProvider) versorgt jeden Tab per DI.
- CopyTradingModule.RegisterUi registriert nur noch EINE View "Copytrading".
Verifiziert: Build grün, --smoke-ui grün (eine View copytrading.main +
Launcher konstruieren fehlerfrei, 3 Accounts / 32 Trader hydriert).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der VS-WinForms-Designer braucht einen parameterlosen Konstruktor, um eine Form
zu instanziieren. Die drei Views hatten nur einen DI-Ctor -> Designer hätte sie
nicht öffnen können. Umgestellt auf das Core-View-Muster (DashboardView):
- Parameterloser Ctor: InitializeComponent() + Event-Wiring.
- Initialize(deps): Abhängigkeiten setzen + Daten laden.
- Felder nullable + Null-Guards in den Handlern.
- CopyTradingModule.RegisterUi: new View() + view.Initialize(...) statt DI-Ctor.
Verifiziert: Build grün, --smoke-ui grün (3 Accounts / 32 Trader, alle Views OK).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Die drei Modul-Views wurden von komplett code-first (alle Controls im Konstruktor)
auf das Standard-WinForms-Designer-Muster umgestellt (je X.cs + X.Designer.cs mit
InitializeComponent), damit sie im Designer geöffnet und bearbeitet werden können:
- ClosedTradesView, AccountSettingsView, MasterTradersView: alle wichtigen
Steuerelemente (Panels, DataGridView mit expliziten Spalten via
AutoGenerateColumns=false, PropertyGrid, ToolStrip, GroupBox, CheckedListBox,
ComboBox, Buttons, Labels, Splitter) sind jetzt Designer-Felder.
- Konsistent mit den Core-Views (DashboardView-Muster): Layout im Designer,
Zellformate/Event-Wiring/Datenbindung im Code.
Verifiziert: --smoke-ui grün (3 Accounts / 32 Trader; alle Views + Launcher OK).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ursachen (App startete aus bin/ bzw. per Doppelklick ohne UI):
1. appsettings.Local.json (MySQL-Connection) wurde NICHT ins Output kopiert und
nur relativ zum Arbeitsverzeichnis geladen -> leere Connection -> Pomelo fiel
auf localhost:3306 zurueck -> "Connect Timeout expired".
2. ServerVersion.AutoDetect(conn) oeffnet beim Options-Bau eine blockierende
DB-Verbindung -> haengt/crasht den Start, wenn die DB nicht erreichbar ist.
3. CopyTradingEngine.StartAsync lud den MarketCache ungeschuetzt -> DB-Fehler
riss AppHost.Start() ab, bevor die UI erschien.
Fixes:
- csproj: appsettings.Local.json mit ins Output kopieren (CopyToOutputDirectory).
- Program: UseContentRoot(AppContext.BaseDirectory) -> Config wird immer neben
der EXE gesucht (Main + Smoke-Test).
- ServerVersion fest gepinnt: DatabaseServerVersion.Value = MariaDB 11.8.6 (wie
am Server erkannt); AddCorePersistence + CopyTradingModule nutzen sie statt
AutoDetect. Kein blockierender Connect mehr beim Start.
- CopyTradingEngine-Preload in try/catch: DB-Fehler bricht den Start nicht mehr ab.
- Neuer Diagnose-CLI --db-version (gibt @@version aus).
Verifiziert: --smoke-ui aus fremdem Arbeitsverzeichnis laeuft gruen
(3 Accounts / 32 Trader hydriert, alle Views + Launcher OK).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- KRITISCH: Host.CreateDefaultBuilder lädt appsettings.Local.json nicht (nur
appsettings.json + appsettings.{Environment}.json). Dadurch war
Database:MySqlConnectionString zur Laufzeit leer -> Pomelo fiel auf
localhost:3306 zurück ("Connect Timeout expired"), die GUI-App hätte am
Server nie mit MySQL verbunden. Fix: appsettings.Local.json explizit per
ConfigureAppConfiguration ergänzen (in Main und im Smoke-Test).
- Neuer CLI-Modus --smoke-ui: baut einen minimalen Host, hydriert den State
aus MySQL und konstruiert jede registrierte View + den Launcher (ohne
Message-Loop / Trading-Services). Deckte den obigen Bug auf.
- Verifiziert: 3 Accounts / 32 Trader hydriert; alle 3 Modul-Views + Launcher
konstruieren fehlerfrei mit echten Daten.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ConfigMigrator: kopiert Accounts, aktive Markets, Master-Trader,
Copytrading-Settings (mit Fallback auf Alt-Felder im accounts-Dokument)
und Demo-Positionen; Historie startet leer. Idempotent via Upserts.
- Getrennte Mini-Container fuer Quelle (Mongo) und Ziel (EF/MySQL),
unabhaengig vom Provider-Toggle.
- Aufruf: PolyTrader.App --migrate-config (kein UI-Start).
- Erstlauf: 2344 Markets migriert; Accounts/Trader/Settings in lokaler
Mongo leer (nichts zu migrieren).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CopyTradingDbContext (mod_copytrading_* Tabellen) + Design-Time-Factory
- EF-Repos: CopyTradeLog, AccountSettings, TrackedTrader, MasterTraderHistory
- Neue Repo-Contracts ITrackedTraderRepository + IMasterTraderHistoryRepository
(loest die Collection-Inkonsistenz trackers/tracked_traders auf eine Quelle auf)
- Mongo-Impls der neuen Contracts (Uebergang)
- CopyTradingModule.RegisterServices: Provider-Toggle (MySql via EF / Mongo)
- StartupHydrationService + MasterTraderAnalyticsJob nutzen die Repos statt _db
- InitialCopyTrading-Migration erstellt und auf MySQL angewendet
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ModuleView liefert jetzt ein Form (CreateForm statt CreateControl); die 4 Views
(Terminal, Settings, Jobs, Dashboard) von UserControl auf Form umgestellt
(im Designer als Fenster bearbeitbar). ViewHostForm entfernt.
- ShellUiHost verwaltet offene Forms: Einzelinstanz, bereits offenes Fenster wird
in den Vordergrund geholt, OpenStateChanged-Event.
- LauncherForm: Fenster-Buttons an View-IDs gebunden; offene Fenster werden am
Button markiert (Checked), erneuter Klick holt das Fenster nach vorn.
- Build 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- TraderMonitorService, CopyTradingEngine, TraderAnalyticsJob physisch ins
Modul-Projekt (src/PolyTrader.Modules.CopyTrading/Services) verschoben.
- Neu: CopyTradingModule : IPolyTraderModule — registriert CopyTradingState,
die Signal-/Trade-Channels, ICopyTradeLogRepository und die Modul-Services selbst.
- Program.cs: Modul-Discovery (foreach module.RegisterServices / RegisterUi);
die entsprechenden Direkt-Registrierungen entfernt. StartupHydration laeuft
weiterhin als erster HostedService (State-Hydration vor Trading).
- MasterTraderAnalyticsJob bleibt vorerst in der App (nutzt noch den App-Shim
fuer mt_history -> braucht erst ein History-Repo). RegisterUi noch leer
(Modul-Views folgen; Copytrading-UI weiter ueber Legacy erreichbar).
- Build 0 Fehler. Launcher zeigt jetzt "Module: 1".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Core: TradeRecord (Modell) + ITradeLogRepository (+ Mongo-Impl, Collection
"trade_log"), in AddCorePersistence registriert. Realisiert den generischen,
modulneutralen Trade-Log aus Entscheidung #2.
- Dual-Write: PersistenceService schreibt geschlossene Copy-Trades zusaetzlich als
generischen TradeRecord (ModuleName="CopyTrading").
- Neue DashboardView (UserControl + Designer): zeigt die letzten Trades ALLER
Module (GetRecent) mit Konto-Aufloesung + Kurzauswertung (Gesamt-PnL, Anzahl,
Aufschluesselung je Modul). btn_dashboard im Launcher, View "core.dashboard".
- Build 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Neue JobsView (UserControl + Designer): DataGridView an JobManager.Jobs,
Run-Now/Aktiv-Verhalten wie bisheriger Jobs-Tab. btn_jobs in toolstrip_windows,
als View "core.jobs" registriert.
- Trading-Toggle aus frm_main uebernommen: btn_liveTrading + btn_demoTrading in
toolstrip_quickbar; Zyklus Inactive->SellOnly->Active mit Farb-/Textstatus,
synchron zum TradingState (auch bei externen Aenderungen via 1s-Timer).
- Build 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- LauncherForm ist jetzt ein echtes Designer-Formular (LauncherForm.Designer.cs):
ListView + MenuStrip + Button im Designer platziert/bearbeitbar. Zur Laufzeit
werden nur noch ListView-Eintraege/Gruppen (DATEN) aus den registrierten Views
befuellt + Events verdrahtet — keine Steuerelemente mehr im Code erzeugt.
- TerminalView: Combo-Items, Button-Text/-Farbe in den Designer verlagert;
Konstruktor verdrahtet nur noch Verhalten.
- Inhaerente Ausnahme (Modul-System): die konkreten View-Eintraege sind Daten,
keine vorplatzierbaren Controls -> daher datengetriebene ListView.
- Build 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- IPolyTraderModule um RegisterUi(IModuleUiHost) erweitert.
- Neu: IModuleUiHost + ModuleView (Core, Modularity) — Views sind designbare
Controls (UserControls), die die Shell in eigenständigen Host-Fenstern öffnet.
- Core: UseWindowsForms aktiviert (fuer den Control-Typ im Contract).
- Build 0 Fehler. Noch keine View implementiert (folgt view-fuer-view).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ClosedTrade (+ ClosedTradeRow) nach src/PolyTrader.Modules.CopyTrading/Models/.
- Neues ICopyTradeLogRepository (+ Mongo-Impl) im Modul: EnsureIndexes, Exists,
Insert, Find(predicate) auf der closed_trades-Collection.
- closed_trades-Zugriffe der Modul-Services vom App-Shim auf das Repo umgestellt:
TraderMonitorService, PersistenceService, PolymarketWssClient, TraderAnalyticsJob.
Shim-/DB-Usings dort entfernt.
- TraderMonitorService nutzt kein _db mehr (auch die uebrigen _db-Guards aus 3d
entfernt, da Repos immer verfuegbar sind). Verhaltensneutral.
- frm_main (UI) + Program.cs (BsonDocument-Cleanup) bleiben auf _db.
- Build 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Neue Sektion 2.7: Core stellt wiederverwendbare WSS-Verbindungsklasse bereit
(Factory, keine geteilten Singleton-Streams); jedes Modul erzeugt eigene
Instanz mit eigenem API-Key + eigenem Filter (Streams sind modulspezifisch
gefiltert). AlchemyWebsocketService wird entsprechend aufgeteilt.
- API-Keys wandern von globaler ServerSettings in die Modul-Settings.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Nach dem TradingState-Split nutzt MarketSyncService nur noch Core-State
(MarketCache) + IMarketRepository + Core-API-Service -> sauber in den Core.
- Ungenutzten Shim-Import entfernt. Build 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- TrackedTrader, TraderAnalyticsResult, MasterTraderHistoryRecord nach
src/PolyTrader.Modules.CopyTrading/Models/ (Namespace beibehalten).
- Ungenutzte Shim-/DB-Usings entfernt (BsonId kommt transitiv via Core).
- Build bestätigt: kein Core-Code referenziert diese Modelle (saubere Grenze).
- Build 0 Fehler. Voraussetzung für den CopyTradingState (5.2).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Beide Services nach Core (nutzen nur TerminalLogger/ServerSettings/JobManager,
keine DB/TradingState/Modul-Typen).
- Threema-ProjectReference von App -> Core umgehängt (App nutzte die Lib nur
über ThreemaService).
- Microsoft.Extensions.Hosting.Abstractions als Core-Paket (BackgroundService).
- Toten Stub services/mullvad.cs gelöscht; Mullvad-DB-Usings entfernt.
- Build 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>