Axel HocksandClaude Opus 5 0386497a79 Slot-Pruefung 5. Durchgang: drei Luecken, eine davon gravierend
Diesmal systematisch statt punktuell: alle Methoden von TradingEngine per AST
klassifiziert, welche Slot-Objekte sie beruehren. 36 Funktionen fassen einen
Slot an, 20 davon NUR Slot 1.

⚠⚠⚠ LUECKE 1 (gravierend): EINE FRISCH GEFUELLTE BRK-POSITION HATTE KEIN
TRAILING. trail_brk.toggle() wurde an genau ZWEI Stellen gerufen - _rebind_brk
(nach Neustart) und toggle_trail (der Knopf). Der frische Pending-Fill kam in
keiner davon vor, und das ist der haeufigste Weg, auf dem eine BRK-Position
entsteht (7 von 8 Trades seit dem Pending-Umbau). Sie lief damit nur mit dem
Broker-SL - exakt die Variante, die backtest_brk_slonly.py verworfen hat (alle
zehn KI enthalten die Null, Trefferquote 40 -> 21 %).
Von aussen unsichtbar: die Position sieht in jeder Anzeige normal aus, ihr
fehlt nur der Schutz. Ironie: _rebind_brk loggt "Trailing wiederhergestellt" -
wiederhergestellt wurde etwas, das fuer einen frischen Fill nie an war.

⚠⚠ LUECKE 2: der Market-Fallback schaltete das FALSCHE Trailing ein. _open rief
pauschal self.trail.toggle(). Zwei Schaeden auf einmal: die BRK-Position bleibt
ungeschuetzt UND auf der manuellen Position wird das Trailing wieder
eingeschaltet, auch wenn der Nutzer es dort bewusst abgeschaltet hatte (nach
einer SL-Handeingabe). Sein handgesetzter Stop waere weitergezogen worden.
Noch nicht eingetreten, weil alle acht Fallback-Versuche des 20.08. schon an
der Order scheiterten.

⚠⚠ LUECKE 3: ein geschlossener BRK-Trade loeste KEINE Telegram-Meldung aus.
_close_notify_pending wird in _check_auto_close armiert, das self.trader liest.
Wiegt schwer, weil seit dem 19.08. NUR NOCH "Trade geschlossen" durch den
Telegram-Filter kommt - der autonome Pfad haette vollstaendig still gehandelt.
Behoben in _check_brk_close_cooldown, das den BRK-Flat-Uebergang ohnehin kennt.

Dazu die Reichweiten-Warnung korrigiert: sie sagte "Broker-SL, Trailing und
Circuit-Breaker greifen weiter" - das Trailing tat es eben NICHT.

ABGESICHERT auf zwei Ebenen, beide mutationsgeprueft:
  tests/test_pending_fill.py +2: der Fill MUSS trail_brk einschalten und DARF
    das Trailing von Slot 1 nicht anfassen. Mutation -> Test faellt.
  Pipeline-Stufe E, Regel E: jeder Pfad, der eine BRK-Position eroeffnet
    (_check_pending_fill, _open), MUSS trail_brk erwaehnen. Mutation -> Exit 1.
Die Test-Fixture bekam dafuer erstmals BEIDE Trailing-Attrappen - ohne die war
der gefaehrlichste Slot-Fehler ueberhaupt nicht pruefbar.

GEPRUEFT UND SAUBER: Circuit-Breaker, close(), _check_open_notify, _price_loop,
_write_levels_file, snapshot, die Fill-Bindung, die _pos_loop-Reihenfolge.

BEWUSST NICHT GEAENDERT (Slot-1-only, aber alle Features AUS): _check_auto_close,
_check_sr_close, _check_adverse15, _check_flip_close, _check_auto_m15, set_sltp,
_check_close_alert. _check_slot_reichweite meldet es, sobald eines eingeschaltet
wird. Zweislot-faehig waere ein Umbau der Notfall-Zustandsmaschine - offen.

⚠⚠ ZWEI CONFIG-WERTE SIND AUF 0 ZURUECKGEDRIFTET (nur berichtet):
  close_notify_min_eur      dokumentiert 50 -> ist 0 (Telegram ganz still)
  auto_emergency_margin_pct dokumentiert  8 -> ist 0
Bei close_notify_min_eur = 0 nuetzt auch Luecke 3 nichts - die Vormerkung haengt
an _close_notify_min > 0. Der Bot meldet derzeit gar keinen Trade-Abschluss.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:45:05 +02:00

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.md und docs/.

Überblick

  • server.py + core/engine.py — headless FastAPI-Web-Backend, das die Mobile-PWA in web/ 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. SpotCrude bei Pepperstone).

Einrichtung

  1. Repo klonen.
  2. Config-Vorlage kopieren und mit echten Keys füllen:
    cp oil_widget_config.ini.example oil_widget_config.ini
    
    Dann oil_widget_config.ini ausfüllen (LLM-/News-/Telegram-/Graph-Keys, WTI-Symbol, Trading-Schalter). Diese Datei enthält Live-Secrets und ist per .gitignore vom Repo ausgeschlossen — niemals committen. Erläuterungen zu allen [trading]-Schaltern stehen als Kommentare in core/config.py.
  3. 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_m1 u. 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.

S
Description
No description provided
Readme
88 MiB
Languages
Python 87.2%
JavaScript 5.2%
MQL5 3.4%
CSS 1.9%
HTML 1.5%
Other 0.8%