Vier Stufen je Position (frei, nur schliessen, nur aufbauen, gesperrt) und je Instrument ein Handelsverbot samt harter Bestandsobergrenze. Beides gilt fuer Module; der manuelle Handel in TWS bleibt unberuehrt. Die Pruefung sitzt im RiskService, nicht im Modul: Eine Sperre, die ein Modul selbst pruefen muesste, ist keine Sperre, sondern eine Bitte. Sie laeuft NACH der fachlichen Bewertung, weil erst dort feststeht, welcher Teil eines Auftrags eroeffnet und welcher schliesst - genau daran haengen die Stufen. Drei Entscheidungen, die im Betrieb zaehlen: "Gesperrt" verhindert auch den Ausgang. Eine Position, die aus Risikogruenden geschlossen werden muesste, bleibt liegen, bis jemand die Sperre loest. Das ist gewollt und steht als eigener Test da, damit es niemand fuer einen Fehler haelt. Ein Handelsverbot sperrt das Eroeffnen, nicht das Schliessen. Ein nachtraeglich gesetztes Verbot darf keine Position einsperren, die man gerade loswerden will; wer auch das will, nimmt die Positionssperre. Die harte Stueckzahl zaehlt den Bestand ueber ALLE Buecher, MANUAL eingeschlossen, und Short-Positionen mit ihrer Groesse statt ihrem Vorzeichen: "hoechstens 100" meint die Groesse der Verpflichtung. Sie ersetzt das prozentuale Konzentrationslimit nicht - der Prozentsatz waechst mit dem Konto, die Stueckzahl ist eine Aussage ueber ein bestimmtes Papier. Es zieht die engere Grenze. TradingRuleService haelt die Regeln im Speicher, weil sie bei jeder Risikopruefung gebraucht werden, sich aber selten aendern. Laesst sich die Liste NICHT laden, gilt das nicht als "keine Sperren": der Dienst meldet es und sperrt, bis sie wieder lesbar ist. Eine Sperre, die bei einem Datenbankfehler verschwindet, waere keine. Ein unlesbarer Stufenwert wird ebenso als schaerfste Stufe gelesen. Auf dem Testserver angewendet (Tabellen core_position_lock und core_instrument_rule) und der Dienst damit neu gestartet - keine Ladefehler, der Handel bleibt frei. Zur Probe stehen dort die beiden Beispiele des Betreibers: WIRECARD gesperrt, NVDA hoechstens 100 Stueck. 425 Tests gruen, 11 davon neu. Arbeit an #485 und #486; die Oberflaeche fehlt noch, die Durchsetzung steht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
IBKRTrader
Modulares C#-Trading-Framework für Interactive-Brokers-Aktien. Harter Core + unabhängige Strategie-Module + Launcher, der die Fenster der Module öffnet. Konzept nach dem Vorbild von PolytraderSharp (nur IBKR statt Polymarket).
Läuft auf Windows und Linux – wahlweise mit Oberfläche (Avalonia) oder kopflos als Dienst.
Architektur (Kurzform)
src/IBKRTrader.App Oberfläche (Avalonia, plattformneutral)
src/IBKRTrader.Daemon kopfloser Dienst (systemd) – dieselbe Anwendung ohne Fenster
src/IBKRTrader.Hosting Host-Zusammenstellung, von beiden Einstiegspunkten geteilt
src/IBKRTrader.Core Contracts, EF-Persistenz, Trading-Kern, Worker, Security
src/IBKRTrader.Modules.* je Modul ein eigenes Projekt (referenziert nur Core)
tests/IBKRTrader.Tests xUnit (Unit + EF-InMemory)
Alle Projekte sind net10.0 ohne Plattformbindung. Der UI-Contract im Core ist toolkit-neutral
(Func<object> CreateView, IconKey statt Bild), damit Core und Module auch kopflos laufen –
die Fenster registriert die Shell zentral in Shell/ModuleViews.cs.
- Generic Host (
Host.CreateDefaultBuilder), Worker/Services alsIHostedService. - Module über
IModule(RegisterServices/RegisterUi/Start/Stop); UI überIModuleUiHost/ModuleView. - Persistenz: EF Core (Pomelo/MariaDB), Migrationen extern angewendet (nicht zur Laufzeit).
- Trading-Kern:
IExecutionService(Signal→Risiko→Order→Buchung),IRiskService,IPortfolioService, Broker hinterIBrokerClient:NullBrokerClient(Default, handelt nie) oderIbkrBrokerClientüber die TWS API – aktivierbar mitIBKR.UseTwsApi. - Analyse-Datenfundament:
core_decision_journal(jede Entscheidung + ReasonCode),core_order_events,SignalId-Korrelation, JSONL-Log-Sink (Logs/{yyyy-MM-dd}.jsonl) – speist den Supervisor. - Details: docs/ARCHITECTURE.md · Offener Stand: docs/ROADMAP.md.
Build & Test
dotnet build IBKRTrader.slnx
dotnet test IBKRTrader.slnx
Anwendung starten:
dotnet run --project src/IBKRTrader.App
Prüfläufe – beide ohne Anzeigegerät und ohne laufende Dienste, also CI-tauglich:
dotnet run --project src/IBKRTrader.App -- --smoke-ui
dotnet run --project src/IBKRTrader.Daemon -- --check
Kopflos auf Linux (systemd): siehe deploy/README.md.
Konfiguration
appsettings.Local.json(gitignored) hält den DB-Connection-String (Database:MySqlConnectionString).settings.json(gitignored) – App-Settings (IBKR-Ports, Logging, Worker, Trading).- Optional
IBKRTRADER_MASTER_KEYbzw.master.keyfür at-rest-Verschlüsselung (AES-256-GCM). - Supervisor (optional):
IBKRTRADER_OPENROUTER_KEYbzw.openrouter.key(KI-Analyse), sowie die Opt-insIBKRTRADER_SUPERVISOR_DAILY(Tagesbericht, Stunde 0–23) undIBKRTRADER_MCP_PORT(MCP-Light, nur 127.0.0.1).
Datenbank aufsetzen
Schema wird per EF-Migrationen extern angewendet – siehe scripts/README.md:
mysql ... < scripts/drop-app-tables.sql # nur falls Alt-Tabellen existieren
powershell -File scripts/provision-db.ps1
Module
- CongressTrading – kopiert US-Kongress-Trades (capitoltrades.com) →
TradeSignal→ ExecutionService. - Accounting – von der Trading-DB unabhängige Buchführung aus dem IBKR-Kontoauszug (Activity Flex
Query) → append-only Ledger
acc_*, Periodenabrechnung/BWA, FX (USD/EUR), CSV/PDF-Export. Kein Handel. Live-Abruf hinter Interfaces (Offline-Null-Stubs); Steuerschicht bewusst offen. Konzept: docs/archiv/KONZEPT-Modul-Accounting.md. - Supervisor – read-only KI-Analyse/Forensik über alle Module (OpenRouter-Agent + read-only
Tool-Registry, Dossier-Browser, optional MCP-Light). Stützt sich auf das Core-Datenfundament
(
core_decision_journal,core_order_events,SignalId, JSONL-Logs). Konzept: docs/archiv/KONZEPT-Modul-Supervisor.md.
Status / Nächstes
➡️ Was noch zu tun ist, steht vollständig in der Roadmap. Sie ist seit dem 2026-08-23 das einzige Dokument, das den offenen Stand führt – einschließlich der Ideen, die wir bewusst zurückstellen (🧊) und derer, die wir geprüft und verworfen haben (❌). Die früheren Konzepte liegen unverändert unter docs/archiv/ und tragen die Herleitung.
Kurzfassung:
- Gebaut: R1–R7 (Kurskorrektur auf das PolytraderSharp-Konzept), Accounting und Supervisor inkl. Core-Datenfundament S-0, Linux-Portierung L0–L6, Deploymentcenter-Anbindung.
- Es hat noch nie eine echte Order gegeben. Der TWS-Adapter ist gegen das Paper-Konto
verifiziert (Verbindung, Konto, Kurse, Optionskette, Greeks, What-If-Order), aber
PlaceOrderAsyncmit echter Ausführung steht aus – daran hängt alles Weitere. - Sicherheit: DB-Passwort rotieren (liegt in der Git-Historie, Commit
ebeb035).
Sicherheitshinweis
Automatisierter Handel ist riskant. Standardmäßig handelt die App nicht: der Broker-Adapter ist
über IBKR.UseTwsApi abgeschaltet, und selbst mit aktivem Adapter platziert der ExecutionService
ohne globales TradingEnabled=true keine Order. Beide Schalter sind bewusst getrennt. Echter Handel
erst nach Verifikation gegen den Paper-Account.