Order-Knopf warnt sichtbar, wenn der Raum zum Ziel-Level fehlt

User: "und wieder am Widerstand geschlossen. Das ist kein Zufall mehr."

⚠⚠ ZUERST DER AUSSCHLUSS - im Exit gibt es KEINEN S/R-Anker:
  - S/R-Auto-Close ist seit 19.08. aus
  - `trail.set_sr(...)` uebergibt die Level zwar, aber `_sr_data` wird in
    core/trailing.py NIRGENDS benutzt (toter Parameter)
  - Trailing-Stop = Bestkurs ∓ 1,0xATR, TP = Entry ± 3,5xATR - beides reines ATR
Kein Codepfad kann an einem Level schliessen.

DIE URSACHE LIEGT AM EINSTIEG, und sie ist in der eigenen Telemetrie sichtbar
(ctx_dist_res_atr / ctx_dist_sup_atr, Abstand zum ZIEL-Level beim Eroeffnen):
   19.08 20:00 BUY  0,25xATR   -5,44
   19.08 20:05 BUY  0,29xATR   -4,20
   19.08 20:11 BUY  0,46xATR  -23,29
   19.08 20:59 SELL 0,52xATR   -4,47
   19.08 21:18 BUY -0,03xATR   -0,67   (Widerstand bereits ueberschritten)
FUENF von zwoelf Trades unter dem Gate 0,6, zusammen -38,07 EUR.
Der Kurs erreicht das Level nach wenigen Cent, dreht, und der Trail (1xATR
dahinter) nimmt mit. Der Exit SIEHT nach "am Widerstand" aus, weil der EINSTIEG
dort lag. Genau das misst entry_room_atr: OeR -0,119/-0,067 bei PF 0,42/0,66 -
79 % Trefferquote und trotzdem Verlust, weil der Gewinn am Level gedeckelt ist
und der Verlust bis zum Stop laeuft.

Warum es niemand sah: `entry_room` blockt nur die EMPFEHLUNG, manuelle Orders
laufen ungehindert (so gewollt, Uebersteuerungen liefen 68 % WR). Seit dem
Entfernen des Entry-Dialogs (11.08.) fehlte die Zahl im Moment des Klicks; sie
stand nur in Gate ③b - und das ist seit gestern im zugeklappten Akkordeon.

GEBAUT: der Order-Knopf selbst wird markiert (Umriss in Akzentfarbe, gedaempfte
Flaeche, Raum-Zahl fett), sobald `frei === false`. Live gegengeprueft: bei Raum
0,04 / 0,28 xATR sind beide Knoepfe gewarnt.
⚠ KEIN Block, KEINE Abfrage - sichtbar machen, nicht bevormunden.
⚠ Die Zahl wird NICHT neu gerechnet; `rm` liegt bereits vor. Ein zweiter
Rechenweg waere die Divergenz-Falle, die im Projekt dreimal zugeschlagen hat.
⚠ Der Knopf hat keine id, sondern data-side - deshalb ueber `closest()` statt
ueber eine ID (erster Versuch griff ins Leere).

Reine Frontend-Aenderung (v=192), kein Neustart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-20 08:25:33 +02:00
co-authored by Claude Opus 5
parent 834bd0bba3
commit e01ecde3a3
3 changed files with 31 additions and 2 deletions
+14
View File
@@ -396,6 +396,20 @@ function renderM15(s, snap) {
const eng = o.frei === false; const eng = o.frei === false;
el.textContent = (eng ? "⚠ " : "") + o.dist_atr.toFixed(2) + "×ATR"; el.textContent = (eng ? "⚠ " : "") + o.dist_atr.toFixed(2) + "×ATR";
el.className = "btn-raum" + (eng ? " eng" : ""); el.className = "btn-raum" + (eng ? " eng" : "");
// ⚠⚠ Den KNOPF selbst markieren, nicht nur die kleine Zeile darunter
// (2026-08-20, nach dem Befund "immer am Widerstand geschlossen"):
// von zwoelf ausgewerteten Trades lagen FUENF unter dem Gate, zusammen
// 38,07 €. Der Exit sah nach "am Level geschlossen" aus, weil der
// EINSTIEG dort lag. Die Zahl stand zwar schon auf dem Knopf, war aber
// klein und grau — und seit dem Entfernen des Entry-Dialogs (11.08.) ist
// sie die einzige Warnung im Moment des Klicks.
// ⚠ BEWUSST KEIN Block und KEINE Abfrage: hartes Blockieren ist im
// Projekt verworfen, und Uebersteuerungen liefen gemessen 68 % WR.
// Sichtbar machen, nicht bevormunden.
// ⚠ Die Knoepfe haben keine id, sondern `data-side` — und das Raum-Span
// sitzt IN ihnen. Deshalb ueber den Elternknoten statt ueber eine ID.
const btn = el.closest ? el.closest("button.btn") : null;
if (btn) btn.classList.toggle("eng-raum", eng);
el.title = "Abstand zum naechsten Level in DIESER Richtung (M5-Pivots, " el.title = "Abstand zum naechsten Level in DIESER Richtung (M5-Pivots, "
+ "Gate " + (rm.gate ?? 0.6) + "×ATR). Unter dem Gate gemessen teuer: " + "Gate " + (rm.gate ?? 0.6) + "×ATR). Unter dem Gate gemessen teuer: "
+ "79 % Trefferquote, aber 7 bis 12 €/Lot — der Gewinn ist am Level " + "79 % Trefferquote, aber 7 bis 12 €/Lot — der Gewinn ist am Level "
+2 -2
View File
@@ -12,7 +12,7 @@
⚠ LOKAL eingebunden, kein CDN: die PWA laeuft ueber WireGuard ⚠ LOKAL eingebunden, kein CDN: die PWA laeuft ueber WireGuard
und muss offline funktionieren. --> und muss offline funktionieren. -->
<link rel="stylesheet" href="pico.min.css?v=1"> <link rel="stylesheet" href="pico.min.css?v=1">
<link rel="stylesheet" href="style.css?v=191"> <link rel="stylesheet" href="style.css?v=192">
</head> </head>
<body> <body>
<!-- Modul-Menü (ganz oben) --> <!-- Modul-Menü (ganz oben) -->
@@ -391,6 +391,6 @@
</div> </div>
<div id="toast" class="toast hidden"></div> <div id="toast" class="toast hidden"></div>
<script src="app.js?v=191"></script> <script src="app.js?v=192"></script>
</body> </body>
</html> </html>
+15
View File
@@ -647,3 +647,18 @@ main{padding-bottom:4.1111rem} /* Platz für die fixe Leiste */
.m15-akk > summary:hover{color:var(--bright)} .m15-akk > summary:hover{color:var(--bright)}
.m15-akk[open] > summary{border-bottom:1px solid var(--line)} .m15-akk[open] > summary{border-bottom:1px solid var(--line)}
.m15-akk .m15-item{margin:0.2222rem 0.3333rem} .m15-akk .m15-item{margin:0.2222rem 0.3333rem}
/* ── Order-Knopf warnt bei zu wenig Raum zum Ziel-Level (2026-08-20) ──────
⚠ ANLASS IST EINE MESSUNG: von zwölf ausgewerteten Trades lagen FÜNF unter
dem Gate 0,6×ATR, zusammen 38,07 €. Der Exit sah jedes Mal nach „am
Widerstand geschlossen" aus — tatsächlich lag der EINSTIEG dort. Über 80k
Bars: ØR 0,119/0,067 bei PF 0,42/0,66 (79 % Treffer, trotzdem Verlust:
der Gewinn ist am Level gedeckelt, der Verlust läuft bis zum Stop).
⚠ BEWUSST nur eine Warnung: kein Block, keine Abfrage. Hartes Blockieren ist
im Projekt verworfen, User-Übersteuerungen liefen gemessen 68 % WR. */
.btn.eng-raum{
outline:2px solid var(--accent);
outline-offset:-2px;
filter:saturate(.55) brightness(.85);
}
.btn.eng-raum .btn-raum{ color:var(--accent); font-weight:700; }