Initial commit: Oil Trading Bot (MT5, WTI)

Headless FastAPI-Backend (server.py + core/engine.py) mit Mobile-PWA (web/),
Strategie-/Backtest-Suite und Doku. Secrets, DB, Logs und Laufzeit-State sind
via .gitignore ausgeschlossen; Config-Vorlage: oil_widget_config.ini.example.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-24 08:29:23 +02:00
co-authored by Claude Opus 4.8
commit 75d28827e8
104 changed files with 21059 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
# Risiko-Management (Positionsgröße & Stops)
Stand: 2026-07-08.
## Positionsgröße
> **Aktiv (User-Vorgabe): margin-basiert 95 %.** `calc_lots` setzt die Lots auf
> ~95 % der freien Margin (`[trading] margin_buffer_pct=95`, `risk_pct=0`). ⚠ Das
> ist faktisch All-in: **~7 %+ Konto-Risiko pro Trade** (gemessen
> `backtest_sizing.py`: 36 % Wahrscheinlichkeit eines >80 %-Drawdowns). Bewusste
> Entscheidung — 2026-07-06 kurz auf risiko-basiert 1,5 % gestellt, dann auf
> 95 % Margin zurück. Der harte Broker-SL wird trotzdem immer gesetzt.
Das **risiko-basierte** Sizing (`calc_lots_risk`) ist gebaut, gemessen und
jederzeit aktivierbar (`[trading] risk_pct = 1.5` + Restart). Es wählt die Lots
so, dass der **Verlust beim Initial-SL ≈ `risk_pct` % der Equity** ist:
```
val_per_price = tick_value / tick_size # € je 1.0 Preis je 1 Lot
lots = (Equity × risk_pct/100) / (SL_Distanz × val_per_price)
```
- **SL zuerst:** `_send_locked` berechnet erst den SL (`_calc_sl_tp`, Band
1,82,2×ATR), dann die Lots aus der **echten** SL-Distanz.
- **Margin bleibt Deckel:** nie mehr Lots als die freie Margin (× Buffer) erlaubt.
- **Fallback:** liefert `calc_lots_risk` 0 (fehlende Daten), greift `calc_lots`.
- Vergleich (102-€-Konto, SL 2×ATR≈0,53): 95 % Margin ≈ 0,15 L → 7 € (6,8 %)
am SL · 1,5 % Risiko ≈ 0,03 L → 1,40 € (1,4 %).
## Stops & Auto-Close
- **Harter Broker-SL auf jeder Bot-Order** (`req["sl"]`) — server-seitig, wirkt
auch bei Bot-/Verbindungsausfall. Band 1,82,2×ATR (Ziel 2,0; gemessen
`backtest_exit.py`); Breakeven ab +1,3×ATR; Trailing Init/Trail/Lock
(Parameter gemessen optimal, `backtest_trailing.py`; ATR-Floor 0,06,
`backtest_atrfloor.py`).
- **Adoptierte Fremd-Trades** (in MT5 manuell eröffnet) bekommen beim Erkennen
einen **Schutz-SL** nachgerüstet (`_refresh_locked`), falls keiner gesetzt ist.
- **Notfall-Stop (P&L ≤ Wert) + Gewinn-Ziel (P&L ≥ +Wert):** server-seitiger
Auto-Close (`engine._check_auto_close`, 1-s-Loop, wirkt bei gesperrtem Handy).
Notfall-Stop wird beim Öffnen automatisch auf den letzten Wert armiert
(Start `[trading] auto_emergency_loss`, Default 10 — ⚠ bei ~100-€-Konto sind
10 € ≈ 10 % Equity, das ist der faktische Risiko-Deckel). „aus"-Button
deaktiviert auch den Auto-Arm.
- **SL/TP sind im Snapshot + Web sichtbar** (Position-Kachel) — fehlender SL wird
rot „⚠ kein SL gesetzt!" markiert.
## Bewusst NICHT umgesetzt
- **Tagesverlust-Schalter / Circuit Breaker:** vom User **abgelehnt** — nicht
einbauen (s. CLAUDE.md).
- **Signal-Filter als Risiko-Schutz:** 5× gemessen wirkungslos/schädlich
(Winkel, HTF-Winkel, Konfluenz-Strafe, Gegen-H1-Reversal, ER-Chop-Gate).
Schutz läuft über Stops + Sizing, nicht über das Signal.