C: Wahrscheinlichkeits-Kegel (kalibriert) + Config-Waechter im Reminder

C - core/cone.py + Kachel #card-cone + MT5 v1.31 (CN;<min>;<lo>;<hi>):
"Erwartete Spanne" statt "Kursvorhersage". Der User wollte eingezeichnete
Verlaufspfade; bewusst NICHT gebaut - sie suggerieren eine Praezision, die
es nicht gibt (Lehre aus analyze_verdict_calibration.py). Der Kegel sagt
wie WEIT der Kurs in 30/60/120 min plausibel laeuft, nicht wohin.

analyze_cone.py: r(h)=(C[i+h]-C[i])/ATR[i], Fit auf H1, Abdeckung gemessen
auf H2 (echtes out-of-sample):
  80%-Band -> 76,7 / 76,6 / 75,3 %
  90%-Band -> 87,5 / 87,2 / 86,5 %
Konsistent ~3-5 Pp ZU ENG. Das wird NICHT weggefittet - Kachel und Tooltip
nennen die REAL gemessene Abdeckung, nicht den Nennwert. Damit nach dem
P(break)-Modell die zweite kalibriert geprueft Komponente im Projekt.

Zentriert auf den aktuellen Kurs, KEINE Drift addiert (Median +-0,0..0,16
xATR = klein gegen die Bandbreite; eine Drift-Korrektur waere eine
Richtungsaussage und die ist nicht belegt). Farbe neutral grau, kein
gruen/rot. Kein Signal, kein Verdict-Gewicht.

MQL5 v1.31: zwei sich oeffnende gepunktete Pfade, verkettet 30->60->120.
Startpunkt aus der PX-Zeile - die setzt g_conePx jetzt auch, wenn
InpShowPrice aus ist (sonst verliert der Faecher seinen Anker).

Config-Waechter in measurement_reminder.py (Antwort auf "sollten wir alle
verworfenen Backtests woechentlich neu rechnen?"): NEIN - eine Woche sind
~2000 Bars, und 18 Ideen x 52 Wochen = 936 Tests/Jahr erzeugen bei 5 %
Fehlalarmquote ~47 falsche "funktioniert jetzt!" pro Jahr. Stattdessen
EREIGNIS-gesteuert: CONFIG_DEPS verankert 8 config-abhaengige Messungen an
den Wert, gegen den sie validiert wurden (entry_room_atr 0,6 /
sr_close_pbreak 0,55 / breakout_k 0,3 / risk_pct 0 / margin_buffer_pct 95 /
adverse_15min_atr 0,5 / auto_signal_min_conf 75 / dead_hours leer). Weicht
einer ab, meldet der Timer welche Messung veraltet ist. Numerischer
Vergleich, damit 0.60 == 0.6. Mit 5 synthetischen Szenarien getestet.

Erledigt ausgetragen: Chartmuster-Kontrolltest (30.07., Muster schlagen die
Kontrolle in beiden Haelften +0,022/+0,108).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-31 08:25:29 +02:00
co-authored by Claude Opus 5
parent 03be3b8f5f
commit d9cb54a52c
9 changed files with 508 additions and 21 deletions
+19
View File
@@ -43,6 +43,7 @@ from core.gaps import GapAnalyzer
from core.structure import MarketStructure
from core.patterns import PatternDetector
from core.candles import CandleAnatomy
from core.cone import build as _cone_build
from core.candle_logger import CandleLogger
from core.wave_rec import (_atr as _wr_atr, _ema_last,
_EMA_FAST, _EMA_SLOW, _TREND_DEADBAND, _STRETCH_MAX)
@@ -2093,6 +2094,19 @@ class TradingEngine:
lines.append(f"PX;{_bid}")
except Exception:
pass
# WAHRSCHEINLICHKEITS-KEGEL: CN;<minuten>;<lo>;<hi> je Horizont (30/60/120),
# aufsteigend — der Indikator verbindet sie vom aktuellen Bar aus zu zwei
# sich öffnenden Pfaden. ⚠ Streuung, NICHT Richtung: der Kegel ist um den
# aktuellen Kurs zentriert und sagt nur, wie weit der Kurs plausibel läuft.
# Out-of-sample kalibriert (`analyze_cone.py`), 80 %-Band trifft real ~76 %.
try:
_atr5 = float(((self.wave.snapshot() or {}).get("pb_feats") or {})
.get("atr") or 0.0)
_cn = _cone_build(_bid, _atr5, bands=(80,))
for lv in (_cn or {}).get("levels", []):
lines.append(f"CN;{lv['minutes']};{lv['lo']};{lv['hi']}")
except Exception:
pass
# G/V der offenen Position, direkt unter dem Kurs (User-Wunsch 2026-07-30):
# PL;wert;waehrung. **NETTO** wie im Dashboard — bei Gewinn abzüglich der
# WHT-Quellensteuer, die der Broker einbehält (`[trading] wht_pct`); bei
@@ -2714,6 +2728,11 @@ class TradingEngine:
# Kerzen-Anatomie (M5) — reine Anzeige, KEIN Verdict-Gewicht (gemessen:
# Lehrbuch-Deutung invertiert, Handelssignal durchgefallen).
"candle_anat": self.candle_anat.snapshot(),
# Wahrscheinlichkeits-Kegel (Streuung, NICHT Richtung) — out-of-sample
# kalibriert (`analyze_cone.py`). Reine Anzeige.
"cone": _cone_build(
(market or {}).get("bid"),
float(((wave_snap or {}).get("pb_feats") or {}).get("atr") or 0.0)),
"stats_compact": {"week": self._compact_stats("week"),
"all": self._compact_stats("all")},
"close_alert_count": self._close_alert_count,