# 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`](CLAUDE.md)
> und [`docs/`](docs/).

## Überblick

- **`server.py` + `core/engine.py`** — headless FastAPI-Web-Backend, das die
  **Mobile-PWA** in [`web/`](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`](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:
   ```bash
   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`](core/config.py).
3. MT5-Terminal starten und einloggen.

## Starten

```bash
# Ä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.
