docs/PROJEKTSTAND.md neu: Einstiegsdokument mit Gesamtueberblick - Architektur, Modul-Stand, was abgeschlossen ist und was offen. Alle Angaben am Code nachgeprueft, nicht aus den Plandokumenten uebernommen. Die offenen Punkte sind danach getrennt, ob sie am Schreibtisch erledigt werden koennen oder echtes Geld/den Zielserver brauchen - das war vorher nirgends zusammengefasst. Modularisierungsplan korrigiert: Die Phasen 3 bis 6 standen auf "IN ARBEIT" beziehungsweise offen, obwohl die Arbeit seit Wochen getan war. Nachgeprueft und abgehakt sind unter anderem: - Phase 5: alle Modul-Services liegen im Modulprojekt, frm_main ist weg, alle vier Module implementieren IPolyTraderModule - Phase 6: komplett - kein MongoDB.Driver/LiteDB mehr in irgendeiner csproj - Phase 7 teilweise: 476 Tests, keine leeren catch-Bloecke mehr, Secrets-Verschluesselung umgesetzt (AES-GCM statt DPAPI, da DPAPI Windows-only ist und die Linux-Portierung blockiert haette) Offen bleiben aus Phase 7 nur God-Methoden und die TerminalLogger-Umstellung. Beim Nachpruefen aufgefallen: Accounting A-3 (US-Steuerschicht, Form 8949) ist entgegen der bisherigen Annahme nicht gebaut - es gibt keinen UsTaxEngine. A-2 und A-4 dagegen sind da. Im Projektstand vermerkt. docs/README.md verweist jetzt auf den Projektstand und fuehrt die bisher fehlenden Ordner sicherheit/ und den Deploymentcenter-Plan auf. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
381 lines
22 KiB
Markdown
381 lines
22 KiB
Markdown
# 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
|
||
|
||
1. **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.
|
||
2. **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**.
|
||
3. **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.
|
||
4. **WinForms bleibt.** Die GUI-Anforderung ist fix. Module tragen ihre eigenen
|
||
UI-Tabs zur Shell bei.
|
||
5. **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)
|
||
|
||
```csharp
|
||
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:** `IPolyTraderModule` ist 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:
|
||
|
||
1. **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.
|
||
2. **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
|
||
`ServerSettings` in 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 eine
|
||
`BlockchainWssSubscription` (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.db` und `MongoDbLiteDBShim` entfallen 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)*
|
||
- [x] `git init` (Branch `main`), `.gitignore` (bin/, obj/, .vs/, *.user, *.db, server_settings.xml, agentspace/antigravity/, .claude/settings.local.json).
|
||
- [x] Alle 11 `.bak*`-Dateien entfernt (per `-f` im Baseline-Commit `475d396` archiviert, danach entfernt → rekonstruierbar).
|
||
- [x] Tote Stubs entfernt: `services/database.cs`, `services/settings.cs`, `polymarket/*.cs`.
|
||
- [x] Threema-Lib unter `libs/` vendored (nested `.git` entfernt).
|
||
- [x] Baseline-Commit `475d396` + Cleanup-Commit `f76ad73`; Debug-Build 0 Fehler verifiziert.
|
||
|
||
### Phase 1 — Multi-Projekt-Gerüst anlegen *(ABGESCHLOSSEN 2026-07-01, Commit `4f130ff`)*
|
||
- [x] Drei Projekte: `PolyTrader.App` (umbenanntes WinForms-Projekt, Root),
|
||
`src/PolyTrader.Core`, `src/PolyTrader.Modules.CopyTrading` (net8.0-windows).
|
||
- [x] Referenzen: App → Core + CopyTrading; CopyTrading → Core; Core → nichts.
|
||
- [x] App-csproj: `src\**` vom Globbing ausgeschlossen (keine Glob-Kollision);
|
||
RootNamespace auf `PolyTraderSharp` gepinnt (schützt .resx/Namespaces).
|
||
- [x] Threema-Lib-Referenz bleibt im App-Projekt (wandert in Phase 4 zu Bedarf in Core).
|
||
- [x] **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`)*
|
||
- [x] `appsettings.json` eingeführt (Mongo-Connection + DB-Name), Copy-to-Output.
|
||
- [x] `DatabaseOptions` im Core, via `IOptions<T>` gebunden; hart codierte Strings
|
||
aus `Program.cs` entfernt.
|
||
- [x] 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)*
|
||
- [x] **3a** (`8b3264f`): Core-Modelle `AccountState`/`Position`/`MarketData` in den Core
|
||
verschoben (Namespace `PolyTraderSharp.Models` beibehalten), MongoDB.Driver-Paket im Core.
|
||
- [x] **3b** (`ed5d6e3`): Repository-Interfaces + Mongo-Implementierungen im Core
|
||
(`IAccountRepository`, `IMarketRepository`, `IPositionRepository`), `AddCorePersistence()`.
|
||
- [x] **3c** (`7197f9b`): Unkritische Call-Sites migriert (MarketSyncService, PolymarketWssClient).
|
||
- [x] **3d — Hot-Path** (`a0e367e`, `0c6fc6a`): TraderMonitorService + CopyTradingEngine
|
||
auf `IPositionRepository`/`IMarketRepository`/`IAccountRepository` umgestellt.
|
||
`_db` aus CopyTradingEngine komplett entfernt; Verhalten unverändert.
|
||
- [x] **frm_main-UI:** erledigt — `frm_main` existiert nicht mehr (Avalonia-Portierung,
|
||
Rest mit dem WinForms-Ausbau am 22.08.2026 gelöscht).
|
||
- [x] Generisches `ITradeLogRepository` (Core) + `ICopyTradeLogRepository` + `ITrackedTraderRepository`
|
||
(Modul) sind gebaut und in Gebrauch.
|
||
- [x] **Ergebnis erreicht:** Kein direkter DB-Zugriff mehr außerhalb der Repository-Schicht.
|
||
|
||
### Phase 4 — Core herauslösen *(ABGESCHLOSSEN — nachgetragen 22.08.2026)*
|
||
- [x] **4.1** (`9039af8`): TerminalLogger, JobManager, JobStatusRow → Core;
|
||
toten Stub `logging.cs` gelöscht.
|
||
- [x] **4.2** (`eebe992`): PolymarketClobClient → Core (+ Nethereum.Web3), reines Verschieben.
|
||
- [x] **4.3** (`8c126cd`): ServerSettings → Core.
|
||
- [x] **4.4** (`a1ce3fc`): `IPolyTraderModule`-Contract im Core (UI-Teil auf Phase 5 vertagt).
|
||
- [x] **4.5** (`c88eac5`): Startup-Reihenfolge-Fix — `StartupHydrationService` (IHostedService,
|
||
als erster registriert) hydriert Accounts/Trader vor den Trading-Services;
|
||
`frm_main.LoadDatabaseAndState` entfernt.
|
||
- [x] **4.6a** (`9c068b4`): CopySignal + PolymarketApiService → Core.
|
||
- [x] **4.7** (`0ffc041`): MullvadVpnService + ThreemaService (+ Threema-Lib-Ref) → Core;
|
||
toter Stub `mullvad.cs` gelöscht.
|
||
- [x] **Ehemals blockiert durch den TradingState-Split:** aufgelöst. `MarketSyncService` und die
|
||
Streaming-Infrastruktur liegen im Core (`src/PolyTrader.Core/Streaming/`); `PolymarketWssClient`
|
||
ist bewusst im CopyTrading-Modul geblieben, weil er modulspezifisch filtert.
|
||
- [x] **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):** `CopySignal` wird ein **Core**-Typ (generisches Markt-Trade-
|
||
> Signal). Das entkoppelt die Polymarket-Infrastruktur sauber in den Core. Der Channel/Workflow
|
||
> bleibt Copytrading. Umbenennung zu `TradeSignal` optional/später.
|
||
|
||
### Phase 5 — CopyTrading-Modul herauslösen *(ABGESCHLOSSEN — nachgetragen 22.08.2026)*
|
||
- [x] **5.1** (`55050a1`): Modul-Modelle (TrackedTrader, TraderAnalyticsResult,
|
||
MasterTraderHistoryRecord) ins Modul verschoben.
|
||
- [x] **5.2** (`f8d395b`): **TradingState-Split** — Core `TradingState` (globale Schalter,
|
||
Accounts, MarketCache, GlobalPnl) vs. `CopyTradingState` im Modul (Traders,
|
||
MasterTraderPositions, TraderAnalyticsCache, TotalCopyTrades, PendingOrderTimestamps,
|
||
SixSharesMinimum); 10 Konsumenten umgestellt. Modulgrenze auf State-Ebene gezogen.
|
||
- [x] **5.3a** (`f5e7eaf`): MarketSyncService → Core (nur Core-State).
|
||
- [x] **5.3-WSS 1/2** (`3be75c0`): Core-WSS-Verbindungsklasse extrahiert
|
||
(`IBlockchainWssClient` + Factory + Modelle in `PolyTrader.Core.Streaming`);
|
||
`AlchemyWebsocketService` nutzt sie via Factory. Verhaltensneutral.
|
||
- [x] **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
|
||
`_db` mehr. frm_main/Program.cs bleiben auf `_db`.
|
||
- [x] **5.3b:** erledigt — `TraderMonitorService`, `CopyTradingEngine`, `TraderAnalyticsJob`,
|
||
`MasterTraderAnalyticsJob` und `PersistenceService` liegen unter
|
||
`src/PolyTrader.Modules.CopyTrading/Services/`.
|
||
- [x] **5.3-WSS 2/2:** erledigt — `PolymarketWssClient` liegt 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
|
||
`UserControl`s via `IPolyTraderModule.RegisterUi` / `IModuleUiHost`. `frm_main` bleibt
|
||
übergangsweise als „Legacy-UI" per Button erreichbar, bis alle Views extrahiert sind.
|
||
- [x] UI-Contract im Core (`IModuleUiHost`, `ModuleView`, `RegisterUi`) — `26dd68a`.
|
||
- [x] Proof-of-Pattern: `LauncherForm` + `ViewHostForm` + `ShellUiHost` + erste View
|
||
`TerminalView` (designbar); App startet Launcher — `3503bbb`.
|
||
- [x] 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.
|
||
- [x] `frm_main` (Legacy) entfernt.
|
||
- [x] `CopyTradingModule : IPolyTraderModule` ist implementiert — ebenso
|
||
`ResolutionFarmingModule`, `SupervisorModule` und `AccountingModule`.
|
||
- [x] Dualer Trade-Log verdrahtet (Core-Log + Copytrading-Log).
|
||
- [x] Collection-Namensbug (`traders` vs. `trackers`) mit der MySQL-Migration hinfällig —
|
||
relationale Tabellen mit festem Schema statt Mongo-Collections.
|
||
- [x] **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)*
|
||
- [x] EF Core + Pomelo eingerichtet, relationales Schema modelliert; Tabellen mit den Präfixen
|
||
`core_` und `mod_`, Migrationen je Projekt unter `Persistence/Ef/Migrations/`.
|
||
- [x] Repository-Implementierungen auf EF Core hinter den bestehenden Interfaces.
|
||
- [x] Migration der Altdaten über die CLI-Schalter `--migrate-json` und `--verify-mysql`
|
||
(statt eines Skripts in `agentspace/scripts`).
|
||
- [x] Mongo vollständig entfernt: kein `MongoDB.Driver`- oder `LiteDB`-Paket mehr in irgendeiner
|
||
`.csproj`, kein Shim. `data.db` und die `MongoDB/`-Exporte sind am 22.08.2026 auch lokal
|
||
gelöscht worden.
|
||
|
||
### Phase 7 — Nacharbeiten *(teilweise erledigt — Stand 22.08.2026)*
|
||
- [x] Test-Projekt: Risk-/Entscheidungslogik als reine Funktionen extrahiert und getestet —
|
||
**476 Tests** grün.
|
||
- [x] Leere `catch {}` beseitigt — in `src/` findet sich kein einziger leerer Catch-Block mehr.
|
||
- [x] 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 aus
|
||
`POLYTRADER_MASTER_KEY` (siehe `Security/MasterKeyResolver.cs`).
|
||
- [ ] **Offen:** God-Methoden splitten (`PollLiveAccountsAsync`, `ProcessAccountOrderAsync`);
|
||
duplizierte Closed-Trade-Erzeugung zentralisieren.
|
||
- [ ] **Offen:** `TerminalLogger` auf `Microsoft.Extensions.Logging` + UI-Sink umstellen. Hängt mit
|
||
dem Zeitzonen-Punkt zusammen (Abschnitt C im Avalonia-Leitfaden): der Logger stempelt mit
|
||
`DateTime.Now` statt der konfigurierten `AppTimeZone`.
|
||
|
||
---
|
||
|
||
## 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)
|
||
|
||
1. **Eigene Trading-Accounts → Core**, **kopierte Master-Trader → Copytrading-Modul.**
|
||
2. **Zweistufiges Trade-Logging:** generischer Core-Log (modulübergreifend) **und**
|
||
zusätzlicher Copytrading-Detail-Log im Modul (siehe 2.4).
|
||
3. **ORM: Entity Framework Core.**
|
||
4. **Dashboard:** Core liefert Gesamt-Overview über alle Module; Module liefern
|
||
eigene Detail-Analysen (siehe 2.5).
|
||
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).
|