Axel HocksandClaude Opus 5 0966caf1b8 G/V-Trennung geprueft: Adoptions-Sperre riss bei JEDEM Neustart auf
User: "ueberpruefe ob wirklich die G/V und G/V BRK Anzeigen stimmen, besonders
bei gleichzeitig laufenden Trades. Die Anzeige darf jeweils nur den eigenen
Slot anzeigen."

FRONTEND SAUBER: #hdr-pnl liest nur d.position, #hdr-pnl-brk nur
d.position_brk - keine Summe, kein Fallback. Aber das ist die falsche Stelle
zum Suchen: stehen im Backend beide Felder auf derselben Position, kann keine
Anzeige das mehr richten. Geprueft wurde deshalb die AUSWAHL in
TradeManager._refresh_locked.

⚠⚠ FUND 1 - die Sperrliste kannte nur zwei von DREI Quellen eines BRK-Tickets:
  trader_brk.ticket     nur im Speicher
  _pending_tickets      nur im Speicher
  _brk_restore          FEHLTE - und nur das ueberlebt den Neustart
Nach einem Neustart sind die ersten beiden leer, und die Reihenfolge im
_pos_loop besiegelt es: trader.refresh() laeuft DREI Zeilen vor _rebind_brk().
Slot 1 greift die BRK-Position also, bevor sie zurueckgebunden werden kann.
_rebind_brk erkennt das zwar und bricht ab - damit ist der Schaden aber nur
festgestellt, nicht behoben: die BRK-Position haengt am falschen Slot, ihr G/V
steht links statt rechts, und "G/V BRK" zeigt "—". Danach sieht alles normal
aus, was es besonders schwer sichtbar macht.
Behoben ueber getattr(..., None), also unabhaengig davon, WANN das Attribut
gesetzt wird - genau die Reihenfolge-Falle, die in zwei Tagen zweimal
zugeschlagen hat.

 FUND 2 - zwei verschiedene Rechnungen nebeneinander. Bei geschlossenem
Markt zeigt Slot 1 seit dem 01.08. eine HL-Schaetzung (pnl_hl), der BRK-Slot
bekam die nie und zeigte den EINGEFRORENEN Broker-Wert, ohne dass man es der
Anzeige ansieht. Neu pnl_hl_brk, mit ≈ markiert. Geprueft statt angenommen,
dass _tick_size/_tick_value am BRK-Slot gesetzt sind.

 day_pl.open summiert korrekt BEIDE Slots - die Summe gehoert dorthin, die
Trennung in die beiden G/V-Felder.

BELEG - tests/test_slot_gv.py, 6 Tests auf dem ECHTEN TradeManager (Broker
gestubbt): zwei Positionen gleichzeitig je im eigenen Slot · Slot 1 adoptiert
die BRK-Position nicht · Pending-Fill wird nicht weggeschnappt · der BRK-Slot
adoptiert nie · plus die Regressionsprobe, die den alten Zustand festhaelt.
NEUE PIPELINE-STUFE E (tools/check_slots.py): die Sperrliste muss alle drei
Namen erwaehnen. Mutationsprobe: Merker entfernt -> Exit 1.
⚠⚠ Ehrlich zur Arbeitsteilung: der pytest belegt den MECHANISMUS, baut die
Lambda aber selbst nach und bleibt bei der Mutation gruen. Erst die statische
Stufe belegt, dass die ENGINE sie richtig verdrahtet. Keine der beiden allein
haette gereicht.

⚠⚠ NEBENBEFUND, korrigiert: mein Schreib-Helfer hat SECHS Dateien still von
LF auf CRLF gedreht (io.open(...,"w") uebersetzt auf Windows). Mein erster
Check mit `grep -c $'\r$'` meldete faelschlich 0 - erst die BYTE-Zaehlung zeigte
8959 CR in CLAUDE.md. Alle sechs auf LF zurueckgesetzt. core.autocrlf=true
haette es im Repo normalisiert, im Arbeitsbaum aber nicht.

Live verifiziert: Slot 1 T=50396824 (+10,34), BRK flat, day_pl.open 10,34 -
kein gemeinsames Ticket. Deploy mit --feld pnl_hl_brk, alle 5 Schritte gruen.
⚠ Noch nicht beobachtet: ein Neustart MIT offener BRK-Position - der Fall, den
der Fix adressiert.

v=201.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 13:07:16 +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%