TP-Anzeige entwirrt: doppelten Wert entfernt, Init-Formel ehrlich beschriftet

User-Frage "unterscheidet sich TP von TP1, TP2 oder TP3?" - sie deckte zwei
Fehler auf, beide von mir aus der vorigen Aenderung.

⚠ ZUERST DIE SACHE SELBST: der TP WIRD nachgezogen, aber nach DREI Formeln:
    Init   Entry ± 3,5xATR      fest, gibt dem Trade Luft
    Trail  Bestkurs ∓ 0,5xATR   zieht mit dem Hoch mit
    Lock   Bestkurs ∓ 0,3xATR   sehr eng am Hoch
    immer  mindestens Entry ± 0,5xATR (schliesst nie im Verlust)
Er springt beim Phasenwechsel also von WEIT VOR dem Kurs auf KNAPP HINTER das
Hoch - ab Phase Trail ist er faktisch ein zweiter, engerer Ausstieg ueber dem
Stop. 63 TP-Setzungen im Log bestaetigen das.

① BEHOBEN - "TP2 · Trailing" in der Trade-Leiste zeigte DENSELBEN Wert wie das
   Feld "TP" daneben. Eine Zahl doppelt. Entfernt; uebrig bleiben TP1 (Level)
   und TP3 (Kegel) als das, was sie sind: Orientierungsmarken, die der
   Broker-TP NICHT kennt. Das Feld "TP" bleibt editierbar.

② BEHOBEN - im M15-Setup-Block stand "TP2: ... (3,5xATR - das Trailing fuehrt
   ihn nach)". Das war irrefuehrend: 3,5xATR ist NUR die Init-Formel, und ab
   Phase Trail laeuft der TP nach einer anderen Regel. Jetzt: "Init-Ziel
   3,5xATR - ab Phase Trail zieht der TP an den Bestkurs heran, ∓0,5xATR".

Verifiziert: 0 verbliebene tb-tp2-Referenzen in JS und HTML, span/div
ausgeglichen, keine doppelten IDs, node --check und Render-Probe gruen.
Reine Frontend-Aenderung (v=197), kein Neustart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-20 09:07:22 +02:00
co-authored by Claude Opus 5
parent 6f1348adf3
commit d59d0eeaee
2 changed files with 14 additions and 7 deletions
+8 -3
View File
@@ -444,8 +444,14 @@ function renderM15(s, snap) {
`Stop Loss: <b>${f(sl, 3)}</b> <span class="dim">(2,0×ATR_M15)</span>`]; `Stop Loss: <b>${f(sl, 3)}</b> <span class="dim">(2,0×ATR_M15)</span>`];
if (geg) zl2.push(`TP1: <b>${f(geg.level, 3)}</b> <span class="dim">(Level · ` + if (geg) zl2.push(`TP1: <b>${f(geg.level, 3)}</b> <span class="dim">(Level · ` +
`${100 - (geg.p_break ?? 50)} % haelt)</span>`); `${100 - (geg.p_break ?? 50)} % haelt)</span>`);
// ⚠⚠ Das ist die INIT-Formel. Ab Phase "Trail" laeuft der Broker-TP nach
// einer ANDEREN Regel: `Bestkurs ∓ 0,5×ATR` (in "Lock" sogar ∓0,3×ATR),
// also knapp HINTER dem Hoch statt weit davor. Wer 3,5×ATR fuer ein
// festes Ziel haelt, liegt ab dem Phasenwechsel daneben — deshalb steht
// es hier ausdruecklich dran.
zl2.push(`TP2: <b>${f(lg ? e + 3.5 * atr : e - 3.5 * atr, 3)}</b> ` + zl2.push(`TP2: <b>${f(lg ? e + 3.5 * atr : e - 3.5 * atr, 3)}</b> ` +
`<span class="dim">(3,5×ATR — das Trailing fuehrt ihn nach)</span>`); `<span class="dim">(Init-Ziel 3,5×ATR — ab Phase Trail zieht der ` +
`TP an den Bestkurs heran, ∓0,5×ATR)</span>`);
if (k120) zl2.push(`TP3: <b>${f(lg ? k120.hi : k120.lo, 3)}</b> ` + if (k120) zl2.push(`TP3: <b>${f(lg ? k120.hi : k120.lo, 3)}</b> ` +
`<span class="dim">(Kegel 120, trifft ${Math.round(k120.coverage || 0)} %)</span>`); `<span class="dim">(Kegel 120, trifft ${Math.round(k120.coverage || 0)} %)</span>`);
sb.innerHTML = zl2.join("<br>"); sb.innerHTML = zl2.join("<br>");
@@ -1215,8 +1221,7 @@ function render(d) {
$("tb-tp1").textContent = ziel $("tb-tp1").textContent = ziel
? `${fmt(ziel.level, 3)} (${100 - (ziel.p_break ?? 50)}% hält)` ? `${fmt(ziel.level, 3)} (${100 - (ziel.p_break ?? 50)}% hält)`
: "—"; : "—";
// TP2 — der Broker-TP, den das Trailing fuehrt // TP2 entfernt — es zeigte denselben Wert wie das Feld `tb-tp`.
$("tb-tp2").textContent = p.tp ? fmt(p.tp, 3) : "—";
// TP3 — Obergrenze des 80-%-Kegels auf 120 min // TP3 — Obergrenze des 80-%-Kegels auf 120 min
const lv = ((d.cone || {}).levels) || []; const lv = ((d.cone || {}).levels) || [];
const k = lv.find(x => x.band === 80 && x.minutes === 120); const k = lv.find(x => x.band === 80 && x.minutes === 120);
+6 -4
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=196"> <link rel="stylesheet" href="style.css?v=197">
</head> </head>
<body> <body>
<!-- Modul-Menü (ganz oben) --> <!-- Modul-Menü (ganz oben) -->
@@ -90,8 +90,10 @@
<input id="tb-tp" type="number" inputmode="decimal" step="0.01" placeholder="—"></span> <input id="tb-tp" type="number" inputmode="decimal" step="0.01" placeholder="—"></span>
<span class="tb-field gain"><label title="TP1 — das nächste STEHENDE Level in Trade-Richtung (M30-Pivots, dieselbe Quelle wie Chart und Gate ③), mit der Durchbruchwahrscheinlichkeit. ⚠ REINE ANZEIGE, wird nicht an den Broker geschickt. Ein fester TP am Gegenlevel ist gemessen der STÄRKSTE Gewinner-Kappen-Beleg des Projekts: er drehte den Squeeze von +0,102/+0,108 auf 0,066/0,004 (backtest_trailing_sr.py). Als Orientierung nützlich, als Auftrag nicht.">TP1 · Level</label> <span class="tb-field gain"><label title="TP1 — das nächste STEHENDE Level in Trade-Richtung (M30-Pivots, dieselbe Quelle wie Chart und Gate ③), mit der Durchbruchwahrscheinlichkeit. ⚠ REINE ANZEIGE, wird nicht an den Broker geschickt. Ein fester TP am Gegenlevel ist gemessen der STÄRKSTE Gewinner-Kappen-Beleg des Projekts: er drehte den Squeeze von +0,102/+0,108 auf 0,066/0,004 (backtest_trailing_sr.py). Als Orientierung nützlich, als Auftrag nicht.">TP1 · Level</label>
<span class="tb-val" id="tb-tp1"></span></span> <span class="tb-val" id="tb-tp1"></span></span>
<span class="tb-field gain"><label title="TP2 — der Broker-TP, den das Trailing dynamisch führt (Entry ± 3,5×ATR in Phase Init, danach mit dem Lauf nachgezogen). Das ist der einzige TP, der tatsächlich am Broker liegt.">TP2 · Trailing</label> <!-- ⚠ TP2 hier ENTFERNT (2026-08-20): es zeigte denselben Wert wie das
<span class="tb-val" id="tb-tp2"></span></span> Feld "TP" daneben — eine Zahl doppelt. Uebrig bleiben TP1 und
TP3 als das, was sie sind: Orientierungsmarken, die der
Broker-TP NICHT kennt. -->
<span class="tb-field gain"><label title="TP3 — die Obergrenze des 80-%-Kegels auf 120 Minuten (core/cone.py). Out-of-sample geprüft: die 80-%-Bänder treffen real 77 %. ⚠ Das ist eine Aussage über die REICHWEITE, nicht über die Richtung — weiter kommt der Kurs in dieser Zeit selten, nicht: er kommt dorthin.">TP3 · Kegel 120</label> <span class="tb-field gain"><label title="TP3 — die Obergrenze des 80-%-Kegels auf 120 Minuten (core/cone.py). Out-of-sample geprüft: die 80-%-Bänder treffen real 77 %. ⚠ Das ist eine Aussage über die REICHWEITE, nicht über die Richtung — weiter kommt der Kurs in dieser Zeit selten, nicht: er kommt dorthin.">TP3 · Kegel 120</label>
<span class="tb-val" id="tb-tp3"></span></span> <span class="tb-val" id="tb-tp3"></span></span>
<span class="tb-field gain"><label title="Mindestgewinn in Euro, unter dem der Auto-Close am Level NICHT schließt. Leer oder 0 = aus.">Gewinn-Close</label> <span class="tb-field gain"><label title="Mindestgewinn in Euro, unter dem der Auto-Close am Level NICHT schließt. Leer oder 0 = aus.">Gewinn-Close</label>
@@ -414,6 +416,6 @@
</div> </div>
<div id="toast" class="toast hidden"></div> <div id="toast" class="toast hidden"></div>
<script src="app.js?v=196"></script> <script src="app.js?v=197"></script>
</body> </body>
</html> </html>