Entry-Checkliste im Order-Dialog + Liquiditaets-Pfeile rechtsbuendig (v=120, MQL5 v1.14)

1) Entry-Checkliste (User: "blende einen Hinweis ein wenn die Checkliste gegen
   meine Eroeffnung ist"): engine._entry_checklist prueft 7 Punkte mit Live-Daten
   -- Signal-Deckung, HTF-Trend M30+H1, Entry-Raum, News-Konflikt, Kosten,
   Verlust-Serie heute (Mental-Check), Nacht-Stunde. Snapshot checklist{long,short},
   Anzeige im Bestaetigungs-Dialog, blockt nicht. Kommt jetzt auch bei vorhandenem
   Signal (alter Dialog nur bei WARTEN/Gegen-Signal).
   Real beim Einbau: beide Richtungen "stop" (11 Verluste heute = 80% des Kontos).

2) MQL5 v1.14 (User: "blende die liquiditaetslinien aus, nur die Pfeile sollen
   rechtsbuendig angezeigt werden"): LQ-Linien + Text-Labels raus, nur noch der
   Pfeil auf dem Wand-Preis, rechtsbuendig am aktuellen Rand (in RepositionLabels
   nachgefuehrt, bleibt beim Scrollen rechts). Details im Tooltip. Pinke
   Liquiditaets-Trendlinie unveraendert. Kompiliert.

3) backtest_liquidity_sweep.py (SMC Equal Highs/Lows + Swing Liquidity, Multi-TF-
   und Session-Achse): faellt durch -- Details folgen in der Doku.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-30 18:15:03 +02:00
co-authored by Claude Opus 4.8
parent b77b3d60f5
commit 919fe61dc3
5 changed files with 531 additions and 43 deletions
+31 -2
View File
@@ -874,8 +874,37 @@ document.querySelectorAll(".btn[data-side]").forEach(btn => {
if (btn.disabled) return;
const side = btn.dataset.side;
if (side === "long" || side === "short") {
const info = recInfo(side); // WARTEN/Gegen-Signal → Hinweis, der
if (info.danger) { // bestätigt werden muss (kein Block)
// ── Entry-Checkliste (User-Vorgabe 2026-07-30): zeigt VOR der Eröffnung,
// was dagegen spricht — auch dann, wenn ein Signal da ist (der alte Dialog
// kam nur bei WARTEN/Gegen-Signal). Blockt nicht, macht nur sichtbar.
const cl = (lastSnap.checklist || {})[side];
const info = recInfo(side);
if (cl && (cl.fails > 0 || cl.warns > 0)) {
const ICON = { fail: "❌", warn: "⚠", ok: "✅" };
const bad = cl.items.filter(x => x.state !== "ok");
const good = cl.items.filter(x => x.state === "ok");
let body = bad.map(x => `${ICON[x.state]} ${x.label}`
+ (x.detail ? `\n ${x.detail}` : "")).join("\n");
if (good.length) body += `\n\n${good.map(x => `${x.label}`).join("\n")}`;
// Eigene Zahlen zur Ausrichtung ergänzen (gemessene Kern-Leckage)
const al = lastSnap.alignment || null;
const sigNow = (lastSnap.wave_signal || {}).signal || "WARTEN";
const isWait0 = (sigNow === "WARTEN" || sigNow === "—");
if (al && cl.items.some(x => x.key === "signal" && x.state === "fail")) {
const grp = isWait0 ? al.none : al.against, ref = al.with;
const f = g => (g && g.n >= 5)
? `${g.wr}% Treffer · ${g.pnl >= 0 ? "+" : ""}${fmt(g.pnl, 0)} € (n${g.n})` : null;
const own = f(grp), rf = f(ref);
if (own) body += `\n\n📊 Deine Trades ${isWait0 ? "OHNE" : "GEGEN"} Signal: ${own}`;
if (rf) body += `\n📊 Mit Signal: ${rf}`;
}
const head = cl.verdict === "stop"
? `🛑 Checkliste sagt NEIN (${cl.fails} Punkte dagegen)`
: `⚠ Checkliste: ${cl.fails} dagegen, ${cl.warns} Vorsicht`;
const ok = await modal(head, body + `\n\n${side.toUpperCase()} trotzdem eröffnen?`,
"confirm", true);
if (!ok) return;
} else if (info.danger) { // Fallback: alter Hinweis (kein Block)
const sig = (lastSnap.wave_signal || {}).signal || "WARTEN";
const isWait = (sig === "WARTEN" || sig === "—");
const head = isWait