User-Wunsch, mit einer Vorlage im Format "USOIL BUY SETUP: Entry Zone / Stop
Loss / Take Profit 1-3".
(1) TRADE-LEISTE — drei Anzeige-Boxen fuer die LAUFENDE Position:
TP1 · Level naechstes STEHENDES M30-Level in Trade-Richtung + P(haelt)
TP2 · Trailing der Broker-TP, den `core/trailing.py` dynamisch fuehrt
TP3 · Kegel Obergrenze des 80-%-Bandes auf 120 min (core/cone.py)
Live gegengerechnet: 85.745 (67 % haelt) / 86.634 / 86.153 (trifft 75 %).
(2) M15-KARTE — Setup-Block im Format der Vorlage, direkt unter dem Banner:
Richtung · Entry Zone (Level ± 0,15xATR) · Stop Loss (2,0xATR_M15) ·
TP1 (Gegenlevel) · TP2 (3,5xATR) · TP3 (Kegel 120').
Blendet sich aus, wenn kein Veto, keine Zone oder kein ATR vorliegt -
aktuell ist genau das der Fall (M30 flach -> kein Veto -> keine erlaubte
Richtung), und das ist korrektes Verhalten, kein Fehler.
⚠⚠ DREI LEITPLANKEN, damit daraus keine Prognose wird:
- Die RICHTUNG kommt ausschliesslich aus dem VETO (erlaubte Richtung). Die
Karte gibt weiterhin KEINE Richtungsprognose ab - die ist ueber 1.071
Live-Episoden als Muenzwurf gemessen (48-51 %). Ohne Veto: kein Block.
- Die drei TP sind ANZEIGE, nichts davon geht an den Broker. Ein FESTER TP am
Gegenlevel ist der staerkste Gewinner-Kappen-Beleg des Projekts: er drehte
den Squeeze von +0,102/+0,108 auf -0,066/-0,004 (backtest_trailing_sr.py).
Deshalb steht an TP2 ausdruecklich, dass das Trailing ihn nachfuehrt.
- NICHTS wird neu gerechnet - Zonen, ATR und Kegel stehen im Snapshot. Ein
zweiter Rechenweg waere die Divergenz-Falle (dreimal zugeschlagen).
- Neutral gerahmt, nicht gruen/rot: der Block sagt WO, nicht OB.
Die 0,15xATR der Entry Zone sind die im Projekt gemessene "Beruehrung"
(dieselbe Schwelle wie `at_level` im S/R-Hinweis), nicht geraten.
Reine Frontend-Aenderung (v=195), kein Neustart. node --check, Render-Probe und
die volle Pipeline gruen.
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.