R3 Slice 1: EF-Core-Infrastruktur im Core + InitialCore-Migration - Pomelo.EntityFrameworkCore.MySql 8.0.3 + EF Core Design 8.0.11 (Core), NuGet-Allowlist erweitert - Configuration/DatabaseOptions + DatabaseServerVersion (MariaDB 11.8.6 gepinnt) - Persistence/Entities: CorePosition, CoreTrade, CoreBudget, CoreWorkerLog, CoreSetting - Persistence/Ef/CoreDbContext (core_-Tabellen) + Design-Time-Factory (env IBKRTRADER_MYSQL) - DependencyInjection/AddCorePersistence (AddDbContextFactory), in Program verdrahtet (Connection aus appsettings.Local.json) - EF-Migration InitialCore erzeugt (5 core_-Tabellen) - Consumer noch auf Dapper (folgt in Slice 2); Build + 30/30 Tests + smoke-ui gruen Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> @
122 lines
7.7 KiB
Markdown
122 lines
7.7 KiB
Markdown
# IBKRTrader – Architektur & Implementierungsplan
|
||
|
||
> **KORRIGIERT (2026-07-27):** Vorbild ist **PolytraderSharp** (`J:\Softwareprojekte\PolytraderSharp`),
|
||
> die C#-Neuentwicklung – **nicht** die veraltete Python-Version. Die frühere Fassung dieses Plans
|
||
> basierte auf der Python-Vorlage und war konzeptionell falsch. Ziel ist eine **1:1-Neu-Fundamentierung**
|
||
> nach PolytraderSharp, im bestehenden IBKRTrader-Repo.
|
||
|
||
Ziel: modulares C#-Trading-Framework für Interactive-Brokers-Aktien, strukturell wie PolytraderSharp,
|
||
nur dass statt Polymarket über IBKR gehandelt wird.
|
||
|
||
---
|
||
|
||
## 1. Ziel-Architektur (nach PolytraderSharp)
|
||
|
||
```
|
||
IBKRTrader.App (WinExe, Root) – Generic Host + Shell (Launcher) + Core-Views
|
||
│ Program.cs: Host.CreateDefaultBuilder, IConfiguration, Module laden, ShellUiHost, Application.Run
|
||
│ Ui/: LauncherForm, ShellUiHost, Views/ (Dashboard, Terminal, Settings, Jobs)
|
||
│
|
||
├── src/IBKRTrader.Core (classlib, net10.0-windows, UseWindowsForms)
|
||
│ ├── Modularity/ IModule (Name, DbPrefix, RegisterServices, RegisterUi, Start/Stop, ActivationBlocker)
|
||
│ │ ModuleView, IModuleUiHost, WindowMenu ← UI-Contract liegt im Core
|
||
│ ├── Configuration/ DatabaseOptions, ServerVersion-Pinning
|
||
│ ├── DependencyInjection/ AddCorePersistence(...)
|
||
│ ├── Persistence/Ef/ CoreDbContext + Entities + EF-Repositories (hinter Interfaces)
|
||
│ ├── Trading/ Broker-Seam, Risk, Execution, Portfolio, Domänentypen
|
||
│ ├── Services/ TerminalLogger, JobManager, Hosted Services (Market-Sync etc.)
|
||
│ ├── Security/ SecretProtection (Master-Key, AES-256-GCM at-rest)
|
||
│ └── Hosting/ StartupHydrationService (IHostedService, hydriert State zuerst)
|
||
│
|
||
├── src/IBKRTrader.Modules.CongressTrading (classlib, referenziert NUR Core)
|
||
│ ├── CongressTradingModule : IModule
|
||
│ ├── Persistence/Ef/ eigener DbContext (ct_) + Repos
|
||
│ ├── Services/ Scraper + Jobs (IHostedService)
|
||
│ └── Ui/ CongressTradingMainForm (Tabs) via RegisterUi
|
||
│
|
||
└── tests/IBKRTrader.Tests (xUnit, referenziert Core + Module)
|
||
```
|
||
|
||
### Leitprinzipien (aus PolytraderSharp übernommen)
|
||
- **Multi-Projekt**: Core = eigenes Assembly; jedes Modul = eigenes Projekt, referenziert **nur** Core.
|
||
Module können einander physisch nicht referenzieren.
|
||
- **Generic Host**: `Host.CreateDefaultBuilder`, `IHostedService` für alle Hintergrund-Jobs,
|
||
`IOptions`/`IConfiguration`.
|
||
- **Config**: `appsettings.json` + `appsettings.Local.json` (gitignored, hält Connection-String/Secrets).
|
||
- **Modul-Vertrag** `IModule`: `Name`, `DbPrefix`, `RegisterServices(services, config)`,
|
||
`RegisterUi(host, sp)`, `StartAsync/StopAsync`, `GetActivationBlocker(config)`.
|
||
- **UI = Shell + Views**: Core und Module registrieren `ModuleView`s beim `IModuleUiHost`.
|
||
Der Launcher öffnet je View ein Fenster (Einzelinstanz, Re-Open fokussiert). Gemeinsames
|
||
„Fenster"-Menü (`WindowMenu`) auf jedem Form. Views sind designbare Forms mit `Initialize(sp)`.
|
||
- **Persistenz**: EF Core (Pomelo/MySQL), `AddDbContextFactory`, Repositories hinter Interfaces.
|
||
- **Sicherheit**: Master-Key + AES-256-GCM-Verschlüsselung von Credentials at-rest; TLS-Warnung.
|
||
- **Headless-Test**: `--smoke-ui` konstruiert jede View + Launcher ohne Message-Loop.
|
||
- **Module an/aus** über `ServerSettings.DisabledModules`.
|
||
|
||
---
|
||
|
||
## 2. Was aus dem bisherigen Stand übernommen wird
|
||
|
||
| Bestand (Phase 0–3, Python-basiert) | Schicksal |
|
||
|---|---|
|
||
| Testprojekt (xUnit) | bleibt, wandert nach `tests/` |
|
||
| `RiskService`, `ExecutionService`, Domänentypen | Logik bleibt → Core/Trading (Feinschliff) |
|
||
| CongressTrading Scraper/Repo | Inhalt bleibt → eigenes Modul-Projekt (auf EF/IHostedService umgestellt) |
|
||
| `IModule`/`ModuleRegistry`/`WindowManager` | ersetzt durch PolytraderSharp-Contract (`IModule` neu, `ModuleView`, `IModuleUiHost`, `WindowMenu`) |
|
||
| Manuelles `ServiceCollection` in Program.cs | ersetzt durch Generic Host |
|
||
| `settings.json`/`SettingsService` | ersetzt durch `IConfiguration` + `appsettings.Local.json` |
|
||
| Dapper + manuelle Migrationen | ersetzt durch EF Core |
|
||
| `WorkerEngine`/`IWorker` | ersetzt durch `IHostedService` |
|
||
|
||
---
|
||
|
||
## 3. Re-Fundamentierungs-Phasen (Checkliste)
|
||
|
||
### R1 – Solution-Skelett (Multi-Projekt, reiner Strukturumbau, Verhalten unverändert) ✅
|
||
- [x] `src/IBKRTrader.Core` (classlib, UseWindowsForms) – `Core/` + UI-Contract (`Ui/ModuleFormBase`, `Ui/WindowManager`)
|
||
- [x] `src/IBKRTrader.Modules.CongressTrading` (classlib, referenziert nur Core)
|
||
- [x] Root-Projekt → `IBKRTrader.App` (WinExe), referenziert Core + Modul; Program/LauncherForm/UI-Shell bleiben
|
||
- [x] `tests/IBKRTrader.Tests` – Referenzen auf Core + Modul; Fixture-Pfad angepasst
|
||
- [x] Neue `.slnx`; ungenutztes HtmlAgilityPack entfernt; Build + **38/38 Tests grün**; App startet
|
||
|
||
### R2 – Core-Contracts + Generic Host + Shell-UI ✅
|
||
- [x] `IModule` (PolytraderSharp-Stil) + `ModuleView` + `IModuleUiHost` + `WindowMenu` in Core
|
||
- [x] `Program.cs` → `Host.CreateDefaultBuilder`; `IConfiguration` (appsettings.json + appsettings.Local.json, gitignored)
|
||
- [x] `ShellUiHost` + `LauncherForm` (View-Buttons + gemeinsames Fenster-Menü); Core-Views (Workers/Logs/Settings) als eigene Fenster
|
||
- [x] CongressTrading auf neuen `IModule`-Vertrag; Modul-Worker als `IWorker` registriert
|
||
- [x] `--smoke-ui` Headless-Test (alle Views + Launcher konstruieren) → grün
|
||
- [ ] **Offen (R4/R5):** Worker von `WorkerEngine`/`IWorker` auf `IHostedService` umstellen (aktuell noch WorkerEngine)
|
||
|
||
### R3 – Persistenz auf EF Core
|
||
**Festgelegt:** EF-Migrationen **extern** (wie PolytraderSharp) – Schema per `dotnet ef database update`,
|
||
App legt keine Tabellen zur Laufzeit an. Server: **MariaDB 11.8.6** (via `--db-version` bestätigt) →
|
||
Pin `new MariaDbServerVersion(new Version(11, 8, 6))`. Verbindung aus `appsettings.Local.json`.
|
||
- [x] `--db-version`-Diagnose (Serverversion für den EF-Pin)
|
||
- [x] **Slice 1:** `Configuration/DatabaseOptions` + `DatabaseServerVersion`-Pin (MariaDB 11.8.6); `AddCorePersistence` (`AddDbContextFactory`) + `CoreDbContext` + Entities (core_position, core_trade_history, core_budget, core_worker_log, core_settings) + Design-Time-Factory; **EF-Migration `InitialCore` erzeugt**
|
||
- [ ] **Slice 2:** Consumer umstellen: `PortfolioService`, `BudgetService`, `TradeHistoryService`, `WorkerBase`-Log
|
||
- [ ] **Slice 3:** Modul-DbContext (ct_) im CongressTrading-Projekt + Umstellung
|
||
- [ ] **Slice 4:** Dapper + `DatabaseService` + manuelle Migrationen (CoreMigrations/IBKRMigrations/CongressMigrations) entfernen; IBKR-Marktdaten auf EF
|
||
- Hinweis: nur build-verifizierbar (Unit-Tests ohne DB); Schema-Anwendung extern via `dotnet ef database update` (env `IBKRTRADER_MYSQL`)
|
||
|
||
### R4 – Trading-Kern einфügen
|
||
- [ ] Risk/Execution/Portfolio/Broker-Seam nach Core/Trading (aus Phase 3 portiert)
|
||
- [ ] Hintergrund-Jobs als `IHostedService`
|
||
|
||
### R5 – CongressTrading als vollständige Strategie
|
||
- [ ] Scraper/Jobs → `IHostedService`; Signal → `ExecutionService`
|
||
- [ ] Modul-View (Tabs) via `RegisterUi`
|
||
|
||
### R6 – Sicherheit + Config-Härtung
|
||
- [ ] `SecretProtection` (Master-Key, AES-256-GCM at-rest), TLS-Warnung
|
||
- [ ] Connection-String nur in `appsettings.Local.json` (gitignored); Secrets aus Repo/Historie
|
||
|
||
### R7 – Tests + Feinschliff
|
||
- [ ] Bestehende Unit-Tests portieren; `--smoke-ui`; EF-InMemory-Tests wo sinnvoll
|
||
|
||
---
|
||
|
||
## 4. Historie (bereits erledigt, teils zu ersetzen)
|
||
- Phase 0–3 (Python-basiert): Testfundament, IModule/ModuleRegistry, LauncherForm+WindowManager,
|
||
Trading-Kern (Risk/Execution/Portfolio, NullBroker). Logik brauchbar, Infrastruktur wird ersetzt.
|
||
- Commits bis `2ad4b55` auf Gitea.
|