M15-Karte: Selbstmessung entkoppelt - 60 % waren 53 %
User fragte nach einer zweiten Karte auf M5. Die Antwort haengt daran, ob die bestehende traegt - und sie misst sich seit 08.08. selbst. Befund: die Karte zeigte 60 % Trefferquote. Zwei Gruende, warum das nichts belegt. (1) Geclustert: m15_accuracy nahm die letzten 200 Zeilen ohne Entkopplung, bei ~990 Zustandswechseln/Tag sind das fuenf Stunden derselben Marktlage. Aus 2.302 rohen bleiben 114 unabhaengige. (2) Regime: das Fenster lief +4,93 $, und roh liest die Karte "auf" zu 62 % richtig und "ab" zu 46 % - das ist der Trend. Entkoppelt: 53-54 %, KI [46 ... 63] - enthaelt die 50. Der handlungsrelevante Zustand (gruen + gerichtet) liegt bei 45,5 %. Behoben: m15_accuracy entkoppelt (Schluessel Level+Stunde) und meldet beide Zahlen. Anzeige jetzt 53 % statt 60 %. Antwort auf die M5-Frage: nein, jetzt nicht - die erste Karte hat kein Urteil, M5 waere teurer (0,193 gegen 0,104), die M5-Information ist grossenteils schon da (Gate 3b rechnet bereits auf M5), und eine zweite Karte verdoppelt die Drift-Flaeche. Offen benannt: die Karte flackert (~990 Wechsel/Tag). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b2a1e35f5e
commit
e882d795a6
@@ -6161,6 +6161,52 @@ Neumessung. Sie bleiben unverändert und reproduzierbar; wo ihre Schlussfolgerun
|
||||
relevant wird, gehört sie live-treu **neu gerechnet** (Muster:
|
||||
`backtest_auto_signal_norev.py`).
|
||||
|
||||
## ⚠⚠ DIE M15-KARTE HAT SICH ZUM ERSTEN MAL SELBST GEMESSEN (2026-08-12)
|
||||
|
||||
Anlass: User-Frage „könntest du mir auch eine **M5** · Setup-Bereitschaft bauen?
|
||||
Ist das sinnvoll?" — die Antwort hängt daran, ob die BESTEHENDE Karte trägt.
|
||||
Seit dem 08.08. misst sie sich selbst (`m15_states`), 2.346 ausgewertete Zustände.
|
||||
|
||||
⚠⚠ **DIE KARTE ZEIGTE 60 % — UND DAS WAR IRREFÜHREND.**
|
||||
| | |
|
||||
|---|---|
|
||||
| Anzeige (roh, letzte 200 Zeilen) | **60 %** |
|
||||
| **entkoppelt** (max 1 je Level+Stunde) | **53–54 %**, KI **[46 … 63 %]** ⚠ enthält 50 |
|
||||
| davon **grün + gerichtet** (der handlungsrelevante Zustand) | **45,5 %** |
|
||||
Zwei unabhängige Gründe:
|
||||
**(1) Geclustert.** `m15_accuracy` nahm `ORDER BY id DESC LIMIT 200` ohne
|
||||
Entkopplung. Der Zustand wechselt **~990×/Tag** — 200 Zeilen sind rund fünf
|
||||
Stunden DERSELBEN Marktlage. Aus 2.302 rohen Zeilen bleiben **114 unabhängige**.
|
||||
**(2) Regime.** Das Messfenster (10.–12.08.) lief **+4,93 $** (78,74 → 83,68).
|
||||
Roh liest die Karte „auf" zu **62 %** richtig und „ab" zu **46 %** — das ist der
|
||||
Trend, nicht die Karte.
|
||||
✅ **BEHOBEN:** `m15_accuracy` entkoppelt jetzt (Schlüssel Level+Stunde, wie
|
||||
`core.stichprobe.schluessel_level_stunde`) und meldet beide Zahlen —
|
||||
„114 unabh. Zustände aus 2302". Angezeigt werden jetzt **53 %** statt 60 %.
|
||||
⚠ Dieselbe Cluster-Falle hat im Projekt schon die Fälligkeitsbedingung
|
||||
`pbreak_accuracy_v2` um das ZEHNFACHE danebenliegen lassen und am 07.08. elf
|
||||
Hypothesen ausgelöst. Sie ist hier dieselbe — und sie steckte in einer Zeile,
|
||||
die ich am 08.08. selbst gebaut habe.
|
||||
|
||||
✅ **ANTWORT AUF DIE M5-FRAGE: NEIN, jetzt nicht.**
|
||||
· **Die bestehende Karte ist nicht belegt** (KI enthält 50, handlungsrelevanter
|
||||
Zustand 45,5 %). Eine zweite nach demselben Muster zu bauen, bevor die erste
|
||||
ein Urteil hat, ist genau das Vorgehen, das dieses Projekt sonst zurückweist.
|
||||
· **M5 wäre teurer**: Spread/ATR **0,193** gegen 0,104 auf M15 — die Kostenseite
|
||||
ist der einzige gemessene Vorteil der M15-Karte.
|
||||
· **Die M5-Information ist grösstenteils schon da**: der Squeeze-Zustand
|
||||
(armed/active) steht in der Meldungen-Karte, Gate ③b rechnet **bereits auf M5**
|
||||
(`room_info`), ebenso die P(break)-Merkmale. Die „M15-Karte" ist längst ein
|
||||
Hybrid (M30-Level · ATR_M15 · M5-Raum/P(break)).
|
||||
· **Doppelte Drift-Fläche**: allein diese Woche steckten in der EINEN Karte drei
|
||||
Defekte (Bias als Richtungsgeber · Ziel in der verbotenen Richtung · fehlende
|
||||
Raum-Zeile). Eine zweite verdoppelt die Stellen für die Veto→Richtung-Falle.
|
||||
⚠ **OFFEN, benannt:** die Karte **flackert** — ~990 Zustandswechsel/Tag, also
|
||||
alle 1,5 min. Das ist selbst ein Befund und der nächste sinnvolle Schritt.
|
||||
✅ **Bedingung für ein Ja:** wenn die entkoppelte Trefferquote bei ≳350 Fällen
|
||||
(dieselbe Latte wie `pbreak_accuracy_v2`) über 50 % liegt und das Intervall die
|
||||
Null-Linie ausschliesst. Vorher ist eine zweite Karte Zierde, kein Werkzeug.
|
||||
|
||||
## ✅✅ SYSTEMZUSTAND IM TAGESREPORT (2026-08-11) — der fehlende letzte Meter
|
||||
|
||||
**Selbständige Empfehlung nach der Gesamtprüfung, vom User beauftragt.**
|
||||
|
||||
+31
-6
@@ -636,26 +636,51 @@ class HistoryLogger:
|
||||
|
||||
⚠ Gegen 50 % zu lesen, nicht gegen 0. Und ⚠ die Karte behauptet KEINE
|
||||
freie Richtung — gemessen wird nur, ob die BEDINGTE Lesart am Level
|
||||
(„Abprall -> eher abwaerts") getroffen hat."""
|
||||
(„Abprall -> eher abwaerts") getroffen hat.
|
||||
|
||||
⚠⚠ ENTKOPPELT seit 2026-08-12. Vorher nahm die Abfrage schlicht die
|
||||
letzten N Zeilen (`ORDER BY id DESC LIMIT ?`). Die sind NICHT unabhaengig:
|
||||
der Zustand wechselt ~990x/Tag, 200 Zeilen sind also rund fuenf Stunden
|
||||
DERSELBEN Marktlage, vielfach gezaehlt. Die Karte zeigte dadurch **60 %**,
|
||||
entkoppelt sind es **54,4 %** mit dem Intervall [46 … 63] — also nicht von
|
||||
der Muenze zu unterscheiden.
|
||||
⚠ Dieselbe Cluster-Falle hat im Projekt schon die Faelligkeitsbedingung
|
||||
`pbreak_accuracy_v2` um das ZEHNFACHE danebenliegen lassen (07.08.) und
|
||||
elf Hypothesen ausgeloest (07.08.). Sie ist hier dieselbe.
|
||||
⚠ Schluessel = (Level auf 2 Stellen, Stunde) — identisch zu
|
||||
`core.stichprobe.schluessel_level_stunde`, damit beide Auswertungen
|
||||
dieselbe Definition benutzen.
|
||||
"""
|
||||
try:
|
||||
with self._lock, self._connect() as conn:
|
||||
rows = conn.execute("""
|
||||
SELECT hit30, hit60, ret30 FROM m15_states
|
||||
# ⚠ Grosszuegig lesen und DANACH entkoppeln — sonst waeren nach der
|
||||
# Entkopplung nur noch eine Handvoll Faelle uebrig.
|
||||
raw = conn.execute("""
|
||||
SELECT hit30, hit60, ret30, level, ts FROM m15_states
|
||||
WHERE done=1 AND lesart IN ('auf','ab')
|
||||
ORDER BY id DESC LIMIT ?
|
||||
""", (int(last_n),)).fetchall()
|
||||
""", (int(last_n) * 40,)).fetchall()
|
||||
offen = conn.execute(
|
||||
"SELECT COUNT(*) FROM m15_states WHERE done IS NULL "
|
||||
"AND lesart IN ('auf','ab')").fetchone()[0]
|
||||
except Exception:
|
||||
return {"n": 0}
|
||||
seen, rows = set(), []
|
||||
for r in raw:
|
||||
k = (round(r[3] or 0.0, 2), int((r[4] or 0) // 3600))
|
||||
if k in seen:
|
||||
continue
|
||||
seen.add(k)
|
||||
rows.append(r)
|
||||
if len(rows) >= int(last_n):
|
||||
break
|
||||
n = len(rows)
|
||||
if not n:
|
||||
return {"n": 0, "offen": offen}
|
||||
return {"n": 0, "offen": offen, "roh": len(raw)}
|
||||
h30 = [r[0] for r in rows if r[0] is not None]
|
||||
h60 = [r[1] for r in rows if r[1] is not None]
|
||||
r30 = [r[2] for r in rows if r[2] is not None]
|
||||
return {"n": n, "offen": offen,
|
||||
return {"n": n, "offen": offen, "roh": len(raw),
|
||||
"wr30": round(100 * sum(h30) / len(h30)) if h30 else None,
|
||||
"wr60": round(100 * sum(h60) / len(h60)) if h60 else None,
|
||||
"avg30": round(sum(r30) / len(r30), 3) if r30 else None}
|
||||
|
||||
+9
-1
@@ -323,11 +323,19 @@ function renderM15(s) {
|
||||
// ── ⑥ Selbstmessung: die Karte zeigt ihre EIGENE Trefferquote ────────
|
||||
// ⚠ Gegen 50 % lesen. Gemessen wird die BEDINGTE Lesart am Level, nicht
|
||||
// eine freie Prognose — die ist gemessen unmöglich (AUC 0,52 in-sample).
|
||||
// ⚠⚠ ENTKOPPELT seit 2026-08-12. Vorher stand hier die ROHE Quote der letzten
|
||||
// 200 Zeilen — bei ~990 Zustandswechseln/Tag sind das fünf Stunden derselben
|
||||
// Marktlage, vielfach gezählt. Angezeigt wurden dadurch **60 %**, entkoppelt
|
||||
// sind es **53 %**. Dieselbe Cluster-Falle hat im Projekt schon eine
|
||||
// Fälligkeitsbedingung um das Zehnfache danebenliegen lassen.
|
||||
// ⚠ `n` ist jetzt die ENTKOPPELTE Zahl (max 1 je Level+Stunde), `roh` die
|
||||
// gelesene — beide werden genannt, damit die Schrumpfung sichtbar bleibt.
|
||||
const tk = s.m15_track || {};
|
||||
const tEl = $("m15-track");
|
||||
if (tk.n >= 20 && tk.wr30 != null) {
|
||||
tEl.className = "m15-item " + (tk.wr30 >= 55 ? "ok" : tk.wr30 <= 45 ? "warn" : "");
|
||||
tEl.textContent = `⑥ eigene Trefferquote (${tk.n} Zustände): ${tk.wr30} % auf 30′`
|
||||
tEl.textContent = `⑥ eigene Trefferquote (${tk.n} unabh. Zustände`
|
||||
+ (tk.roh ? ` aus ${tk.roh}` : "") + `): ${tk.wr30} % auf 30′`
|
||||
+ (tk.wr60 != null ? ` · ${tk.wr60} % auf 60′` : "")
|
||||
+ ` · Ø ${tk.avg30 == null ? "—" : (tk.avg30 >= 0 ? "+" : "") + f(tk.avg30, 3)}×ATR`;
|
||||
} else {
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@
|
||||
<meta name="theme-color" content="#0d1117">
|
||||
<title>Oil · MT5</title>
|
||||
<link rel="manifest" href="manifest.json">
|
||||
<link rel="stylesheet" href="style.css?v=163">
|
||||
<link rel="stylesheet" href="style.css?v=164">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Modul-Menü (ganz oben) -->
|
||||
@@ -354,6 +354,6 @@
|
||||
</div>
|
||||
<div id="toast" class="toast hidden"></div>
|
||||
|
||||
<script src="app.js?v=163"></script>
|
||||
<script src="app.js?v=164"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user