diff --git a/measurement_reminder.py b/measurement_reminder.py index 0f6bc48..136b6ce 100644 --- a/measurement_reminder.py +++ b/measurement_reminder.py @@ -49,6 +49,55 @@ def _days_since(iso: str) -> float: # have = aktueller Stand · need = Schwelle · unit = Anzeigeeinheit # cmd = was zu tun ist, wenn fällig CHECKS = [ + { + # ⚠⚠ WIEDERVORLAGE aus dem Backtest vom 2026-08-12 + # (`backtest_srclose_reentry.py`). Die Frage des Users: wenn das + # P(break)-Gate schliesst („Level haelt") und die Linie bricht doch — + # lohnt der Wiedereinstieg? Ergebnis ueber 2 Halbjahre: + # 0,3×ATR H1 +0,119 [−0,138 … +0,387] · H2 +0,196 [+0,065 … +0,332] + # 0,5×ATR H1 −0,043 · H2 +0,043 + # 0,7×ATR H1 +0,079 · H2 +0,014 + # Die vorab fixierte Regel ist verfehlt (H1s KI enthaelt die Null, und + # der Nachbar 0,5 dreht H1 negativ). ABER: der OeR ist bei 0,3 in BEIDEN + # Haelften positiv, und zwei gleichgerichtete Haelften sind mehr als eine + # — „KI enthaelt 0" heisst nicht widerlegt, sondern nicht belegt. + # ⚠ Der Backtest kann NICHT besser werden: H1 ist feste Historie, und die + # M5-Tiefe des Brokers ist bei 80k Bars gedeckelt. Was waechst, sind + # LIVE-Faelle — und die stehen bereits in `pbreak_predictions` + # (predicted='bounce' + outcome='break' = genau dieser Fall). + # ⚠⚠ ENTKOPPELT ZAEHLEN — und das ist nicht kosmetisch. Beim Aufsetzen + # dieser Bedingung habe ich zuerst „roh 193 = entkoppelt 193" gemessen + # und daraus ~17 Faelle/Tag geschlossen. Falsch: `schluessel_level_stunde` + # ist eine FABRIK und muss AUFGERUFEN werden; uebergibt man sie selbst, + # ist jeder Schluessel ein neues Funktionsobjekt und es wird nichts + # dedupliziert. Richtig sind **55** Faelle = **~4,9/Tag**. + # (Die zwei echten Verwendungen in `analyze_divergence.py` rufen sie + # korrekt auf — nur die Ad-hoc-Auswertung war betroffen.) + # SCHWELLE 500: loest einen wahren OeR ab ~0,118 auf (n > (1,96·1,35/OeR)² + # bei der gemessenen SD ~1,35) und deckt damit auch die UNTERE + # Backtest-Schaetzung (+0,12) ab. Bei ~4,9/Tag sind das **~3 Monate**. + # ⚠ Bewusst NICHT kleiner: bei n=175 (~25 Tage) waere nur ein OeR ≥0,20 + # aufloesbar — die Bedingung liefe ab, ohne entscheiden zu koennen. + # Genau dieser Fehler steckte in `pbreak_accuracy_v2` (Faktor 10 zu + # frueh faellig). Lieber spaet und entscheidbar als frueh und wertlos. + "key": "srclose_reentry", + "title": "Wiedereinstieg nach S/R-Close erneut prüfen (Live-Daten)", + "why": "Backtest 2026-08-12 nicht entscheidbar: bei 0,3×ATR " + "Bestätigung ØR +0,119/+0,196 — beidhälftig positiv, aber H1s " + "95-%-KI enthält die Null und der Nachbar 0,5 kippt H1. Der " + "Backtest kann nicht besser werden (H1 ist feste Historie); " + "was wächst, sind Live-Fälle. Auswerten: die Fälle mit " + "predicted='bounce' und outcome='break' gegen den kanonischen " + "Exit rechnen (Vorlage: analyze_srclose_reentry.py) und gegen " + "die Backtest-Erwartung +0,12…+0,20 halten.", + "have": lambda: _q( + "SELECT COUNT(*) FROM (SELECT DISTINCT ROUND(level,2), ts/3600 " + "FROM pbreak_predictions WHERE predicted='bounce' " + "AND outcome='break' AND ts >= 1785492000)"), # 31.07.2026 12:00 + "need": 500, + "unit": "entkoppelte Fälle 'Gate schliesst, Level bricht doch' ab 31.07.", + "cmd": "python analyze_srclose_reentry.py (bzw. auf pbreak_predictions erweitern)", + }, { # ERLEDIGT 2026-07-31 (analyze_pbreak_live.py, 2275 Vorhersagen): das Modell # hält live NICHT — AUC 0,539 statt 0,71, Kalibrierung sagt 8 % wo 39 %