Files
AH-Oil-Trader/web/index.html
T
Axel HocksandClaude Opus 5 59f5cf2586 CB in das Feld TAG P/L, Farben invertiert (v=213)
User-Vorgabe. Zwei Aenderungen.

(1) Der CB-Knopf sitzt jetzt im Feld TAG P/L, rechts neben dem Wert. AT und TR
bleiben im Balance-Feld. VERSCHOBEN, nicht kopiert.
Passt inhaltlich: der Circuit Breaker haengt am TAGES-Verlust, und genau der
steht in diesem Feld - der Knopf sitzt jetzt neben der Zahl, die ihn ausloest.

(2) FARBEN INVERTIERT: jetzt GRUEN = aktiv (scharf), ROT = inaktiv (aus).
⚠ Damit lesen sich alle drei Knoepfe gleich - gruen heisst ueberall "an". Die
gegenlaeufige Zuordnung von heute Vormittag ist damit zurueckgedreht; der
Warnhinweis "CB ist bewusst invers" ist aus Markup, CSS und JS entfernt, sonst
haette er kuenftige Leser in die falsche Richtung geschickt.
⚠ Die Tooltips nennen die Farbe jetzt ausdruecklich ("AN (gruen)" / "AUS
(rot)"), damit der Zustand auch ohne Farbwahrnehmung eindeutig ist.

Am ausgelieferten HTML/CSS geprueft: TAG P/L enthaelt btn-cb, Balance enthaelt
btn-at und btn-trail und NICHT btn-cb, 0 doppelte IDs, .cb-dot.aktiv ist gruen.
Pipeline A-G gruen, 97 Tests, 14 render*-Funktionen, deployt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 10:58:26 +02:00

493 lines
39 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de" data-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="theme-color" content="#0d1117">
<title>Oil · MT5</title>
<link rel="manifest" href="manifest.json">
<!-- ⚠ Pico ZUERST: es liefert die Basis (Typografie, Formulare,
Buttons, Fokus-Ringe). `style.css` kommt DANACH und gewinnt bei
Konflikten — die ~60 Trading-Klassen bleiben unveraendert.
⚠ LOKAL eingebunden, kein CDN: die PWA laeuft ueber WireGuard
und muss offline funktionieren. -->
<link rel="stylesheet" href="pico.min.css?v=1">
<link rel="stylesheet" href="style.css?v=213">
</head>
<body data-html-v="213">
<!-- Modul-Menü (ganz oben) -->
<nav id="tabs">
<button class="tab active" data-view="dash">Dashboard</button>
<!-- Aufteilung nach WIRKUNG (User-Vorgabe 2026-08-05), nicht nach Thema:
„SIG Live" = Module MIT Verdict-Gewicht (fließen in die Empfehlung ein),
„SIG Anzeige" = gemessen OHNE Einfluss. Die Trennung ist am Code prüfbar
(`_verdict`: `add(...)` mit Gewicht > 0), nicht Geschmackssache. -->
<button class="tab" data-view="siglive">SIG Live</button>
<button class="tab" data-view="siganzeige">SIG Anzeige</button>
<button class="tab" data-view="logs">Logs</button>
<button class="tab" data-view="stats">Statistik</button>
<button class="tab" data-view="news">News</button>
<button class="tab mute-tab" id="mute-btn" title="Töne an/aus">🔊</button>
</nav>
<header id="top">
<div class="sym-row">
<span id="symbol"></span>
<div class="hdr-right">
<div class="hdr-meta">
<span id="hdr-clock" class="hdr-clock"></span>
<span id="session" class="session-line dim"></span>
</div>
<span id="conn" class="dot off" title="Verbindung"></span>
</div>
</div>
<div class="price-row">
<!-- ⚠⚠ AT und TR sitzen IM Balance-Feld rechts neben dem Wert; der
CB-Knopf ist am selben Tag ins Feld TAG P/L gewandert (User-Vorgabe). Farb-Logik ebenfalls seine Vorgabe:
GRUEN = Breaker AKTIV (scharf), ROT = INAKTIV (aus). Am selben Tag
zunaechst umgekehrt gewuenscht und dann invertiert — jetzt lesen
sich CB, AT und TR gleich: gruen heisst ueberall "an". -->
<div class="px px-cb"><label title="Kontostand ohne die offene Position.">BALANCE</label><span class="px-zeile"><span id="balance"></span><button class="cb-dot" id="btn-at" title="AUTO TRADER — Auto-Entry auf die gruene M15-Karte. ⚠ GEMESSEN NEGATIV (OeR -0,162/-0,094, KI ohne Null, schlechter als die HTF-Richtung UND als ihr eigenes Gegenteil) — reiner Test.">AT</button><button class="cb-dot" id="btn-trail" title="TRAILING der offenen Position an/aus. Startet ab 1,3×ATR Gewinn und lockert einen bereits engeren Stop niemals.">TR</button></span></div>
<div class="px px-cb"><label title="Realisiertes Ergebnis von heute. Brutto — die Quellensteuer wird größtenteils erstattet und ist hier nicht abgezogen.">TAG P/L</label><span class="px-zeile"><span id="day-pl"></span><button class="cb-dot" id="btn-cb" title="Circuit Breaker (Tagesverlust-Stopp) an/aus. Gruen = scharf, rot = aus.">CB</button></span></div>
<div class="px"><label title="Kontostand einschließlich der offenen Position.">EQUITY</label><span id="equity"></span></div>
<div class="px"><label id="hdr-price-lbl" title="Der Kurs, zu dem tatsächlich gehandelt wird. Steht er länger als 3 Minuten still, gilt der Markt als geschlossen und das Label zeigt ZU.">PEPPERSTONE KURS</label><span id="hdr-price"></span></div>
<!-- Hyperliquid-Kurs NEBEN dem Broker-Kurs (User 2026-08-01). HL handelt 24/7,
Pepperstone nicht — am Wochenende der einzige lebende Kurs. Basis-korrigiert,
also direkt vergleichbar. Beide Quellen AUSGESCHRIEBEN (User 2026-08-01):
„KURS"/„HL" ließ offen, welcher Kurs woher kommt. -->
<div class="px" id="px-hl"><label title="Roher Kurs des Hyperliquid-Öl-Perps — läuft 24/7, auch wenn Pepperstone geschlossen ist. Anderer Kontrakt, deshalb nicht identisch; der Tooltip am Wert nennt die umgerechnete Entsprechung.">HYPERLIQUID KURS</label><span id="hdr-hl"></span></div>
<div class="px px-split" title="Links: Gewinn/Verlust der Position in Slot 1 (manuelle und M15-Trades). Rechts: die Position des Breakout-Autotraders, der seit dem Zwei-Slot-Umbau vom 19.08. einen EIGENEN Slot hat. Beide NETTO nach Quellensteuer; bei geschlossenem Markt eine Schaetzung auf Basis des Hyperliquid-Kurses (mit ≈ markiert). Die SUMME beider Slots steht im TAG P/L oben.">
<div class="px-half">
<label>G/V</label>
<span class="px-line"><button class="px-close" id="close-main" title="Nur die Position in Slot 1 schliessen (manuelle und M15-Trades). ⚠ Der grosse CLOSE-Knopf unten schliesst BEIDE Slots."></button><span id="hdr-pnl"></span></span>
</div>
<div class="px-half rechts">
<label>G/V · BRK</label>
<span class="px-line"><button class="px-close" id="close-brk" title="Nur die Position des Breakout-Autotraders schliessen. ⚠ Der grosse CLOSE-Knopf unten schliesst BEIDE Slots."></button><span id="hdr-pnl-brk"></span></span>
</div>
</div>
</div>
</header>
<main id="view-dash" class="view">
<!-- Circuit Breaker (Tagesverlust-Stopp) — roter Banner, nur wenn ausgelöst/nah -->
<div id="circuit-banner" class="circuit hidden"></div>
<!-- Aktueller Trade (nur bei offener Position) — Anzeige + SL/TP/Close editierbar -->
<section class="card wide trade-bar hidden" id="trade-bar">
<h2 class="tb-title" title="Der aktuell offene Trade. SL, TP und die Close-Schwellen sind hier direkt editierbar — Enter oder Verlassen des Feldes sendet.">aktueller Trade läuft <span class="tb-runtime" id="tb-runtime"></span></h2>
<div class="tb-row">
<span class="tb-field"><label title="Wie lange der Trade schon läuft. Ab 2 Stunden bernstein — dann greift der Time-Stop, falls der Trade nie in die Gewinnphase kam.">Laufzeit</label>
<b class="tb-val" id="tb-dur"></b></span>
<span class="tb-field"><label title="LONG = auf steigende Kurse, SHORT = auf fallende.">Richtung</label>
<b class="tb-val tb-dir" id="tb-dir"></b></span>
<span class="tb-field"><label title="Positionsgröße. Ergibt sich aus dem Einsatz-Feld in der Order-Leiste.">Lots</label>
<b class="tb-val" id="tb-lots"></b></span>
<span class="tb-field"><label title="Die gebundene Margin dieser Position.">Einsatz</label>
<b class="tb-val" id="tb-margin"></b></span>
<!-- ⚠ Auto-Close-Schalter hier ENTFERNT (User 2026-08-20). Er ist
doppelt vorhanden: der Knopf S/R in der Aktionsleiste (seit
19.08.) schaltet dasselbe und ist auch sichtbar, wenn KEINE
Position offen ist — die Trade-Leiste erscheint nur bei offener
Position, man konnte ihn also nicht vor einem Trade setzen.
Backend, Endpoint /api/srclose und der Zustand `auto_sr_close`
sind unveraendert. -->
<span class="tb-field stop"><label title="Stop-Loss beim Broker. Ändern schaltet das Trailing ab, damit es die Handeingabe nicht zurückzieht.">SL</label>
<input id="tb-sl" type="number" inputmode="decimal" step="0.01" placeholder="—"></span>
<span class="tb-field gain"><label title="Take-Profit beim Broker. Ändern schaltet das Trailing ab.">TP</label>
<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-val" id="tb-tp1"></span></span>
<!-- ⚠ TP2 hier ENTFERNT (2026-08-20): es zeigte denselben Wert wie das
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-val" id="tb-tp3"></span></span>
<!-- ⚠ "Gewinn-Close" entfernt am 2026-08-21 mit dem S/R-Auto-Close:
die Schwelle gab es NUR fuer ihn. -->
<span class="tb-field stop"><label title="Harte Verlustgrenze in Euro — der Server schließt sofort, wenn sie erreicht ist. Wirkt auch bei gesperrtem Handy. ⚠ Ein gesetzter Wert wird auf den nächsten Trade übernommen, bis er gelöscht wird.">Notfall-Close</label>
<input id="emg-input" type="number" inputmode="decimal" step="1" placeholder="€"></span>
</div>
</section>
<!-- Gesamtempfehlung (aus allen Modulen aggregiert) -->
<!-- ══════════════════════════════════════════════════════════════════
GESAMTEMPFEHLUNG ENTFERNT (2026-08-08, User: „funktioniert so leider
nicht, entferne es komplett - wir bauen etwas Neues").
Weg sind: Headline, Konfidenz-Ring, Bias-Nadel, Modul-Chips,
Konsens-Zeile und die Block-Gruende. Die Aggregation war reine
Anzeige - die Order haengt an `wave_signal`, nicht am Verdict.
GEBLIEBEN sind drei Dinge, die dort nur geparkt waren und je eine
eigene, unabhaengige Beleglage haben (s. CLAUDE.md).
══════════════════════════════════════════════════════════════════ -->
<!-- ══════════════════════════════════════════════════════════════════
M15 SETUP-BEREITSCHAFT (2026-08-08) — Ersatz fuer die entfernte
Gesamtempfehlung. ⚠ KEINE Richtungsaussage: auf M15 traegt gemessen
KEINE (Squeeze n=33/Nachbarn kippen, VWAP-Baender ohne Edge, 24
Signal-Eingriffe gescheitert). Gezeigt werden BEDINGUNGEN nach dem
Schema Bias -> Zone -> Reichweite -> Veto; den Ausloeser gibt der
Mensch, dessen Auswahl-Vorteil unabhaengig belegt ist.
══════════════════════════════════════════════════════════════════ -->
<section class="card wide" id="card-m15">
<h2 title="Setup-Bereitschaft auf M15. Zeigt BEDINGUNGEN, keine Richtungsprognose - auf M15 traegt gemessen kein Richtungssignal. Der Ausloeser bleibt beim Menschen.">M15 · Setup-Bereitschaft</h2>
<!-- Status-Banner: die wichtigste Zeile. Sie bestaetigt ausdruecklich
auch das NICHT-Handeln - die gemessene Kern-Leckage sind
diskretionaere Abweichungen, nicht fehlende Gelegenheiten.
⚠ Die Order-Buttons werden BEWUSST NICHT gesperrt: hartes Blockieren
wurde im Projekt verworfen, und User-Uebersteuerungen liefen
gemessen 68 % WR. Sichtbar machen, nicht bevormunden. -->
<div class="m15-status" id="m15-status"></div>
<!-- ⚠⚠ SETUP-BLOCK "Entry Zone / SL / TP1-3" (User-Wunsch 2026-08-20).
Die RICHTUNG kommt ausschliesslich aus dem VETO — die Karte gibt
weiterhin KEINE Richtungsprognose ab (ueber 1.071 Live-Episoden als
Muenzwurf gemessen, 48-51 %). Der Block sagt: WENN gehandelt wird,
dann zu diesen Preisen. -->
<div class="m15-setup" id="m15-setupblock" hidden></div>
<div class="m15-grid">
<!-- ⚠ KEIN `open` mehr (User-Wunsch 2026-08-20): alle Punkte der
M15-Karte sind per Default EINGEKLAPPT. Der zuletzt vom
Nutzer gewaehlte Zustand wird weiterhin gemerkt — nur der
Ausgangszustand ist jetzt zu. -->
<details class="m15-akk" data-akk="prüfkette">
<summary> ④ Prüfkette</summary>
<div class="m15-item" id="m15-bias" title="Uebergeordneter Trend M30 + H1. Der EINZIGE belegte Filter: gegen den HTF zu handeln halbiert den Edge (gemessen ×2)."></div>
<div class="m15-item" id="m15-kosten" title="Spread geteilt durch ATR_M15. Auf M15 gemessen 0,104 gegen 0,193 auf M5 - hier ist die groebere Zeitebene echt im Vorteil. Schwellen 0,20 / 0,32 aus backtest_realcosts.py."></div>
<div class="m15-item" id="m15-zone" title="Naechstes STEHENDES Level (M30-Pivots, dieselbe Quelle wie Chart und S/R-Close) mit Abstand und Durchbruchwahrscheinlichkeit. ⚠ P(break) ist live derzeit rund 7 Pp zu niedrig kalibriert."></div>
<div class="m15-item" id="m15-reich" title="Erwartete Spanne aus core/cone.py - out-of-sample geprueft, die 80-%-Baender treffen real 77 %. Sagt WIE WEIT, nicht wohin."></div>
</details>
<details class="m15-akk" data-akk="kontext">
<summary>⑤ Kontext — Motor · M5 · RSI</summary>
<div class="m15-item" id="m15-motor" title="Was der Signal-Motor GERADE blockt, plus der Raum zum naechsten Gegenlevel je Richtung (M5, dieselbe Rechnung wie das Gate selbst). Unter 0,6xATR ist der Ertrag am Level gedeckelt - gemessen ØR -0,119/-0,067 bei PF 0,42/0,66, also Trefferquote hoch und trotzdem Verlust. ⚠ Gate ③ liest dieselbe Naehe als GUT (ruhende Order AM Level), entry_room als SCHLECHT (Markt-Einstieg mit dem Level als Hindernis). Beides stimmt - fuer verschiedene Trades."></div>
<div class="m15-item" id="m15-m5" title="M5-ZUSTAND, reine Anzeige - KEINE Richtung und KEIN Banner. Bewusst KEINE eigene M5-Setup-Karte (User-Entscheidung 2026-08-19): die entkoppelte Selbstmessung dieser Karte steht bei n=342 auf 53,5 % [48,2 .. 58,8] auf 30 min und 49,3 % auf 60 min - die vorab fixierte Bedingung (>=350 Faelle, KI ohne die 50) ist bei vorhandener Stichprobe NICHT erfuellt. Als Handelsregel faellt die Karte durch (backtest_m15_auto.py: OeR -0,162/-0,094, beide KI ohne Null). Kosten-Schwellen aus backtest_realcosts.py: Median 0,193, ab 0,32 Kostenfalle. Der M5-Raum steht bereits in Zeile 3b."></div>
<div class="m15-item" id="m15-rsi" title="RSI(14) auf M15 - REINE ANZEIGE, kein Signal und kein Verdict-Gewicht. WICHTIG: die Lehrbuch-Lesart (>70 ueberkauft -> short, <30 ueberverkauft -> long) ist hier GEMESSEN und faellt durch: 24 Zellen ueber 80k M5-Bars und 2 Halbjahre, keine besteht, vier sind sogar signifikant negativ (backtest_rsi_v2.py, 19.08.). Auch die Umkehrung traegt standalone nicht. Was WIRKT, ist der Pullback-Effekt - und der laeuft im Bot bereits ueber die EMA-Distanz (Konfidenz-Bonus 'tiefer Pullback' +15) und ueber die Ueberdehnung. Lesen Sie den Wert als Kontext, nicht als Handlungsanweisung."></div>
</details>
<details class="m15-akk" data-akk="kontrolle">
<summary> ⑦ Selbstmessung · Ausführung · Veto</summary>
<div class="m15-item" id="m15-track" title="Trefferquote der Lesart dieser Karte, nach 30/60 Minuten gegen den echten Kurs ausgewertet. Gegen 50 % zu lesen, nicht gegen 0. Geloggt wird EIN Zustand je Wechsel, nicht je Tick - sonst zaehlt man dieselbe Marktlage dutzendfach."></div>
<div class="m15-item" id="m15-exec" title="Der Umbau auf ruhende Stop-Orders (05.08.) hatte als Erfolgskriterium: der Abstand Einstieg zum Level muss gegen 0 gehen (vorher Median +0,275xATR). Das ist der groesste je gemessene Hebel des Projekts - und war bis heute unbeobachtet."></div>
<div class="m15-item" id="m15-veto" title="Deine eigene Bilanz mit/ohne/gegen Signal, je Lot gerechnet. Gegen das Signal zu handeln kostet gemessen 6,60 EUR je Lot - beidhaelftig robust."></div>
</details>
</div>
</section>
<section class="card wide" id="card-pos">
<h2 title="Live-Meldungen zum laufenden Trade und zur Marktlage: Squeeze, Überdehnung, S/R-Nähe, News- und Kalender-Konflikte, Hyperliquid-Kontext.">Meldungen</h2>
<div class="squeeze-ind" id="wave-squeeze" title="Volatilitäts-Squeeze: der Kurs komprimiert und bricht aus. Das einzige 2-Stichproben-validierte Einstiegssignal des Projekts."></div>
<div class="bounce-ind" id="wave-bounce" title="Warnung bei Überdehnung — der Kurs ist weit von seiner EMA weg. KEIN Signal: die Richtungstreffer-Quote liegt gemessen bei ~50 %."></div>
<div class="cur-near" id="cur-near" title="Nächstes S/R-Level und Abstand dorthin."></div>
<div class="pos-srhint hidden" id="pos-srhint" title="Nähert sich der Kurs dem Ziel-Level, steht hier die Durchbruch-Wahrscheinlichkeit. Das Modell dahinter ist out-of-sample kalibriert (AUC 0,65)."></div>
<div class="pos-stophint hidden" id="pos-stophint" title="Dasselbe für das Level auf der Verlustseite — reine Anzeige, hier wird nichts automatisch geschlossen."></div>
<div class="news-conflict hidden" id="news-conflict" title="Warnt, wenn der News-Flow deutlich gegen die offene Position oder das aktive Signal steht. Kontext — als Prognose nicht belegt."></div>
<div class="news-conflict hidden" id="cal-note" title="Laufendes oder bevorstehendes High-Impact-Ereignis aus dem Wirtschaftskalender. Sperrt autonome Einstiege, nicht manuelle."></div>
<!-- HL-Kontext (Funding/Open Interest/Oracle-Premium). ⚠ REINE ANZEIGE:
gemessen (`analyze_hl_funding.py`, 5.095 Stundenwerte, 7 Monate)
hält entüberlappt KEIN Bucket die 2-Stichproben-Regel. Kein
Verdict-Gewicht, kein Trigger. -->
<!-- ⚠ AUSGEBLENDET am 2026-08-20 (User-Wunsch): Hyperliquid-Kontext
(`#hl-note`), M1/M5-Muster (`#pat-note`) und Trailing-Zustand
(`#trail-note`). Die Elemente sind ENTFERNT, nicht nur versteckt —
die drei Render-Bloecke greifen ueber `$streng` zu und ueberspringen
sich damit sauber. Das Backend rechnet unveraendert weiter
(`hl_ctx`, `patterns_tf`, `trail_info` stehen im Snapshot), die
Muster-Bilder haben ihre eigene Karte im Dashboard.
Zurueckholen = die drei <div class="hl-note hidden" id="..."> hier
wieder einsetzen; am JS ist nichts zu aendern. -->
<!-- Trailing-Zustand im Klartext. Die Trailing-KARTE ist seit dem
22.07. ausgeblendet; damit gab es keine Stelle mehr, an der man
sah, WARUM der Stop nicht nachgezogen wird (User-Frage 20.08.). -->
<!-- M1/M5-Muster kompakt (User 2026-08-20). Bewusst OHNE Bild:
die Meldungen-Karte ist der Live-Textstrom zum laufenden Trade. -->
<!-- Auto-Flip-Close: schließt eine Position, wenn die Empfehlung dreht.
⚠ GEMESSEN in BEIDEN Halbjahren negativ (92/160 R,
backtest_flipclose2.py), läuft auf ausdrücklichen User-Wunsch. Hatte
bis 2026-08-05 KEINE Anzeige — ein Exit, der echtes Geld bewegt und den
niemand sieht. Jetzt sichtbar, damit die Entscheidung informiert ist. -->
<div class="news-conflict hidden" id="flip-note" title="Zustand des Auto-Flip-Close. Derzeit aus — in beiden Halbjahren gemessen negativ."></div>
<div class="reasons" id="wave-reasons" title="Die Begründungen, aus denen sich Richtung und Konfidenz zusammensetzen."></div>
</section>
<!-- Chartmuster je Zeitebene als Bild — direkt hinter den Meldungen
(User-Vorgabe 2026-08-20). ⚠ REINE ANZEIGE: die Muster-Klasse ist als
SIGNAL gemessen und verworfen (Ziel-Trefferquote nur 1338 %,
`backtest_patterns.py`), auf M1 am schwaechsten (Spread 0,319×ATR).
Kein Verdict-Gewicht, kein Trade-Trigger — die 0,25 der Gesamtempfehlung
haengen unveraendert allein am M30-Detektor im Tab "SIG Live". -->
<section class="card wide" id="card-muster">
<h2 title="Das jeweils staerkste gerade entstehende Muster je Zeitebene, als Bild. Bestaetigte gehen vor sich bildenden; bei gleichem Status entscheidet die Symmetrie-Guete. Reine Anzeige — als Signal ist die Muster-Klasse gemessen und verworfen (Ziel-Trefferquote 1338 %).">Chartmuster je Zeitebene <span class="pt-tf">reine Anzeige</span></h2>
<div class="pt-tfgrid" id="pt-tfgrid" title="Das jeweils staerkste Muster je Zeitebene, mit Bild. Bestaetigte gehen vor sich bildenden; bei gleichem Status entscheidet die Symmetrie-Guete."></div>
</section>
<!-- Breakout-Autotrader (User-Wunsch 2026-08-19). ⚠ Der autonome Pfad handelt
echtes Geld, seine Abbruchregel (B5) stand bisher NUR im taeglichen
Report. Diese Karte macht ihn sichtbar — Zustand, liegende Orders und
B5-Stand an einer Stelle.
⚠⚠ Sie zeigt BEIDE Zahlen getrennt: die B4-'Mechanik' (Regel neu
gerechnet, sieht gut aus) und die LIVE-Bilanz (verliert). Genau diese
Luecke IST der Befund — eine der beiden allein waere irrefuehrend.
Reine ANZEIGE: schaltet nichts, blockiert nichts. -->
<section class="card wide hidden" id="card-brk">
<h2 title="Autonomer Entry auf den Squeeze-Ausbruch. Einziges 2-Stichproben-validiertes Auto-Setup des Projekts.">🚀 Breakout-Autotrader</h2>
<div class="kv"><span>Zustand</span><b id="brk-state"></b></div>
<div class="kv"><span>Squeeze jetzt</span><b id="brk-squeeze"></b></div>
<div class="kv"><span>Liegende Orders</span><b id="brk-pending"></b></div>
<div class="kv" title="B5 = die VORAB fixierte Abbruchregel: nach 20 Trades ab 01.08. muss Verhaeltnis (OeGewinn/OeVerlust) >= 1,0 UND PF >= 1 sein."><span>B5-Regel</span><b id="brk-b5"></b></div>
<div class="kv" title="Die vom Breakout-Autotrader gehaltene Position - SEIT dem Zwei-Slot-Umbau vom 19.08. ein EIGENER Slot, unabhaengig von manuellen und M15-Trades. WICHTIG: 'Trailing' muss AN sein. Steht es auf aus, laeuft der Trade nur mit dem Broker-SL - also in der gemessen DURCHGEFALLENEN SL-only-Variante (backtest_brk_slonly.py: alle zehn Konfidenzintervalle enthalten die Null)."><span>BRK-Position</span><b id="brk-pos"></b></div>
<div class="tb-row mg-row" title="Einsatz JE PFAD in Prozent der freien Margin. Leer oder 0 = der globale Wert gilt. WICHTIG: das ist KEINE gleichzeitige Reservierung - der Bot haelt EINE Position, es kann nie BRK und M15 nebeneinander geben. Das Feld steuert die GROESSE der jeweiligen Position. Manuelle Trades bleiben beim globalen Wert.">
<span class="tb-field"><label title="Einsatz in Prozent der freien Margin fuer ALLE Trades, die keinen eigenen Wert haben - also MANUELLE Trades. Das ist die Schraube, die Ihre eigenen Eroeffnungen steuert. 1-99; 100 liesse keinen Puffer fuer Spread und Swap.">Einsatz global %</label>
<input id="mg-global" type="number" inputmode="decimal" step="1" min="1" max="99" placeholder="%"></span>
<span class="tb-field"><label title="Einsatz % fuer autonome Breakout-Trades. Leer = globaler Wert.">Einsatz BRK %</label>
<input id="am-brk" type="number" inputmode="decimal" step="1" min="0" max="99" placeholder="global"></span>
<span class="tb-field"><label title="Einsatz % fuer autonome M15-Trades. Leer = globaler Wert.">Einsatz M15 %</label>
<input id="am-m15" type="number" inputmode="decimal" step="1" min="0" max="99" placeholder="global"></span>
</div>
<div id="brk-note" class="hint"></div>
</section>
<section class="card wide" id="card-kontext">
<h2 title="Drei unabhaengige Kontext-Anzeigen. KEINE Empfehlung und keine Richtungsaussage - die Aggregation zu einer Gesamtempfehlung wurde am 08.08. entfernt.">Marktkontext</h2>
<!-- Zeitebenen-Ampel (M1/M5/M15/M30/H1) -->
<div class="tf-turns" id="wave-turns" title="EMA-Stand je Zeitebene: gruen aufwaerts, rot abwaerts. Eine frische Kreuzung blinkt. Reine Anzeige, kein Signal."></div>
<!-- Erwartete Spanne. ⚠ STREUUNG, nicht Richtung - deshalb neutral
gefaerbt. Beschriftet mit der REAL gemessenen Abdeckung (~77 %),
nicht mit dem Nennwert 80 %. Eine von nur zwei out-of-sample
kalibrierten Komponenten des Projekts. -->
<div class="kx-cone" id="kx-cone"></div>
<!-- SELBST-KALIBRIERUNG: die Trefferquote der Empfehlung aus
`rec_outcomes`. Misst das WELLEN-Signal, das bleibt.
⚠ Gegen 50 % zu lesen, nicht gegen 0. -->
<div class="kx-selfcal dim" id="kx-selfcal"></div>
</section>
<!-- Meldungen (ex-Position + Wellen-Meldungen; Welle-Karte entfällt) -->
<!-- Karte „Erwartete Spanne" ENTFERNT 2026-08-05 (User-Vorgabe) — die Kernwerte
stehen jetzt in der Karte „Marktkontext" (`#kx-cone`). Backend
(`core/cone.py`, Snapshot `cone`, MT5-Export `CN;…`) ist unverändert aktiv. -->
<!-- Trailing (Dashboard-Kachel ausgeblendet 2026-07-22, User-Vorgabe; Backend/
Logik unverändert aktiv, nur die Anzeige raus) -->
<section class="card wide hidden" id="card-trail">
<h2 title="Zustand des Trailing-Stops (Phase, aktueller SL, High-Water). Ausgeblendet — das Trailing läuft im Hintergrund weiter.">Trailing</h2>
<div class="kv"><span>Status</span><b id="trail-state"></b></div>
<div class="kv"><span>Phase</span><b id="trail-phase"></b></div>
<div class="kv"><span>SL</span><b id="trail-sl"></b></div>
<div class="kv"><span>TP</span><b id="trail-tp"></b></div>
<div class="kv"><span>ATR · TF</span><b id="trail-atr"></b></div>
</section>
<!-- Live-Statistik — ganz unten -->
<section class="card wide" id="card-stats-live">
<h2 title="Kompakte Bilanz über Woche und Gesamt. Verhältnis = Ø-Gewinn geteilt durch Ø-Verlust; unter 1 heißt, die Verlierer sind größer als die Gewinner.">Statistik (live)</h2>
<div class="stx-row" id="stx-row" title="Trades, Trefferquote, Profitfaktor und das Verhältnis von Ø-Gewinn zu Ø-Verlust."><span class="dim">lade …</span></div>
</section>
</main>
<!-- ══ SIG LIVE — Module MIT Verdict-Gewicht (fließen in die Empfehlung ein) ══
Die Zuordnung ist am Code prüfbar: `engine._verdict` ruft `add(name, vote,
gewicht, …)`. Wer hier steht, hat ein Gewicht > 0 und verschiebt die
Bias-Nadel. ⚠ Gewicht heißt NICHT „belegt": der KI-Copilot ist gemessen
nicht robust prädiktiv, hat aber Stimmrecht — genau deshalb ist die
Trennung nach WIRKUNG und nicht nach Beleglage sinnvoll. -->
<section id="view-siglive" class="view hidden">
<div class="view-head">
<h2>SIG Live</h2>
<span class="view-note">Module mit Einfluss auf die Gesamtempfehlung</span>
</div>
<!-- KI-Agent — Verdict-Gewicht 1,0 bei gerichteter Aussage, 0 bei NEUTRAL -->
<section class="card wide" id="card-agent">
<h2 title="Einschätzung des KI-Copiloten (LLM). Stimmt mit Gewicht 1,0 mit, wenn er eine Richtung nennt — bei NEUTRAL zählt er nicht. Als Prognose nicht belegt.">KI-Copilot <span class="ca-tf">Gewicht 1,0</span></h2>
<div class="signal" id="agent-bias" title="Richtungsaussage des Copiloten. NEUTRAL heißt, er zählt in der Empfehlung nicht mit.">◌ —</div>
<div class="agent-head" id="agent-head"></div>
<div class="agent-text" id="agent-reason" title="Die Begründung des Copiloten im Klartext."></div>
<ul class="risks" id="agent-risks"></ul>
</section>
<!-- Chartmuster — Verdict-Gewicht `_PAT_W`=0,25 (User-Vorgabe „5 %" 2026-08-01);
`forming` zählt halb. Deshalb LIVE, nicht Anzeige. -->
<section class="card wide" id="card-patterns">
<h2 title="Mechanisch erkannte Chartmuster auf M30 mit Trigger und Kursziel. Gewicht 0,25. Die Ziel-Trefferquote liegt gemessen nur bei 1338 % — Kontext, keine Vorhersage.">Chartmuster <span class="pt-tf">M30 · Gewicht 0,25</span></h2>
<!-- ⚠ Das BILDER-Raster (`#pt-tfgrid`) sitzt seit dem 2026-08-20 im
DASHBOARD, direkt hinter den Meldungen (User-Wunsch). Es steht dort
NUR EINMAL — eine zweite Kopie haette eine doppelte Element-ID
erzeugt, und `getElementById` liefert dann immer nur die erste:
die zweite Karte waere still leer geblieben. Hier bleibt die
M30-Detailliste mit Trigger und Kursziel. -->
<div class="pt-list" id="pt-list" title="Erkannte Muster mit Skizze, Trigger und Kursziel."><span class="dim"></span></div>
</section>
</section>
<!-- ══ SIG ANZEIGE — gemessen OHNE Einfluss auf die Empfehlung ══════════════
Kein Verdict-Gewicht, kein Trade-Trigger. Beide Module wurden als Signal
gemessen und verworfen; sie bleiben als Kontext, nicht als Entscheidung. -->
<section id="view-siganzeige" class="view hidden">
<div class="view-head">
<h2>SIG Anzeige</h2>
<span class="view-note">reine Anzeige — gemessen ohne Einfluss</span>
</div>
<!-- Marktstruktur (M30) — Signalvariante gemessen verworfen
(backtest_structure.py + backtest_structure_tf.py: 24/24 Zellen negativ) -->
<section class="card wide" id="card-structure">
<h2 title="Price-Action-Struktur auf M30: Swing-Folge, letzter Bruch (BOS) und Regressionskanal. Reine Anzeige — als Signal über alle Zeitebenen gemessen und verworfen.">Marktstruktur <span class="ms-tf">M30 · nur Anzeige</span></h2>
<div class="ms-top">
<span class="ms-trend" id="ms-trend"></span>
<div class="ms-swings" id="ms-swings" title="Swing-Folge: HH/HL = Aufwärtsstruktur, LH/LL = Abwärtsstruktur."></div>
</div>
<div class="ms-bos" id="ms-bos" title="Letzter Break of Structure — welches Swing-Level zuletzt gebrochen wurde."></div>
<div class="ms-chan" id="ms-chan" title="Position des Kurses im Regressionskanal: 0 % = unterer Rand, 100 % = oberer.">
<div class="ms-chan-head"><span id="ms-chan-dir"></span>
<span class="ms-chan-note" id="ms-chan-note"></span></div>
<div class="ms-chan-track"><div class="ms-chan-fill" id="ms-chan-fill"></div>
<div class="ms-chan-dot" id="ms-chan-dot"></div></div>
<div class="ms-chan-scale"><span>Kanal unten</span><span>oben</span></div>
</div>
</section>
<!-- Kerzen-Anatomie (M5) — 3× als Signal gemessen und verworfen; die
Lehrbuch-Deutung ist invertiert, deshalb steht die GEMESSENE Lesart im
Hinweistext und die Kachel ist bewusst neutral gefärbt. -->
<section class="card wide" id="card-candles">
<h2 title="Kerzengröße, Dochte und Volumen der letzten M5-Kerzen. Reine Anzeige und bewusst neutral gefärbt: die Lehrbuch-Lesart ist hier gemessen INVERTIERT — der Kurs läuft nach einer Klimax-Kerze eher GEGEN sie.">Kerzen-Anatomie <span class="ca-tf">M5 · nur Anzeige</span></h2>
<div class="ca-list" id="ca-list" title="Erkannte Kerzenformen der letzten M5-Bars mit Volumen-Vergleich."><span class="dim"></span></div>
</section>
</section>
<!-- Logs -->
<section id="view-logs" class="view hidden">
<div class="view-head">
<h2>Logs</h2>
<button class="reload" id="logs-reload"></button>
</div>
<pre id="logs-body" class="logbox">lade …</pre>
</section>
<!-- Statistik -->
<section id="view-stats" class="view hidden">
<div class="view-head">
<h2>Statistik</h2>
<button class="reload" id="stats-reload"></button>
</div>
<div id="sqm-box"><div class="dim" style="padding:8px">lade Monitor …</div></div>
<div id="stats-body"></div>
<h2 class="sub-h">Setups (gesamt)</h2>
<div id="stats-setups"></div>
<!-- ⚠ Aus dem Dashboard hierher verschoben (User-Vorgabe 2026-08-05): das
Dashboard soll die HANDLUNGSrelevanten Module zeigen, die Rückschau
gehört in die Statistik. Die drei Karten werden weiterhin von `render()`
aus dem Snapshot gefüttert — sie hängen NICHT an `loadStats()`. Das
funktioniert, weil ein ausgeblendeter View nur `display:none` ist und
die Elemente im DOM bleiben; sonst würden die IDs beim Rendern fehlen. -->
<!-- Manuelle Trades — deskriptiv (2026-08-04). Zeigt die EIGENE Historie,
rechnet nichts hoch. Der volle Entscheidungskontext (ctx_*) wird erst
seit dem 04.08. mitgeschrieben; die Reifegrad-Zeile macht das sichtbar. -->
<section class="card wide" id="card-manual">
<h2 title="Deine eigenen manuellen Trades im Vergleich zum Bot, aufgeteilt nach Signal-Deckung. Rein deskriptiv.">Manuelle Trades <span class="mt-sub">deine Historie · 30 Tage</span></h2>
<div class="mt-grid" id="mt-grid" title="Deine manuellen Trades über heute, 30 Tage und gesamt, dazu der Bot zum Vergleich."></div>
<div class="mt-split" id="mt-split" title="Aufgeteilt danach, ob der Trade MIT oder OHNE Deckung durch die Empfehlung lief. Gegen das Signal kostet gemessen 6,60 € je Lot."></div>
<div class="mt-note dim" id="mt-note"></div>
</section>
<!-- Letzte Trades -->
<section class="card wide" id="card-trades">
<h2 title="Die zuletzt geschlossenen Trades mit Ergebnis und Schließgrund.">Letzte Trades</h2>
<div class="trades" id="trades" title="Zuletzt geschlossene Trades: Richtung, Ergebnis und Schließgrund."></div>
</section>
<!-- Kurslücken (Gaps) — Fill-Magnete, nur Kontext -->
<section class="card wide" id="card-gaps">
<h2 title="Offene Kurslücken des Jahres. Vakuum = echte Lücke zwischen den Tagesspannen (fließt als S/R in die Konfidenz ein), Eröffnung = Schluss-zu-Eröffnung (reine Anzeige).">Kurslücken (Gaps 2026)</h2>
<div class="gaps-list" id="gaps-list" title="Offene Kurslücken mit Zone, Fill-Level und Abstand zum aktuellen Kurs."><span class="dim">lade …</span></div>
</section>
</section>
<!-- News -->
<section id="view-news" class="view hidden">
<div class="view-head">
<h2>News</h2>
<button class="reload" id="news-reload"></button>
</div>
<div id="news-sentiment" class="news-sent"></div>
<div id="news-body"></div>
</section>
<!-- Aktionsleiste (Trade-Steuerung) -->
<nav id="actions">
<!-- Einsatz-Felder ENTFERNT (User 2026-08-19). Der Einsatz steht auf
40 % (ini + `runtime_state.json`); ohne UI aendert man ihn dort
+ Neustart. -->
<button class="btn long" data-side="long">▲ LONG<span class="btn-raum" id="raum-long"></span></button>
<button class="btn short" data-side="short">▼ SHORT<span class="btn-raum" id="raum-short"></span></button>
<!-- ⚠ Grosser CLOSE-Knopf ENTFERNT (User 2026-08-20): es gibt jetzt je Slot
einen ✕ direkt an der G/V-Anzeige. Seine beiden Aufgaben sind mit
umgezogen — `disabled` bei leerem Slot und das BLINKEN beim
Close-Alarm (nur Slot 1, dort entsteht der Anlass). -->
<!-- BRK-Schalter ENTFERNT, dafuer der Circuit-Breaker (User 2026-08-19).
Der Auto-Squeeze-Zustand bleibt in der Breakout-Karte sichtbar. -->
<!-- ⚠ Der CIRCUIT-BREAKER-Knopf sitzt seit dem 2026-08-21 als runder
"CB" rechts neben BALANCE (User-Wunsch). VERSCHOBEN, nicht kopiert:
zwei Elemente mit derselben ID waeren ein stiller Fehler, weil
`getElementById` nur das erste findet. -->
<!-- S/R-Auto-Close auch in der Aktionsleiste (User 2026-08-19). Den
Schalter gab es nur in der Trade-Leiste -- die ist aber NUR bei
offener Position sichtbar, also genau dann nicht, wenn man ihn vor
einem Trade setzen will. Der alte Knopf bleibt; beide lesen
`auto_sr_close` aus demselben Snapshot und koennen nicht
auseinanderlaufen. -->
<!-- ⚠ Knopf S/R entfernt am 2026-08-21 (User-Vorgabe). Der Auto-Close am
Level ist samt Endpoint und Backend-Logik weg; der HINWEIS in der
Meldungen-Karte, die P(break)-Chartlinien und das
`pbreak_predictions`-Tracking bleiben. -->
<!-- M15-Karten-Auto-Entry (User-Test 2026-08-19). ⚠ GEGEN DIE MESSUNG:
backtest_m15_auto.py -> Lesart beidhaelftig negativ (OeR -0,162/
-0,094, PF 0,72/0,84), KI ohne Null, schlechter als die
HTF-Richtung UND als ihr eigenes Gegenteil. Default AUS. -->
<!-- ⚠ M15 heisst seit dem 2026-08-21 "AT" (Auto Trader) und sitzt als
runder Knopf im Balance-Feld (User-Vorgabe). VERSCHOBEN, nicht
kopiert — zwei Elemente mit derselben ID waeren ein stiller Fehler.
<!-- 🎯 SIG (Auto-Signal-Entry) ENTFERNT 2026-08-12: seit 01.08. aus und auf
BEIDEN Ausfuehrungs-Achsen gemessen negativ (Markt alle 8 Felder,
ruhende Order mit Touch-Fill alle 6 und schlechter als Markt). -->
<!-- ⚠ TRAIL sitzt seit dem 2026-08-21 als runder "TR" im Balance-Feld
(User-Vorgabe). VERSCHOBEN, nicht kopiert. -->
</nav>
<!-- Modal (Bestätigung / Token-Eingabe) -->
<!-- ══ BILD-MODALBOX (User-Wunsch 2026-08-20) ═══════════════════════════════
Klick auf ein Chartmuster-Bild öffnet es in voller Größe.
⚠⚠ BEWUSST OHNE BIBLIOTHEK. Ein Lightbox-Paket (GLightbox, PhotoSwipe …)
wäre 1540 KB plus ein zweites Bedienkonzept — für ~40 Zeilen Markup und
CSS. Das Projekt hat aus demselben Grund Tailwind abgelehnt (WireGuard,
offline, kein npm) und am 05.08. die vendorte lightweight-charts (164 KB)
wieder entfernt. Ein CDN scheidet ohnehin aus: das Dashboard läuft nur
über WireGuard, ohne Weg ins Internet.
⚠ Die große Fassung (`muster/gross/…`, ~133 KB) wird ERST beim Klick
geladen — die Kachel zeigt die 25-KB-Fassung. -->
<div id="bildbox" class="bildbox hidden">
<button id="bildbox-zu" class="bildbox-zu" title="Schließen (Esc)"></button>
<figure class="bildbox-inner">
<img id="bildbox-img" alt="">
<figcaption id="bildbox-txt"></figcaption>
</figure>
</div>
<div id="modal" class="modal hidden">
<div class="box">
<div class="box-title" id="modal-title"></div>
<div class="box-msg" id="modal-msg"></div>
<input id="modal-input" class="hidden" type="password"
placeholder="App-Token" autocomplete="off" autocapitalize="off">
<div class="box-btns">
<button id="modal-cancel" class="mbtn cancel">Abbrechen</button>
<button id="modal-ok" class="mbtn ok">Bestätigen</button>
</div>
</div>
</div>
<div id="toast" class="toast hidden"></div>
<script src="app.js?v=213"></script>
</body>
</html>