Phase 3: Trading-Kern (Risk, Execution, Portfolio) mit sicherem Broker-Default - Core/Trading/TradingModels: Signal, Order(Request/Result), RiskContext/Decision, Account, Position, Quote, ExecutionResult, Enums (Side/OrderType/Mode) - IBrokerClient + NullBrokerClient (sicherer Default, handelt NIE bis IBKR-Adapter verifiziert) - RiskService (+IRiskService): Sizing nach MaxTrade%, Modul-Limit, Slippage; Buy/Sell - PortfolioService (+IPortfolioService): core_position + core_trade_history + core_budget - ExecutionService (+IExecutionService): Signal -> Kurs -> Konto -> Risiko -> Order -> Buchung - TradingSettings in AppSettings (Paper/Live, TradingEnabled, Risikoparameter) - CoreMigrations: core_position; DI-Registrierung der Trading-Services - Tests: RiskService (11) + ExecutionService (6, NSubstitute) -> 38/38 gruen Offen (bewusst gekapselt): echter IbkrBrokerClient gegen Client-Portal-Gateway (manuell verifizieren). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> @
7.9 KiB
7.9 KiB
IBKRTrader – Architektur & Implementierungsplan
Umbau von IBKRTrader auf das Polytrader-Grundprinzip: harter Core + beliebig viele unabhängige Module + ein Launcher, der die Fenster der einzelnen Module öffnet. Statt Polymarket wird über Interactive Brokers gehandelt.
Polytrader dient als konzeptionelle Vorlage (Python/FastAPI + tkinter-Launcher + Web-UI), nicht als Code-Vorlage. IBKRTrader ist ein C#/.NET-10-WinForms-Framework.
1. Zielarchitektur
Program.cs (DI-Bootstrap)
│
├── CORE (harter Kern – kennt KEIN Modul)
│ ├── Settings AppSettings + settings.json
│ ├── Logging rtb + Logs/[Modul]/[Level]
│ ├── Database MySQL/Dapper + Migrationen (core_)
│ ├── IBKR Marktdaten [vorhanden] + Orders [neu]
│ ├── Portfolio Positionen/Balance/P&L (core_) [neu]
│ ├── Execution + Risk Signal → Prüfung → Order → Buchung [neu]
│ ├── Workers WorkerEngine + Core-Worker
│ └── Modules IModule-Vertrag + ModuleRegistry [neu]
│
├── MODULES (unabhängige Strategien – Abhängigkeit nur Modul → Core)
│ └── CongressTrading Scraper + Repo + Worker [vorhanden]
│ + Strategie + Fenster [neu]
│
└── UI
├── LauncherForm Basis: Core-Status, Worker-Grid, Logs, Settings,
│ Modul-Liste mit „Fenster öffnen"-Buttons
└── ModuleFormBase Basisklasse für eigenständige Modul-Fenster
Kernregeln (siehe auch .agents/rules/grundregeln.md)
- Core kennt kein Modul. Module hängen sich über DI +
IModuleein. Abhängigkeit nur Modul → Core. - DB-Tabellen:
{ModulKürzel}_name(Core =core_, CongressTrading =ct_). - Jeder Worker ist unabhängig ein-/ausschaltbar, hat eigenen Zeitplan, ist manuell triggerbar.
- Strategie lebt im Modul, nicht im Core. Der Core stellt nur Primitive bereit
(Orders, Portfolio, Risiko); das Modul liefert nur ein
TradeSignalan denExecutionService.
Festgelegte Entscheidungen
| Thema | Festlegung |
|---|---|
| Modul-Fenster | Eigenständige Top-Level-Fenster; Launcher trackt Key → Form, fokussiert bei Re-Open |
| Demo-Betrieb | IBKR Paper-Account (Port 4002); Umschaltung Paper/Live via TradingSettings.Mode |
| Tests | IBKRTrader.Tests (xUnit + NSubstitute + FluentAssertions), nur Unit, alles Externe gemockt |
| DoD je Phase | dotnet test (Unit) grün und Build sauber |
2. Abbildung Polytrader → IBKRTrader
| Polytrader | Rolle | IBKRTrader |
|---|---|---|
main.py + api/server.py lifespan |
Entry-Point, Orchestrierung, Background-Loops | Program.cs (DI) + WorkerEngine |
config.py |
zentrale Config | SettingsService / AppSettings |
database/ |
Buchführung | DatabaseService + Migrationen + Repos |
polymarket_client.py |
Plattform-Anbindung | IIbkrClient (Marktdaten + Orders) |
trade_manager.py |
Positionen/Balance/P&L | PortfolioService |
trade_engine.py |
Signal → Risiko → Order | ExecutionService + RiskService |
trader_monitor.py |
Datenquelle pollen → Signal | Modul-Worker (z. B. CT-ScrapeWorker) |
demo_wallet.py |
Handel ohne echtes Geld | IBKR Paper-Account |
desktop_gui.py |
Launcher-Fenster | LauncherForm |
frontend/ (Sidebar → Pages) |
Ansichten | Launcher-Panels + je Modul ein Fenster |
telegram_notifier.py |
Benachrichtigungen | NotificationService (später) |
module_checker.py |
Integritätscheck | Startup-Self-Check (später) |
3. Teststrategie
- Eigenes Projekt
IBKRTrader.Tests(net10.0-windows), im.slnx. - Nur Unit-Tests, deterministisch, schnell, laufen bei jedem Build/Commit.
- Externe Abhängigkeiten hinter Interfaces (
IIbkrClient,IOrderService,IPortfolioService,IRiskService,ICongressRepository…) → in Tests via NSubstitute gemockt. - Echtes MySQL/IBKR-Paper/Scraping wird manuell je Meilenstein geprüft (nicht automatisiert).
| Komponente | Beispiel-Testfall |
|---|---|
RiskService |
Sizing bei 5 % Budget; Ablehnung bei Slippage; globaler Pause-Schalter blockt |
ExecutionService |
Signal → gemockte Risk/Order/Portfolio; Buchung & Ablehnungsgründe |
CapitolTradesScraper |
Parser gegen Fixture ct_raw.html (deterministisch, kein Netz) |
ModuleRegistry / IModule |
Registrierung, Worker-Sammlung, CreateWindow liefert Fenster |
WorkerBase |
Interval-Loop, Trigger, Fehler → Status=Error, Cancellation |
AppSettings / SettingsService |
Laden/Serialisieren, Paper/Live-Port-Auswahl (4002/4001) |
WindowManager |
Fenster-Tracking, Re-Open fokussiert bestehendes Fenster |
WinForms selbst wird nicht unit-getestet – Logik in Services/Manager halten, Forms dünn.
4. Phasenplan (Checkliste)
Phase 0 – Fundament & Doku ✅
grundregeln.mdauf .NET 10 + Launcher-Modell aktualisiert (+ DB-Passwort entfernt)docs/ARCHITECTURE.mdangelegtIBKRTrader.Tests(xUnit + NSubstitute + FluentAssertions) angelegt, im.slnx- Repo-lokale
NuGet.config(Test-Pakete in Allowlist ergänzt) - Erster Smoke-Test grün (
dotnet test→ 2/2 bestanden)
Phase 1 – Modul-System formalisieren (Refactoring, kein Verhaltensänderung) ✅
Core/Modules/IModule.cs(Key,DisplayName,Description,Version,RegisterServices,InitializeAsync,GetWorkers,CreateWindow)Core/Modules/ModuleRegistry.csCongressTradingModule→IModule(instanzbasiert, + Platzhalter-CreateWindow)Program.csiteriert überIModule[]+ModuleRegistry;Form1initialisiert Module über die Registry- Testbarkeits-Seams:
WorkerBase.BeginRunLogAsync/EndRunLogAsync,CapitolTradesScraper.ParseTradesFromHtml - Tests:
ModuleRegistry,CongressTradingModule,WorkerBase,CapitolTradesScraper(gegenct_raw.html) → 15/15 grün
Phase 2 – Launcher-UI + Modul-Fenster ✅
Form1→LauncherForm(Dateien viagit mv, Designer/resx angepasst); Kern-Panels behalten- Modul-Tab: Karten aus
ModuleRegistry, je Modul „Fenster öffnen" UI/ModuleFormBase.cs+UI/WindowManager.cs(Fenster-Tracking, Re-Open fokussiert,CloseAll)Modules/CongressTrading/UI/CongressTradingForm.cs(DB-Kennzahlen + „Scrape jetzt")WindowManagerin DI; Launcher schließt Modul-Fenster beim Beenden- Tests:
WindowManager(6) → 21/21 grün; Launcher-Start verifiziert
Phase 3 – Trading-Kern (Core) ✅
Core/Trading/TradingModels.cs(Signal, Order, RiskContext/Decision, Account, Position, Quote)Core/Trading/IBrokerClient.cs+NullBrokerClient(sicherer Default: handelt nie)Core/Trading/PortfolioService.cs(+IPortfolioService) + Migrationcore_position(nutzt vorhandenecore_trade_history/core_budget)Core/Trading/RiskService.cs(+IRiskService): Sizing, Modul-Limit, SlippageCore/Trading/ExecutionService.cs(+IExecutionService): Signal → Kurs → Konto → Risiko → Order → BuchungTradingSettingsinAppSettings(Mode Paper/Live, TradingEnabled, Risikoparameter)- Tests:
RiskService(11),ExecutionService(6, voll gemockt) → 38/38 grün - Offen (bewusst): echter
IbkrBrokerClient(Quote/Konto/Order gegen Client-Portal-Gateway) — manuelle Verifikation gegen Paper-Account
Phase 4 – CongressTrading als vollständige Strategie
CongressTradingStrategy: neue Scrape-Trades →TradeSignalanExecutionService- Modul-Fenster: offene/geschlossene Positionen, P&L, Strategie-Ein/Aus, Parameter
- Tests: Signal-Erzeugung
Phase 5 – Feinschliff (optional)
NotificationService(Telegram o. Ä.) + periodische Reports- Startup-Self-Check (analog
module_checker) - Dashboard-Panel im Launcher (Gesamt-Balance/P&L über alle Module)