Axel HocksandClaude Opus 5 a35ea38d31 Tagestrend: vier Varianten gemessen, keine besteht - nichts gebaut
User: "hast du Optimierungsvorschlaege um den Tagestrend mehr Gewicht zu
verleihen?" Vier konkrete Vorschlaege, alle VORHER gemessen statt gebaut.
backtest_tagestrend.py (neu): 60k M5 = 244 Handelstage, voller Live-Gate-Stack
(echtes `_build` + Breakout k=0,3 + `_room_gate`), kanonischer Exit,
Echtkosten, 2 Halbjahre, 95-%-Bootstrap, Schwellen 0,15 / 0,30 / 0,60 %.
Tagestrend = Kurs gegen die TAGESEROEFFNUNG (Berlin, DST-korrekt) - das, was
ein Mensch sieht, und es braucht keinen 16.000-Bar-Vorlauf.

                        H1 OeR/SR        H2 OeR/SR       n
  BASIS               -0,062 / -34,9   -0,107 / -88,9   563/831
  A VETO              -0,058 / -31,5   -0,114 / -89,5   543/785
  B NUR-MIT           -0,010 /  -4,8   -0,126 / -86,1   483/683
  C SPAET (3,5->5,0)  -0,031 / -20,3   -0,089 / -84,8   656/953
  D PULLBACK          -0,008 /  -1,6   -0,012 /  -3,5   196/291

A und B: in H2 an ALLEN DREI Schwellen schlechter als BASIS; die von ihnen
entfernte Gruppe kippt zwischen den Haelften (+0,032 bzw. +0,208 in H2) - sie
werfen also teils die BESSEREN Trades weg. Vierte Messung dieser Klasse nach
Hoeher-TF-Winkel, H1-Staerke und Konfluenz-Strafe.

C sieht beidhaelftig besser aus und ist trotzdem kein Beleg: die zusaetzlich
genommenen Trades sind H1 -0,134 / H2 +0,060, also gegenlaeufig. Aufloesung in
der Mechanik: die Sim hat EINEN Slot, ein Extra-Trade verschiebt die GANZE
Folge. C ist keine Obermenge von BASIS, sondern eine andere Trade-Folge - der
scheinbare Gewinn ist ein Selektionseffekt (die Falle vom 14.08.).

D hat als EINZIGE die richtige Signatur: beidhaelftig besser an allen drei
Schwellen, und die ENTFERNTE Gruppe ist an allen SECHS Stellen negativ
(-0,068/-0,060/-0,063 und -0,072/-0,080/-0,053). Trotzdem kein Bau: jedes
Intervall enthaelt die Null, und der SR-Sprung kommt fast vollstaendig daher,
dass D nur noch 35 % der Trades nimmt - Handelsvermeidung, nicht Edge (Muster
aus backtest_metalabel.py).

INHALTLICHE ANTWORT im Vergleich C gegen D: wenn der Tagestrend etwas
beitraegt, dann NICHT als Erlaubnis fuer den spaeten Einstieg, sondern als
Kontext fuer den RUECKSETZER. Deckt sich mit dem einzigen belegten
Einstiegs-Effekt (Pullback-Bonus +15) und mit dem invertierten Winkel-Befund
vom 04.08.
Ehrlichster Satz zum Lauf: die BASIS-Population ist mit -0,062/-0,107 selbst
negativ. Kein Umgang mit dem Tagestrend macht daraus einen Edge.
29. verworfener Signal-Eingriff.

METHODEN-BEFUND ueber den Lauf hinaus: das Werkzeug fuer den gepaarten
Vergleich war hier das FALSCHE - und es hat es selbst gezeigt (Delta +0,000,
KI von exakt 0,000 bis 0,000 in ALLEN acht Zellen). Diese Varianten aendern
nicht den EXIT, sondern WELCHE Einstiege genommen werden; auf gemeinsamen
Faellen sind die R-Werte per Konstruktion identisch.
Regel: gepaart fuer EXIT-Varianten, Auswertung der entfernten bzw.
hinzugefuegten Gruppe fuer AUSWAHL-Varianten. Ein Intervall von exakt
[0,000 .. 0,000] ist kein Ergebnis, sondern die Fehlermeldung eines falsch
gewaehlten Tests.

Nachtrag: die Nachricht des ersten Commit-Versuchs wurde von der
dokumentierten Backtick-Falle beschaedigt (Kommando-Substitution in der
Bash-Zeile). Diese Fassung kommt ueber eine Datei.

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