User-Vorgabe: die hinterlegten Muster-Bilder sollen je Minuten-Chart das gerade entstehende Muster zeigen, M1 und M5 zusaetzlich in der Meldungskarte. BILDER: 15 Vorlagen aus /Chartmuster, 436-611 KB je Stueck (7,5 MB gesamt). Das Dashboard uebertraegt ~14 KB je Snapshot ueber WireGuard - ein Originalbild waere das 40-fache. Verkleinert auf 520 px / JPEG q80 nach web/muster/: 7,5 MB -> 379 KB (Faktor 20), im Frontend zusaetzlich loading="lazy". Die Originale sind gitignored, nur die Web-Fassungen kommen ins Repo. DETEKTOR: core/patterns.py bekommt die Zeitebene als PARAMETER. Der Default bleibt M30 und damit bitgleich - `PatternDetector()` speist das Verdict-Gewicht 0,25, eine stille Verschiebung dort waere eine Strategie-Aenderung durch die Hintertuer. Daneben laufen vier weitere Instanzen (M1/M5/M15/H1) mit gestaffelten Refresh-Zeiten (20/25/35/60 s), damit sie den mt5_lock nicht im Pulk belegen. Sie haben KEINE Stimme. Neu Snapshot `patterns_tf`: je Zeitebene das STAERKSTE Muster (bestaetigte vor sich bildenden, dann Symmetrie-Guete; ungueltige fallen raus) samt Bildnamen ueber die Karte `patterns.BILD`. Doppeltop/-boden, Dreifach-Top/-Boden und Flagge bull/baer teilen sich je ein Bild (die Vorlagen zeigen beide Richtungen); `inv_cup` bekommt KEINS - lieber kein Bild als ein falsches. ⚠⚠ REINE ANZEIGE, und das steht auch dran. Die Muster-Klasse ist als SIGNAL gemessen und verworfen (Ziel-Trefferquote nur 13-38 %, backtest_patterns.py), und auf M1 ist sie am schwaechsten: dort liegt der Spread bei 0,319xATR, ein Muster ueber wenige Bars ist weitgehend Rauschen. Kein Verdict-Gewicht, kein Trade-Trigger; die Tooltips nennen die Messung. ⚠ Beim Bau zwei eigene Fehler gefangen: (1) ich hatte die Feldnamen GERATEN - es heisst `type`, nicht `typ`, und der Status ist "confirmed"/"forming"/ "invalidated". Ein falscher Schluessel haette still None geliefert, die Karte waere leer geblieben ohne jede Fehlermeldung. (2) Der Emoji-Surrogat-Abbruch zum sechsten Mal - die .tmp-Regel hat app.js erneut gerettet (0 Bytes verhindert), danach mit literalen Zeichen statt \u-Escapes geschrieben. Live verifiziert: M1 Doppelboden, M5 Tasse+Henkel, M15 aufsteigendes Dreieck, M30 Doppeltop; alle Bilder HTTP 200 (22-28 KB). Pipeline A-G gruen, 97 Tests, 14 render*-Funktionen laufen durch. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
439 lines
35 KiB
HTML
439 lines
35 KiB
HTML
<!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=204">
|
||
</head>
|
||
<body data-html-v="204">
|
||
<!-- 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">
|
||
<div class="px"><label title="Kontostand ohne die offene Position.">BALANCE</label><span id="balance">—</span></div>
|
||
<div class="px"><label title="Realisiertes Ergebnis von heute. Brutto — die Quellensteuer wird größtenteils erstattet und ist hier nicht abgezogen.">TAG P/L</label><span id="day-pl">—</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>
|
||
<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>
|
||
<input id="srmin-input" type="number" inputmode="decimal" step="1" placeholder="€"></span>
|
||
<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">
|
||
<details class="m15-akk" data-akk="prüfkette" open>
|
||
<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. -->
|
||
<div class="hl-note hidden" id="hl-note"></div>
|
||
<!-- 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. -->
|
||
<div class="hl-note hidden" id="pat-note" title="Das gerade entstehende Muster auf M1 und M5. Reine Anzeige — die Muster-Klasse ist als Signal gemessen und verworfen (Ziel-Trefferquote 13–38 %), auf M1 am schwaechsten."></div>
|
||
<div class="hl-note hidden" id="trail-note" title="Was das Trailing gerade tut. Zwei Gruende, warum es scheinbar nichts tut und beide richtig sind: es startet erst ab 1,3×ATR Gewinn (seit 20.08., vorher 0,3×), und es lockert einen bereits engeren Stop niemals."></div>
|
||
<!-- 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>
|
||
|
||
<!-- 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 13–38 % — Kontext, keine Vorhersage.">Chartmuster <span class="pt-tf">M30 · Gewicht 0,25</span></h2>
|
||
<!-- Je Zeitebene das gerade entstehende Muster als BILD (User 2026-08-20).
|
||
⚠ REINE ANZEIGE: die Muster-Klasse ist als Signal gemessen und
|
||
verworfen (Ziel-Trefferquote 13–38 %); auf M1 ist sie am schwaechsten,
|
||
dort liegt der Spread bei 0,319×ATR. -->
|
||
<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>
|
||
<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. -->
|
||
<button class="btn tog" id="btn-cb" title="Circuit Breaker (Tagesverlust-Stopp) an/aus">🛑 CIRCUIT BREAKER</button>
|
||
<!-- 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. -->
|
||
<button class="btn tog" id="btn-sr" title="Auto-Close am S/R-Level an/aus (P(break)-gegatet: schliesst nur, wenn das Level wahrscheinlich haelt)">S/R</button>
|
||
<!-- 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. -->
|
||
<button class="btn tog" id="btn-m15" title="Auto-Entry auf die gruene M15-Karte. ACHTUNG: gemessen negativ (OeR -0,162/-0,094) — reiner Test.">M15</button>
|
||
<!-- 🎯 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). -->
|
||
<button class="btn tog" id="btn-trail">🎯 TRAIL</button>
|
||
</nav>
|
||
|
||
<!-- Modal (Bestätigung / Token-Eingabe) -->
|
||
<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=204"></script>
|
||
</body>
|
||
</html>
|