User: "Uebernehme die Logikpruefung auf allen Slots in die Deployment pipeline" -
nach dem Ausfall, bei dem der Serverstart komplett abbrach und zwei Minuten lang
kein Close moeglich war.
ZWEI FEHLERKLASSEN, beide binnen zwei Tagen real aufgetreten, beide von KEINER
bestehenden Stufe gefangen (py_compile, ruff F821, ty, pytest: alle gruen):
(A) ATTRIBUT VOR SEINER ZUWEISUNG. `self.trader_brk.history = self.history`
stand in `__init__` VOR `self.trader_brk = TradeManager(...)`.
AttributeError im Konstruktor -> Serverstart brach ab -> "Netzwerkfehler" am
Close-Knopf. Syntaktisch korrekt, und kein Test instanziiert die Engine (sie
braucht MT5). Gefunden hat es erst deploy.py Schritt 2 - also NACH dem Kill
des laufenden Servers. Derselbe Fehler am Vortag mit `_margin_brk` vor
`_load_runtime_state()`, dort sogar still.
Die Pruefung sammelt je `self.X` die ZEILE der ersten Zuweisung und meldet
jede Benutzung davor.
(B) SLOT-VERWECHSLUNG. BRK-Pfade (_check_auto_squeeze, _manage_squeeze_pending,
_check_pending_fill) duerfen den SLOT-ZUSTAND von `self.trader` nicht
anfassen (close/snapshot/open_*/set_open_context/refresh). ⚠ Bewusst eine
WEISSE Liste der Pfade - eine schwarze wuerde jede neue Funktion still
durchlassen. `pending_orders`/`cancel_pending`/`place_stop` sind ausdruecklich
ERLAUBT: magic-basierte Broker-Abfragen ohne Slot-Zustand (geprueft).
Dazu die Invariante, dass `TradingEngine.close` beide Slots erwaehnen muss -
sonst waere eine BRK-Position per Dashboard nicht schliessbar.
DREI RICHTUNGEN VERIFIZIERT: sauber -> gruen; Reihenfolge-Fehler zurueckgebaut ->
"self.trader_brk benutzt, aber erst in Zeile 270 zugewiesen"; Slot-Verwechslung
zurueckgebaut -> "self.trader.close im BRK-Pfad". Danach wieder gruen.
Statisch (AST), kein MT5, Millisekunden. Werkzeugfehler gilt NICHT als sauber.
Laeuft ueber check_nfalle.py im pre-commit-Hook mit.
⚠ Was diese Stufe NICHT kann: ein Startfehler AUSSERHALB von __init__. Dafuer
bliebe ein echter Rauchtest mit gestubbtem MT5 - der ist nicht gebaut.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Oil Trading Bot (MT5, WTI)
Algorithmischer WTI-Öl-Trading-Bot auf MetaTrader 5 mit headless FastAPI-Backend und Mobile-PWA. Analyse, Strategie, Backtests und LLM-Copilot laufen in Python; MQL5 ist nur eine dünne Zeichen-Schicht fürs Desktop-Terminal.
Hinweis: Interne Doku, Antworten und UI-Texte sind auf Deutsch. Die ausführliche Entwickler-/Strategie-Dokumentation steht in
CLAUDE.mdunddocs/.
Überblick
server.py+core/engine.py— headless FastAPI-Web-Backend, das die Mobile-PWA inweb/bedient (Zugriff vom Handy z. B. via WireGuard).- Eine Oberfläche: die PWA. Das frühere Tkinter-Widget wurde entfernt.
- ⚠ Immer nur eine Server-Instanz gegen dasselbe MT5-Terminal laufen lassen (zwei TrailingManager = Konflikt).
Architektur (core/)
| Modul | Aufgabe |
|---|---|
mt5data.py |
Preis / Trend / Konto |
trader.py |
Orders + SL/TP |
trailing.py |
Trailing / Teil-Exit / Time-Stop |
wave_rec.py |
Empfehlung (EMA12/50-Trendfolge, Squeeze-Breakout, Gates) |
elliott.py |
Elliott-Wellen / FVG |
structure.py |
Marktstruktur (HH/HL/LH/LL, BOS, Regressionskanal — Anzeige) |
daily_levels.py |
Tages-Prognose (Web-Recherche) |
gaps.py |
D1-Kurslücken |
candle_logger.py |
M1-Candle-Log → candles_m1 |
agent.py |
KI-Copilot (LLM) |
history.py |
SQLite-Persistenz |
config.py |
Konstanten + oil_widget_config.ini-Loader |
engine.py |
headless Motor: fährt die Loops als Threads, liefert snapshot() |
engine._verdict() aggregiert die Module zur Gesamtempfehlung (verdict im
Snapshot) — Details: docs/gesamtempfehlung.md.
Voraussetzungen
- Windows (das
MetaTrader5-Python-Wheel ist Windows-only; das Backend läuft neben dem MT5-Terminal). - Python 3.12 mit
fastapi,uvicorn,MetaTrader5(+ weitere Abhängigkeiten, die die Module importieren). - Ein laufendes MetaTrader-5-Terminal mit dem WTI-Symbol des Brokers
(z. B.
SpotCrudebei Pepperstone).
Einrichtung
- Repo klonen.
- Config-Vorlage kopieren und mit echten Keys füllen:
Dann
cp oil_widget_config.ini.example oil_widget_config.inioil_widget_config.iniausfüllen (LLM-/News-/Telegram-/Graph-Keys, WTI-Symbol, Trading-Schalter). Diese Datei enthält Live-Secrets und ist per.gitignorevom Repo ausgeschlossen — niemals committen. Erläuterungen zu allen[trading]-Schaltern stehen als Kommentare incore/config.py. - MT5-Terminal starten und einloggen.
Starten
# Änderungen aktivieren / Server (neu) starten:
restart_server.bat
Auto-Start ist als Windows-Aufgabe OilTradingServer (Login-Trigger, versteckt via
VBS) eingerichtet. Die PWA ist danach unter http://<host>:8000/ erreichbar.
Strategie in Kürze
- Richtung = EMA12 vs. EMA50 (
wave_rec.py), mit Totband, Anti-Überdehnung, S/R- und Session-Konfidenz. - Volatilitäts-Squeeze-Breakout = additiver, backtest-validierter Auto-Entry
(Kompression → Ausbruch); optional autonom (
auto_squeeze). - Gates: ATR-Breakout-Bestätigung, Entry-Raum, Mindest-Konfidenz, Higher-TF- Gegen-Trend, EIA-Blackout.
- Exit: SL-Band ~2×ATR, Breakeven ab +1,3×ATR, Trailing, Time-Stop, sowie ein kalibriertes P(Durchbruch)-Modell für den S/R-Close am Gegenlevel.
Methodik: Strategie-Änderungen werden per 2-Stichproben-Backtest (zwei Zeiträume/Regime) mit echten Kosten belegt, bevor sie live gehen — „erst messen, dann umbauen". Die zahlreichen
backtest_*.py-Skripte dokumentieren geprüfte und verworfene Ideen.
Nützliche Skripte
| Befehl | Zweck |
|---|---|
python backtest_signal.py [TF] [N] [K] |
Empfehlungs-Edge messen (ereignisbasiert) |
python analyze_execution.py |
Spread-/Slippage-/MAE-MFE-Kalibrierung |
python weekly_review.py |
Wochenreport (Live-Stats vs. Backtest-Erwartung) |
python -m py_compile <datei> |
Syntaxprüfung vor „fertig" |
Web-Assets
Der Browser cacht hart: bei jeder JS/CSS-Änderung in web/index.html die
Asset-Version ?v=N hochzählen. Der Server sendet Cache-Control: no-store.
Datenhaltung
oil_widget_history.db(SQLite):trades,recommendations,candles_m1u. a. Nicht im Repo (per.gitignore) — vor Eingriffen Backup (*.bak-<datum>).- Laufzeit-State (
emergency_state.json,runtime_state.json,report_state.json) wird vom Server erzeugt und ist ebenfalls nicht versioniert.
Lizenz
Privates Projekt — keine Lizenz vergeben.