README.md hinzugefügt (Setup + Architektur-Überblick)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
75d28827e8
commit
6318817ac1
@@ -0,0 +1,111 @@
|
|||||||
|
# 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.
|
||||||
Reference in New Issue
Block a user