- Ist TrackedTrader.MakerEntry gesetzt, wird der BUY OHNE Preisaufschlag als
ruhendes GTC-Limit am Master-Preis platziert (statt teurem Taker-Fill via GTD),
spart Fees/Spread bei langsamen Mastern. Nutzt die getestete
CopyTradingRisk.CalculateBuyOrderPrice (0 % Aufschlag). Default aus -> dormant.
(Ohne Orderbuch ist der Master-Preis die Naeherung fuer den Bid; echte
Bid-Platzierung + Nichtfill-Eskalation folgen mit dem Market-Channel/Zielland.)
207 Tests gruen. Build/Smoke gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- SellLogic.IsProfitTargetReached (pure, getestet): currentPrice >= entry*(1+pct/100);
pct<=0 oder Default 9999 = inaktiv.
- Ladder-Start-Logik konsolidiert: SellLadderService.StartLadderAsync ist jetzt die
gemeinsame Quelle fuer Master-SELLs (Engine) UND eigene Exits (Profit-Target).
SellLadderService als Singleton+Hosted registriert; Engine + TraderMonitor
injizieren es. Engine-SELL-Block ruft nur noch StartLadderAsync (verhaltensgleich).
- TraderMonitorService.CheckProfitTargetsAsync im 30s-Live-Sync: erreicht eine
Live-Position ihre Schwelle, Exit ueber die Leiter (Startlimit = aktueller Preis,
ExitReason "Profit Target"). PreRedeemLimit hat Vorrang. Dormant, da ProfitTarget
projektweit 9999.
169 Tests gruen. Build/Smoke gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- SELL-Spam-Blockade greift nur noch bei kürzlichem SELL: PendingOrderTimestamps
bekommt eine Side ("BUY"/"SELL"); ein vorheriger BUY blockiert einen legitimen
schnellen SELL des Masters nicht mehr (alle Schreibstellen aktualisiert).
- GlobalPnl: PollClosedAccountsAsync addiert den realisierten PnL jetzt auch
(wie PollLiveAccountsAsync) -> Anzeige driftet nicht mehr.
- Demo-ClosedTrade erhält TokenId (der _processedClosures-Preload filtert darauf;
fehlte -> Duplikat-/Dedup-Risiko nach Neustart).
163 Tests gruen. Build/Smoke gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Behebt die April-Verlustquelle: SELLs wurden als Market-Order mit 0.01-Limit ins
oft leergeraeumte Orderbuch geworfen -> wir wurden zur Exit-Liquidity. Jetzt:
GTC-Limit nahe am Master-Exit, stufenweises Nachpreisen bis zum Floor.
- Position.ExitPending (runtime-only, EF-ignoriert): Position wird bei SELL NICHT
mehr optimistisch entfernt, sondern als ExitPending zurueckgestellt (kein
Doppel-SELL, Limits rechnen korrekt; Sync schliesst nach bestaetigtem Fill).
- CopyTradingState.ExitLadders + ExitLadderState (transienter Leiter-Zustand).
- SellLogic (pure, getestet): FirstLimit (HF-fest/prozentual), Floor (SellFloorPct),
NextPrice (relative Stufe, auf Floor geclamped), IsAtFloor, LadderStepPct (3%),
LadderIntervalSeconds (HF 20s / sonst 120s).
- SellLadderService (BackgroundService): senkt offene Exit-Limits stufenweise
(cancel via CancelConflictingOrdersAsync -> tiefer neu platzieren), am Floor ohne
Fill Position halten + Threema-Benachrichtigung. Fills erkennt der bestehende Sync.
- CopyTradingEngine SELL-Live-Pfad ruft die Leiter; Demo-Pfad unveraendert.
Doppel-SELL-Guard ueber ExitPending. Umfangreiches Logging (kein Live-Test moeglich).
163 Tests gruen. Build/Smoke gruen. Backup-Rollback: Commit 1dffc9e.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Neue pure Klasse TradeMath (Logic/): ExitValue, RealizedPnl, PnlPercent
(Null-Guard), WeightedAverageEntryPrice (Div-durch-0-Schutz).
- CopyTradingEngine ruft sie jetzt im Demo-Close-PnL und bei der Positions-
Aufstockung (Demo + Live, gewichteter Einstiegspreis) – verhaltensneutral.
- TradeMathTests (6 Faelle: Gewinn/Verlust, %-Basis, 0-Kapital/0-Size-Guards).
Gesamt 160 Tests gruen. Build/Smoke gruen. (Phase-0.1-SELL-Wiring weiterhin
bewusst zurueckgestellt bis zum Server-Test; pure Leiter liegt getestet bereit.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Fix (Richard): MaxBuyPrice-Skalen-Korrektur analog PreRedeemLimit
(Migration FixMaxBuyPriceScale: Werte > 1 wie 98.0/99.0 -> /100 = 0.98/0.99;
auf MySQL angewendet). Cap greift bei den betroffenen Accounts jetzt wieder.
Beschreibung des Feldes um den Skalen-Hinweis ergaenzt.
- Testnetz erweitert: reine Klasse BlockchainSubscription (Logic/) fuer das
Alchemy-Abo (PadAddress + Filter-Batching in 3er-Chunks, Buy=Topic3/Sell=Topic2
je Chunk). AlchemyWebsocketService ruft sie jetzt (verhaltensneutral;
Konstanten + lokale Methoden entfernt). BlockchainSubscriptionTests: 13 Faelle
(Padding, Chunk-Anzahl 0/1/3/4/6/7, Topic-Zuordnung, CTF-Adresse/Topics).
Gesamt 137 Tests gruen. Build/Smoke gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ziel (Richard): vor den CLOB-Eingriffen ein umfangreiches Testnetz, damit künftige
Änderungen keine neuen Fehler einschleusen. Reiner, verhaltensneutraler Umbau –
alte Version liegt als Rollback in Git (Commit 38f609e), siehe .agents/rules/clob.md.
- Neue pure Klasse CopyTradingRisk (Logic/): CalculateBuyOrderPrice (HF-fest /
prozentual, gedeckelt durch MaxBuyPrice + harte 0.99), ResolveTimeBucket/
TimeLimitPct/TimeBucketLabel/IsPositionInBucket (Zeitfenster-Exposure),
MaxPerMarket (Markt-Budget inkl. Low-Balance-Bypass-Stufen).
- CopyTradingEngine BUY-Pfad ruft diese Funktionen jetzt statt Inline-Mathematik
(1:1-Semantik, dedupliziert die doppelte Order-Preis-Berechnung).
- CopyTradingRiskTests: 38 Fälle über alle Zweige/Grenzwerte (HF vs. normal,
MaxBuy-/0.99-Deckel, Bucket-Grenzen 6/24/72h, null/expired Expiry,
Balance-Stufen 150/500). Gesamt 124 Tests grün.
Fix: PreRedeemLimit-Skalen-Korrektur (Migration FixPreRedeemLimitScale): Alt-Werte
> 1 (z. B. 99.5) werden /100 (0.995); 0 bleibt deaktiviert. Auf MySQL angewendet.
Build/Smoke grün.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Umsetzung des Fable-Plans, Start mit dem risikoarmen Settings-Fundament
(kein Hot-Path/CLOB-Verhalten geändert):
- Alle Copytrading-Settings (alt + neu) haben jetzt [Description]/[DisplayName] ->
im PropertyGrid als Erklärung sichtbar (Richards Vorgabe). Test erzwingt, dass
jede einstellbare Option eine Beschreibung trägt.
- ProfitTarget-Default -> 9999 (praktisch deaktiviert); Migration setzt zusätzlich
bestehende Zeilen per SQL auf 9999 (Entscheidung 2). Take-Profit-LOGIK folgt.
- Neue Account-Settings (noch nicht verdrahtet, für Phase 0.1/1.3/2):
SellFloorPct (15), MaxSpreadPct (5), MinSellRatioPct (10).
- Neue Master-Trader-Settings: AutoPauseEnabled (Default AN, per Master abschaltbar,
Entscheidung 3) + MakerEntry (Default aus, Entscheidung 4).
- EF-Migration AddCopytradingBehaviorSettings (neue Spalten + sinnvolle Defaults
fuer Bestandszeilen) erstellt und auf MySQL angewendet.
- Erklärung dokumentiert einen gefundenen Skalen-Verdacht: PreRedeemLimit wird
gegen den 0-1-Preis verglichen; Alt-Werte 99.5 triggern nie (-> ggf. 0.995).
Tests: 86 gruen. Build/Smoke gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- MasterTraderAnalyticsJob + PersistenceService von services/ nach
src/PolyTrader.Modules.CopyTrading/Services/ verschoben und in
CopyTradingModule.RegisterServices registriert (reiner Move). Beide sind
copytrading-spezifisch (Master-Trader-Historie bzw. Persistenz der
geschlossenen Copytrades ueber den Modul-Channel; Dual-Write in Core-Log bleibt).
- Program.cs: die zwei Hosted-Service-Registrierungen entfernt.
- appsettings.json: Logging-Sektion ergaenzt -> EF-Core-Command-Logging auf
Warning (kein SQL-Spam mehr; --smoke-ui zeigt 0 "Executed DbCommand"-Zeilen).
Damit liegt die gesamte Copytrading-Logik im Modul; App/Core enthalten nur noch
generische Infrastruktur + Startup-Hydration + CLI-Tools.
Build gruen, 48 Tests gruen, --smoke-ui gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Beide Listener sind copytrading-spezifisch (überwachen die getrackten Master-
Trader bzw. Auto-Redeem nach Copytrading-Settings) und werden jetzt vom Modul
besessen statt von der App. Reiner Move, keine Logikänderung.
- services/AlchemyWebsocketService.cs + services/PolymarketWssClient.cs
-> src/PolyTrader.Modules.CopyTrading/Services/ (Namespace bleibt transitional).
- CopyTradingModule.RegisterServices registriert nun beide Hosted Services sowie
IBlockchainWssClientFactory->AlchemyWssClientFactory (Core-WSS-Infra, nur vom
Copytrading-Blockchain-Listener genutzt).
- Program.cs: die drei Registrierungen entfernt (WSS-Factory + 2 Hosted Services)
+ ungenutztes using PolyTrader.Core.Streaming.
- WSS-Verbindungsinfrastruktur (AlchemyWssClient/BlockchainWss) bleibt in Core.
DI-Auflösung unverändert (gleicher Container). Build grün, --smoke-ui grün.
Laufzeit-Verifikation der WSS-Verbindungen: Server-Test.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Konsistent zum Master-Trader-Tab bekommen die beiden anderen Tabs eine ToolStrip
mit ihren Aktions-Buttons:
- ClosedTradesView: ToolStrip mit "Aktualisieren"; Kurzauswertung wandert in eine
untere Statusleiste (lblSummary).
- AccountSettingsView: ToolStrip mit Account-Auswahl (ToolStripComboBox) +
"Speichern"; Hinweistext in untere Statusleiste (lblHint).
- Beide bleiben Designer-basiert (Size statt ClientSize, da UserControl).
Hinweis: Separate Einzelview-Registrierungen existieren nicht mehr (bereits in
c3d7e41 auf die eine View copytrading.main konsolidiert); die drei UserControls
sind ausschliesslich Tab-Inhalte.
Verifiziert: Build gruen, --smoke-ui gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>