S/R-Beschriftung: Chart und M15-Karte nannten verschiedene Zahlen (v1.35, v=169)

User: "die Beschriftung fuer S/R im Chart stimmt nicht mit der Analyse in der
M15-Karte ueberein."

Die LEVEL stimmten -- nur die Zahl daneben nicht. Live gegengeprueft: die CSV
enthielt R;82.069;69, Gate 3 der Karte meldete res 82.069 / p_break 69. Beide
kommen aus _draw_levels(), sind also per Konstruktion identisch; auch die
Distanzen sind exakt (0,477~0,48 / 0,909~0,91 / 0,455~0,45).

DER DEFEKT: das Chart schrieb die NACKTE Zahl = P(Bruch), die Karte klappte
unter 45 % still auf P(Abprall) um und nennt 45-55 % "unentschieden".

  P(Bruch) 33 %  ->  Chart "33%"   Karte "67 % Abprall"
  P(Bruch) 46 %  ->  Chart "46%"   Karte "unentschieden"
  P(Bruch) 72 %  ->  Chart "72%"   Karte "72 % Bruch"

Beide Zahlen richtig, aber die Chart-Zahl sagte nicht, WAS sie ist.
GEMESSEN in 88,1 % der Zeit verschieden (1.797 Vorhersagen / 14 Tage: 66,3 %
unter 45 %, 21,9 % im unentschiedenen Band).

Behoben im Indikator v1.35, wortgleich zu app.js. Ueber 1.678 echte
P(break)-Werte gegengeprueft: Uebereinstimmung 0 % -> 100 %.
Ins RICHTIGE Terminal kompiliert (es gibt real zwei Ordner, nur D0E8209F...
bekommt die sr_levels.csv): 0 errors, 0 warnings, .ex5 frisch, Version im
Terminal gegengeprueft.

Zwei Verdachtsmomente ausgeschlossen statt vermutet: eine stehengebliebene
Alt-Linie (der Indikator ruft ObjectsDeleteAll bei jedem Redraw) und ein falsch
einsortiertes Level (_draw_levels waehlt seit 23.07. nach Lage zum Kurs).

ZWEITER Befund derselben Klasse, ebenfalls behoben: Gate 3 und 3b nannten Level
aus VERSCHIEDENEN Zeitebenen, beide nur als "xATR" --
  3   M30-Pivots, ATR_M15, im Chart gezeichnet
  3b  M5-Pivots,  ATR_M5,  NICHT gezeichnet
Real standen "0,48xATR" und "0,45xATR" nebeneinander, die nicht vergleichbar
sind, und die Karte nannte einen "Support 81,78", den man im Chart vergeblich
sucht (alle 10 M30-Pivots lagen ueber dem Kurs).
Die Quellen-Trennung BLEIBT -- entry_room_atr=0,6 ist ueber 80k Bars auf M5
kalibriert. Geaendert wurde nur die Beschriftung plus Tooltips.

Reine Anzeige: an Gates, Gewichten und Order-Logik nichts geaendert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-13 16:06:06 +02:00
co-authored by Claude Opus 5
parent 95521d041c
commit 77ed1d5572
4 changed files with 107 additions and 14 deletions
+24 -6
View File
@@ -219,11 +219,22 @@ function renderM15(s) {
const q = bricht ? `${p} % Bruch` : `${100 - p} % Abprall`;
return `${q}, eher ${auf ? "aufwärts ▲" : "abwärts ▼"}`;
};
// ⚠⚠ ZEITEBENE MIT IM TEXT (Fix 2026-08-13). ③ liest M30-Level und misst in
// ATR_M15, ③b liest M5-Level und misst in ATR_M5. Beide standen vorher nur als
// „×ATR" da — zwei Zahlen nebeneinander (0,48 und 0,45), die vergleichbar
// AUSSAHEN und verschiedene Bezugsgroessen hatten. Die Quellen-Trennung ist
// Absicht (`entry_room_atr=0,6` ist auf M5 kalibriert), die stumme
// Beschriftung war es nicht.
// ⚠ „(Chart)" markiert, dass GENAU diese Linie im MT5-Chart gezeichnet wird —
// die M5-Level aus ③b werden dort NICHT gezeichnet.
$("m15-zone").textContent = z.length
? "③ " + z.map(x => `${x.seite === "res" ? "Widerstand" : "Support"} `
+ `${f(x.level, 3)} (${f(x.gap_atr15)}×ATR)${lesart(x)}`).join(" · ")
? "③ " + z.map(x => `${x.seite === "res" ? "Widerstand" : "Support"} M30 `
+ `${f(x.level, 3)} (Chart · ${f(x.gap_atr15)}×ATR_M15)${lesart(x)}`).join(" · ")
: "③ kein Level in Sicht";
$("m15-zone").title = "Richtungs-Lesart BEDINGT auf das Level, keine freie "
$("m15-zone").title = "GENAU diese Linie wird im MT5-Chart gezeichnet (M30-Pivots, "
+ "geclustert) — der Chart nennt seit v1.35 dieselbe Zahl mit denselben Worten. "
+ "⚠ Die Level in ③b stammen dagegen aus M5 und stehen NICHT im Chart. "
+ "Richtungs-Lesart BEDINGT auf das Level, keine freie "
+ "Prognose: eine solche ist gemessen unmöglich (AUC 0,50 out-of-sample und "
+ "nur 0,52 in-sample — es steckt keine Richtungsinformation in den Daten). "
+ "P(break) fragt stattdessen „hält diese Struktur?“ und ist out-of-sample "
@@ -275,7 +286,7 @@ function renderM15(s) {
const seite = (o, lbl) => {
if (!o) return null;
if (o.level == null) return `${lbl} frei`;
return `${lbl} ${o.dist_atr}×ATR${o.frei ? "" : " ⚠"}`;
return `${lbl} ${o.dist_atr}×ATR_M5${o.frei ? "" : " ⚠"}`;
};
if (mo.block) {
// Der Motor blockt — das ist die Information, die gefehlt hat.
@@ -300,14 +311,21 @@ function renderM15(s) {
moEl.className = "m15-item";
moEl.textContent = "③b Motor —";
}
// ⚠ „M5" und „×ATR_M5" ausgeschrieben: diese Level stammen aus einer ANDEREN
// Zeitebene als ③ (M30) und werden im Chart NICHT gezeichnet. Ohne den Zusatz
// sucht man die genannte Linie dort vergeblich.
const teile = [seite(rm.long, "▲"), seite(rm.short, "▼")].filter(Boolean);
if (teile.length) {
moEl.textContent += ` · Raum ${teile.join(" / ")}`
+ (rm.gate ? ` (Gate ${rm.gate})` : "");
}
moEl.title = "Was der Signal-Motor GERADE blockt, plus der Raum zum nächsten "
+ "Gegenlevel je Richtung (M5 — dieselbe Rechnung wie das Gate selbst, kein "
+ "Nachbau). Unter 0,6×ATR ist der Ertrag am Level gedeckelt: gemessen "
+ "Gegenlevel je Richtung. ⚠ Quelle sind M5-Pivots und ATR_M5 — eine ANDERE "
+ "Zeitebene als ③ (M30-Level, ATR_M15), und diese Linien werden im Chart NICHT "
+ "gezeichnet. Das ist Absicht: entry_room=0,6 ist über 80k Bars auf M5 "
+ "kalibriert. Die beiden ×ATR-Zahlen sind deshalb NICHT vergleichbar. "
+ "Dieselbe Rechnung wie das Gate selbst, kein "
+ "Nachbau. Unter 0,6×ATR ist der Ertrag am Level gedeckelt: gemessen "
+ "ØR 0,119/0,067 bei PF 0,42/0,66 — Trefferquote hoch und trotzdem "
+ "Verlust. ⚠ Gate ③ liest dieselbe Nähe als GUT (ruhende Order AM Level), "
+ "entry_room als SCHLECHT (Markt-Einstieg mit dem Level als Hindernis). "
+2 -2
View File
@@ -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=168">
<link rel="stylesheet" href="style.css?v=169">
</head>
<body>
<!-- Modul-Menü (ganz oben) -->
@@ -356,6 +356,6 @@
</div>
<div id="toast" class="toast hidden"></div>
<script src="app.js?v=168"></script>
<script src="app.js?v=169"></script>
</body>
</html>