Der Status des Projekts stand verstreut in elf Umsetzungsplaenen, drei Konzepten, der Linux-Analyse und dem Projektstand - teils widersprechend, teils wochenlang veraltet. Ab jetzt gibt es genau eine Statusquelle. docs/ROADMAP.md (neu): - Alle Vorhaben in vier Stufen A bis D, plus technische Schuld und Verlauf. Die Stufen sind eine Reihenfolge, keine Termine: jede schafft die Voraussetzung fuer die naechste. - Statuszeichen: erledigt / offen / blockiert (mit Ursache) / bewusst zurueckgestellt / Idee, nicht beschlossen. Damit ist das, was wir NICHT bauen wollen, sichtbar vorgehalten statt unauffindbar in einem Plan zu schlummern. - Inhaltlich getragen, nicht nur verlinkt: je Vorhaben Ziel, Phasen, Akzeptanzkriterien, offene Entscheidungen und Leitplanken aus den Quelldokumenten. - Sichtbar gemacht, was vorher zwischen den Dokumenten verborgen lag: CopyTrading Phase 1 ist der Engpass der gesamten Roadmap (MarketMaking und BundleArbitrage haben harte Voraussetzungen darauf), und die Sniper-Metriken aus Phase 3.2 sind ein Spezialfall des StrategieDrift-Fingerprints - zusammen bauen statt doppelt. Archiv (docs/archiv/): - 15 Dokumente verschoben (11 Umsetzungsplaene, 3 Konzepte, ANALYSE-Linux-Portierung). Sie bleiben die Bauanleitungen mit Code-Bezuegen, Risikotabellen und Begruendungen - eingefroren ist nur ihr Status. - archiv/README.md ordnet jedes Dokument seinem Roadmap-Punkt zu. Verweise nachgezogen - der eigentliche Aufwand: - 25 Markdown-Links repariert. 15 davon verschiebungsbedingt (eine Ebene tiefer), der Rest war schon vorher falsch: die Ideensammlung verlinkte Quellcode relativ zum Repo-Wurzelverzeichnis statt zu docs/. - 12 Dateien ausserhalb von docs/ verwiesen in Kommentaren auf die Plaene (csproj, props, setup.json, sechs Quelldateien) - alle auf archiv/ umgebogen. - Verweise auf Dateien, die der Fruehjahrsputz geloescht hat (Ui/, Program.cs, WindowMenuBar), zu Klartext entschaerft statt tote Links zu lassen. - Gegenprobe: 85 Links geprueft, 0 kaputt. Build gruen, 476 Tests gruen. PROJEKTSTAND.md entdoppelt: Abschnitt "Offen" verweist jetzt auf die Roadmap. Arbeitsteilung ist damit klar - Projektstand sagt was IST, Roadmap was KOMMT. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
22 KiB
Umsetzungsplan: Modularisierung PolyTraderSharp
Stand: 22.08.2026 — Ziel erreicht, Plan weitgehend abgearbeitet. Ursprünglicher Plan vom 01.07.2026. Ziel war der Umbau des monolithischen WinForms-Copytraders in ein modulares System mit schlankem Core und unabhängigen Modulen. Erstes Modul: Copytrading.
Was daraus geworden ist: Der Core steht, und es sind vier Module entstanden — CopyTrading, ResolutionFarming, Supervisor und Accounting. Die Phasen 0–6 sind abgeschlossen, der WinForms-Monolith ist am 22.08.2026 vollständig aus dem Repo entfernt. Offen sind nur noch zwei bewusst zurückgestellte Nacharbeiten aus Phase 7.
⚠️ Die Phasen 3–6 waren bis zum 22.08.2026 fälschlich als „IN ARBEIT" bzw. offen markiert — die Arbeit war längst getan, der Plan wurde nur nicht mitgezogen. Die Häkchen unten sind am Code nachgeprüft, nicht aus der Erinnerung gesetzt.
1. Leitprinzipien
- Core kennt keine Module. Der Core stellt nur Basis-Infrastruktur bereit (Host, DB/Persistenz, Settings, Jobs, Logging, API-Clients, Benachrichtigungen, Modul-Contract). Er hat keine Referenz auf irgendein Modul.
- Module hängen nicht voneinander ab. Jedes Modul referenziert nur den Core. Ein Modul kennt kein anderes Modul. Dies wird durch getrennte Projekte zur Compile-Zeit erzwungen.
- Jede Phase lässt die App lauffähig und baubar zurück. Kein „Big Bang". Nach jeder Phase: Debug-Build grün, App startet, Copytrading funktioniert.
- WinForms bleibt. Die GUI-Anforderung ist fix. Module tragen ihre eigenen UI-Tabs zur Shell bei.
- Sicherheit vor Geschwindigkeit beim Refactoring. CLOB-Integration ist
hochkritisch (siehe
.agents/rules/clob.md) – bei Berührung besonders sorgfältig, jede Änderung mehrfach prüfen. Rollback jederzeit über Git möglich.
2. Zielarchitektur
2.1 Solution-Struktur (Multi-Projekt)
PolyTraderSharp.sln
│
├── PolyTrader.Core (Class Library, net8.0-windows)
│ • Generic Host / Bootstrap-Infrastruktur
│ • Persistenz: Repository-Interfaces + Implementierung (EF Core)
│ • Settings (appsettings.json + IOptions) + Core-Settings-Sektion
│ • JobManager, Logging (TerminalLogger / ILogger-Sink)
│ • Polymarket-Infrastruktur: PolymarketApiService, PolymarketClobClient,
│ PolymarketWssClient, AlchemyWebsocketService
│ • Querschnitt: MullvadVpnService, ThreemaService
│ • Eigene Trading-Accounts (AccountState) — die Konten, mit denen WIR traden
│ • Generischer Trade-Log (modulübergreifend auswertbar)
│ • Gesamt-Dashboard (Overview über alle Module)
│ • Core-State (generisch): MarketCache, globale Betriebsschalter
│ • IPolyTraderModule-Contract + Modul-Registry
│
├── PolyTrader.Modules.CopyTrading (Class Library, net8.0-windows)
│ • TraderMonitorService (Signalquelle)
│ • CopyTradingEngine (Ausführung)
│ • MasterTraderAnalyticsJob, TraderAnalyticsJob
│ • Models: TrackedTrader (kopierte Master-Trader), CopySignal,
│ CopyTradeRecord, TraderAnalyticsResult, MasterTraderHistoryRecord
│ • Copytrading-State: Traders (Master), MasterTraderPositions,
│ PendingOrderTimestamps, TraderAnalyticsCache
│ • Channels: CopySignal, ClosedTrade
│ • Eigener Copytrading-Trade-Log (Detail-Auswertung kopierter Trades,
│ zusätzlich zum generischen Core-Log)
│ • Eigene UI-Tabs (Master/Slave-Verwaltung, Modul-Analyse, Closed Trades)
│ • Eigene Modul-Settings-Sektion
│ • CopyTradingModule : IPolyTraderModule
│
├── PolyTrader.App (WinForms .exe, net8.0-windows)
│ • Program.cs: Host-Bootstrap, lädt Core + registrierte Module
│ • Shell-Form (frm_main reduziert auf Rahmen: Terminal, Jobs, Settings-Tab)
│ • Referenziert Core + alle aktiven Module
│
└── PolyTrader.Tests (xUnit, optional — spätere Phase)
• Risk-/Entscheidungslogik des Copytrading-Moduls
2.2 Modul-Contract (Entwurf)
public interface IPolyTraderModule
{
string Name { get; } // "CopyTrading"
string DbPrefix { get; } // Namespace für DB-Objekte, z.B. "ct_"
void RegisterServices(IServiceCollection services, IConfiguration config);
void RegisterUi(IModuleUiHost uiHost); // Modul hängt seine Tabs ein
Task StartAsync(CancellationToken ct); // läuft NACH Core-Hydration
Task StopAsync(CancellationToken ct);
}
- Discovery: Die App registriert Module explizit in
Program.cs(services.AddPolyTraderModule<CopyTradingModule>()). Kein Runtime-Assembly-Scanning (bewusst einfach gehalten; kann später zum Plugin-System ausgebaut werden). - Feature-/Lizenz-Gating:
IPolyTraderModuleist die natürliche Schnittstelle, um Module später per Lizenz zu aktivieren/deaktivieren (vgl.lizenssystem.md).
2.3 State-Aufteilung
TradingState wird zerlegt:
| Feld | Ziel |
|---|---|
MarketCache |
Core (generischer Markt-Cache) |
GlobalTradingPaused, LiveTradingMode, DemoTradingMode |
Core (globale Betriebsschalter) |
Accounts (unsere eigenen Trading-Accounts, AccountState) |
Core — die Konten, mit denen WIR traden; modulübergreifend nutzbar |
Traders (kopierte Master-Trader, TrackedTrader) |
CopyTrading-Modul |
MasterTraderPositions, PendingOrderTimestamps, TraderAnalyticsCache, TotalCopyTrades, GlobalPnl |
CopyTrading-Modul |
Entschieden (2026-07-01): Eigene Trading-Accounts liegen im Core (auch künftige Module handeln über dieselben Konten). Die kopierten Master-Trader (
TrackedTrader) sind ein Copytrading-Konzept und liegen im Modul.
2.4 Trade-Logging (zweistufig)
Zwei unabhängige, parallel geführte Logs:
- Generischer Core-Trade-Log (
TradeRecord+ITradeLogRepository): modulneutrale Felder (ModulName, AccountId, Markt, Side, Entry/Exit, PnL, Zeiten, ExitReason). Ermöglicht die modulübergreifende Gesamtauswertung. Jedes Modul, das Trades ausführt, schreibt hier einen Eintrag. - Copytrading-spezifischer Log (
CopyTradeRecord, im Modul): erweitert die generischen Felder um Copytrading-Details (SourceTraderId,SourceTraderName, Master-Adresse, Signal-Herkunft) für die detaillierte Copytrading-Analyse.
Beim Schließen eines kopierten Trades schreibt das Modul beides: einen generischen Eintrag in den Core-Log und einen Detaileintrag in seinen eigenen Log.
2.5 Dashboard & Analyse
- Core-Gesamt-Dashboard: Overview über alle Module (aggregierte PnL, Kontostände, offene Positionen, grobe Kennzahlen je Modul) — gespeist aus dem generischen Core-Log.
- Modul-Analyse: Jedes Modul liefert seine eigene Detailansicht (Copytrading: Trader-Winrates, kopierte Trades, Master-Performance) — gespeist aus dem Modul-Log.
2.6 Settings
- Core-Settings-Sektion: globale/Infrastruktur-Einstellungen (DB, VPN, Threema, Betriebsschalter).
- Modul-Settings-Sektion: jedes Modul trägt seine eigene Sektion zum Settings-Tab bei
(analog zu den UI-Tabs), registriert über den
IPolyTraderModule-Contract. - API-Keys sind Modul-Settings: Alchemy-/Polymarket-WSS-Keys wandern von der globalen
ServerSettingsin die jeweilige Modul-Settings-Sektion (siehe 2.7).
2.7 Streaming / WebSocket-Architektur (Entscheidung 2026-07-01)
Prinzip: Der Core stellt die WSS-Verbindungs-Klasse als wiederverwendbare Fähigkeit bereit — keinen geteilten Singleton-Stream. Jedes Modul erzeugt seine eigene Instanz mit eigenem API-Key und eigenem Filter.
Begründung: Blockchain-/WSS-Streams werden modulspezifisch gefiltert (sonst viel zu umfangreich). Ein einzelner, Core-gesteuerter Stream, auf den mehrere Module gleichzeitig zugreifen, wäre für jedes einzelne Modul mit nutzlosen Informationen geflutet.
Aufteilung des heutigen AlchemyWebsocketService:
- Core (
PolyTrader.Core.Streaming): Verbindungs-Mechanik —ClientWebSocket,eth_subscribe, Empfangs-Loop, Decode, Reconnect/429-Backoff, Health. Parametrisiert über eineBlockchainWssSubscription(Contract, Topics, Adress-Filter) + RPC-URL/Key. Als Factory (IBlockchainWssClientFactory.Create()), damit jedes Modul eine eigene Instanz bekommt. - Modul (
CopyTrading):CopyTradingBlockchainListener : BackgroundService, der eine Core-WSS-Instanz mit dem Copytrading-Filter (Wallets der getrackten Master-Trader) + dem Modul-eigenen Alchemy-Key betreibt, den gefilterten Substream konsumiert und selbst reagiert (TraderMonitor-Poll, Re-Subscribe bei Trader-Listen-Änderung).
Analog für den Polymarket-User/Market-WSS (PolymarketWssClient → Core-Verbindungsklasse +
Modul-Listener). IsAlchemyHealthy (heute im Core-State) wird zum Health-Signal der jeweiligen
Modul-Instanz.
3. Persistenz-Strategie
- Zielrichtung: Wechsel auf MySQL via EF Core + Pomelo.EntityFrameworkCore.MySql, gekapselt hinter Repository-Interfaces im Core.
- Begründung: DB liegt off-hot-path (Live-Pfad ist RAM-only) → kein Performance-Nachteil. Gewinn: saubere relationale Tabellen statt Collection-per-Account + Shim, ACID, EF-Migrations, Standard-Backups.
- Risikoarm durch Reihenfolge: Zuerst Repository-Abstraktion einziehen (Phase 3), MySQL-Umstieg als eigene späte Phase (Phase 6). Die Modularisierung ist davon entkoppelt und nicht blockiert.
- Aufräumen: LiteDB-Paket,
data.dbundMongoDbLiteDBShimentfallen nach der Migration. - ORM: Entity Framework Core (entschieden) — Migrations + wenig Boilerplate.
4. Phasenplan
Jede Phase endet mit grünem Debug-Build + lauffähiger App + Git-Commit.
Phase 0 — Fundament: Versionskontrolle & Aufräumen (ABGESCHLOSSEN 2026-07-01)
git init(Branchmain),.gitignore(bin/, obj/, .vs/, *.user, *.db, server_settings.xml, agentspace/antigravity/, .claude/settings.local.json).- Alle 11
.bak*-Dateien entfernt (per-fim Baseline-Commit475d396archiviert, danach entfernt → rekonstruierbar). - Tote Stubs entfernt:
services/database.cs,services/settings.cs,polymarket/*.cs. - Threema-Lib unter
libs/vendored (nested.gitentfernt). - Baseline-Commit
475d396+ Cleanup-Commitf76ad73; Debug-Build 0 Fehler verifiziert.
Phase 1 — Multi-Projekt-Gerüst anlegen (ABGESCHLOSSEN 2026-07-01, Commit 4f130ff)
- Drei Projekte:
PolyTrader.App(umbenanntes WinForms-Projekt, Root),src/PolyTrader.Core,src/PolyTrader.Modules.CopyTrading(net8.0-windows). - Referenzen: App → Core + CopyTrading; CopyTrading → Core; Core → nichts.
- App-csproj:
src\**vom Globbing ausgeschlossen (keine Glob-Kollision); RootNamespace aufPolyTraderSharpgepinnt (schützt .resx/Namespaces). - Threema-Lib-Referenz bleibt im App-Projekt (wandert in Phase 4 zu Bedarf in Core).
- Ergebnis: Solution-Build 0 Fehler, Code liegt weiterhin im App-Projekt.
- Offen für spätere Phasen: NuGet-Pakete beim Code-Umzug auf Core/Modul verteilen.
Phase 2 — Konfiguration externalisieren (ABGESCHLOSSEN 2026-07-01, Commit e312fbb)
appsettings.jsoneingeführt (Mongo-Connection + DB-Name), Copy-to-Output.DatabaseOptionsim Core, viaIOptions<T>gebunden; hart codierte Strings ausProgram.csentfernt.- Startup-Cleanup-Hack aus
Main()entfernt und gekapselt nach Host-Build über die konfigurierte DB neu verankert. - Offen (bewusst später): Alchemy-Key / Mullvad-Account / Threema bleiben vorerst
im GUI-editierbaren
server_settings.xml(kein Konflikt mit Settings-Tab).
Phase 3 — Persistenz-Abstraktion (ABGESCHLOSSEN — nachgetragen 22.08.2026)
- 3a (
8b3264f): Core-ModelleAccountState/Position/MarketDatain den Core verschoben (NamespacePolyTraderSharp.Modelsbeibehalten), MongoDB.Driver-Paket im Core. - 3b (
ed5d6e3): Repository-Interfaces + Mongo-Implementierungen im Core (IAccountRepository,IMarketRepository,IPositionRepository),AddCorePersistence(). - 3c (
7197f9b): Unkritische Call-Sites migriert (MarketSyncService, PolymarketWssClient). - 3d — Hot-Path (
a0e367e,0c6fc6a): TraderMonitorService + CopyTradingEngine aufIPositionRepository/IMarketRepository/IAccountRepositoryumgestellt._dbaus CopyTradingEngine komplett entfernt; Verhalten unverändert. - frm_main-UI: erledigt —
frm_mainexistiert nicht mehr (Avalonia-Portierung, Rest mit dem WinForms-Ausbau am 22.08.2026 gelöscht). - Generisches
ITradeLogRepository(Core) +ICopyTradeLogRepository+ITrackedTraderRepository(Modul) sind gebaut und in Gebrauch. - Ergebnis erreicht: Kein direkter DB-Zugriff mehr außerhalb der Repository-Schicht.
Phase 4 — Core herauslösen (ABGESCHLOSSEN — nachgetragen 22.08.2026)
- 4.1 (
9039af8): TerminalLogger, JobManager, JobStatusRow → Core; toten Stublogging.csgelöscht. - 4.2 (
eebe992): PolymarketClobClient → Core (+ Nethereum.Web3), reines Verschieben. - 4.3 (
8c126cd): ServerSettings → Core. - 4.4 (
a1ce3fc):IPolyTraderModule-Contract im Core (UI-Teil auf Phase 5 vertagt). - 4.5 (
c88eac5): Startup-Reihenfolge-Fix —StartupHydrationService(IHostedService, als erster registriert) hydriert Accounts/Trader vor den Trading-Services;frm_main.LoadDatabaseAndStateentfernt. - 4.6a (
9c068b4): CopySignal + PolymarketApiService → Core. - 4.7 (
0ffc041): MullvadVpnService + ThreemaService (+ Threema-Lib-Ref) → Core; toter Stubmullvad.csgelöscht. - Ehemals blockiert durch den TradingState-Split: aufgelöst.
MarketSyncServiceund die Streaming-Infrastruktur liegen im Core (src/PolyTrader.Core/Streaming/);PolymarketWssClientist bewusst im CopyTrading-Modul geblieben, weil er modulspezifisch filtert. - Ergebnis: Core baut eigenständig und enthält jetzt: Modelle (Account/Position/ Market/CopySignal/JobStatusRow/ServerSettings), Repository-Schicht, Config, Logging, JobManager, CLOB-Client, API-Service, Mullvad, Threema, IPolyTraderModule.
Stand nach Phase 4: Der Core ist substanziell und eigenständig. Was noch in der App liegt:
Modul-Services (TraderMonitor, CopyTradingEngine, Analytics-Jobs), die TradingState-abhängige
Infra (MarketSync, Alchemy, WSS, Snapshot), PersistenceService, StartupHydrationService,
der Shim, TradingState, frm_main und die Modul-Modelle (TrackedTrader, TraderAnalyticsResult,
MasterTraderHistoryRecord, ClosedTrade, DashboardRow). Der TradingState-Split ist der
Dreh- und Angelpunkt für Phase 5.
Entscheidung (2026-07-01):
CopySignalwird ein Core-Typ (generisches Markt-Trade- Signal). Das entkoppelt die Polymarket-Infrastruktur sauber in den Core. Der Channel/Workflow bleibt Copytrading. Umbenennung zuTradeSignaloptional/später.
Phase 5 — CopyTrading-Modul herauslösen (ABGESCHLOSSEN — nachgetragen 22.08.2026)
- 5.1 (
55050a1): Modul-Modelle (TrackedTrader, TraderAnalyticsResult, MasterTraderHistoryRecord) ins Modul verschoben. - 5.2 (
f8d395b): TradingState-Split — CoreTradingState(globale Schalter, Accounts, MarketCache, GlobalPnl) vs.CopyTradingStateim Modul (Traders, MasterTraderPositions, TraderAnalyticsCache, TotalCopyTrades, PendingOrderTimestamps, SixSharesMinimum); 10 Konsumenten umgestellt. Modulgrenze auf State-Ebene gezogen. - 5.3a (
f5e7eaf): MarketSyncService → Core (nur Core-State). - 5.3-WSS 1/2 (
3be75c0): Core-WSS-Verbindungsklasse extrahiert (IBlockchainWssClient+ Factory + Modelle inPolyTrader.Core.Streaming);AlchemyWebsocketServicenutzt sie via Factory. Verhaltensneutral. - ClosedTrade-Migration (
88fc982):ClosedTrade→ Modul,ICopyTradeLogRepository(+ Mongo-Impl) im Modul;closed_trades-Zugriffe der Services (TraderMonitor, Persistence, WSS, TraderAnalytics) auf das Repo umgestellt. TraderMonitor nutzt kein_dbmehr. frm_main/Program.cs bleiben auf_db. - 5.3b: erledigt —
TraderMonitorService,CopyTradingEngine,TraderAnalyticsJob,MasterTraderAnalyticsJobundPersistenceServiceliegen untersrc/PolyTrader.Modules.CopyTrading/Services/. - 5.3-WSS 2/2: erledigt —
PolymarketWssClientliegt im Modul, die generische Verbindungsschicht (IBlockchainWssClient+ Factory) im Core. - UI-Trennung (Launcher-Modell, entschieden 2026-07-01): Hauptfenster = schlanke
Startleiste; jede Ansicht öffnet als eigenständiges Fenster. Module liefern designbare
UserControls viaIPolyTraderModule.RegisterUi/IModuleUiHost.frm_mainbleibt übergangsweise als „Legacy-UI" per Button erreichbar, bis alle Views extrahiert sind.- UI-Contract im Core (
IModuleUiHost,ModuleView,RegisterUi) —26dd68a. - Proof-of-Pattern:
LauncherForm+ViewHostForm+ShellUiHost+ erste ViewTerminalView(designbar); App startet Launcher —3503bbb. - Alle Views extrahiert. Das Launcher-Modell wurde inzwischen selbst wieder abgelöst:
seit dem UI-Redesign gibt es eine Shell mit Seitenleiste
(
src/PolyTrader.App.Avalonia/Views/ShellWindow.axaml) statt vieler Einzelfenster. frm_main(Legacy) entfernt.
- UI-Contract im Core (
CopyTradingModule : IPolyTraderModuleist implementiert — ebensoResolutionFarmingModule,SupervisorModuleundAccountingModule.- Dualer Trade-Log verdrahtet (Core-Log + Copytrading-Log).
- Collection-Namensbug (
tradersvs.trackers) mit der MySQL-Migration hinfällig — relationale Tabellen mit festem Schema statt Mongo-Collections. - Ergebnis erreicht: Copytrading ist ein eigenständiges, entfernbares Modul; drei weitere Module sind nach demselben Muster entstanden.
Phase 6 — MySQL-Migration (ABGESCHLOSSEN — nachgetragen 22.08.2026)
- EF Core + Pomelo eingerichtet, relationales Schema modelliert; Tabellen mit den Präfixen
core_undmod_, Migrationen je Projekt unterPersistence/Ef/Migrations/. - Repository-Implementierungen auf EF Core hinter den bestehenden Interfaces.
- Migration der Altdaten über die CLI-Schalter
--migrate-jsonund--verify-mysql(statt eines Skripts inagentspace/scripts). - Mongo vollständig entfernt: kein
MongoDB.Driver- oderLiteDB-Paket mehr in irgendeiner.csproj, kein Shim.data.dbund dieMongoDB/-Exporte sind am 22.08.2026 auch lokal gelöscht worden.
Phase 7 — Nacharbeiten (teilweise erledigt — Stand 22.08.2026)
- Test-Projekt: Risk-/Entscheidungslogik als reine Funktionen extrahiert und getestet — 476 Tests grün.
- Leere
catch {}beseitigt — insrc/findet sich kein einziger leerer Catch-Block mehr. - Secrets-Verschlüsselung umgesetzt, allerdings nicht mit DPAPI: DPAPI ist Windows-only und
hätte die Linux-Portierung blockiert. Stattdessen AES-GCM at-rest über
Security/SecretProtection.cs+EncryptedStringConverter, Schlüssel ausPOLYTRADER_MASTER_KEY(sieheSecurity/MasterKeyResolver.cs). - Offen: God-Methoden splitten (
PollLiveAccountsAsync,ProcessAccountOrderAsync); duplizierte Closed-Trade-Erzeugung zentralisieren. - Offen:
TerminalLoggeraufMicrosoft.Extensions.Logging+ UI-Sink umstellen. Hängt mit dem Zeitzonen-Punkt zusammen (Abschnitt C im Avalonia-Leitfaden): der Logger stempelt mitDateTime.Nowstatt der konfiguriertenAppTimeZone.
5. Datei-→-Ziel-Zuordnung (Referenz)
| Aktuell | Ziel |
|---|---|
Program.cs |
PolyTrader.App |
frm_main.* |
PolyTrader.App (Shell) + Copytrading-Tabs → Modul |
frm_analytics.* |
PolyTrader.Modules.CopyTrading |
TradingState.cs |
aufgeteilt: Core + Modul |
services/PolymarketApiService.cs |
Core |
services/PolymarketClobClient.cs |
Core |
services/PolymarketWssClient.cs |
Core |
services/AlchemyWebsocketService.cs |
Core |
services/MullvadVpnService.cs, mullvad.cs |
Core |
services/ThreemaService.cs |
Core |
services/JobManager.cs, TerminalLogger.cs, logging.cs |
Core |
services/PersistenceService.cs |
Core (generischer Trade-Log-Writer); Copytrading-Detail-Writer → Modul |
services/MarketSyncService.cs, SnapshotService.cs |
Core |
Extensions/MongoDbLiteDBShim.cs |
Core (temporär), entfällt in Phase 6 |
services/CopyTradingEngine.cs |
Modul |
services/TraderMonitorService.cs |
Modul |
services/MasterTraderAnalyticsJob.cs, TraderAnalyticsJob.cs |
Modul |
Models/AccountState.cs, Position.cs, MarketData.cs, ServerSettings.cs, JobStatusRow.cs, DashboardRow.cs |
Core |
Models/ClosedTrade.cs |
aufgeteilt: generischer TradeRecord → Core, CopyTradeRecord (mit SourceTrader-Feldern) → Modul |
Models/TrackedTrader.cs, CopySignal.cs, TraderAnalyticsResult.cs, MasterTraderHistoryRecord.cs |
Modul |
services/database.cs, settings.cs, polymarket/*.cs |
löschen (Phase 0) |
*.bak* |
löschen (Phase 0) |
6. Getroffene Entscheidungen (2026-07-01)
- Eigene Trading-Accounts → Core, kopierte Master-Trader → Copytrading-Modul.
- Zweistufiges Trade-Logging: generischer Core-Log (modulübergreifend) und zusätzlicher Copytrading-Detail-Log im Modul (siehe 2.4).
- ORM: Entity Framework Core.
- Dashboard: Core liefert Gesamt-Overview über alle Module; Module liefern eigene Detail-Analysen (siehe 2.5).
- Settings: getrennte Core- und Modul-Settings-Sektionen (siehe 2.6).
7. Risiken & Gegenmaßnahmen
- CLOB-Regression: Höchstes Risiko. Gegenmaßnahme: CLOB-Client möglichst unverändert in den Core verschieben (nur Namespace/Referenzen), keine Logikänderung in der Umstrukturierungsphase.
- Startup-Race weiterhin aktiv, bis Phase 4: Bis der Startup-Fix greift, bleibt das bestehende Verhalten – kein neues Risiko, aber früh angehen.
- Datenmigration (Phase 6): Server läuft produktiv. Migration mit Read-Only-Export + Verifikation vor Umschaltung; Rollback-Pfad (Mongo bleibt bis Verifikation bestehen).