Wirtschaftskalender-Blackout + Konsolidierungs-Box beschriftet

core/econ_calendar.py (NEU): High-Impact-News-Fenster als Handels-Sperre.
Quelle Forex Factory JSON (kostenlos, kein Key, mit impact-Feld), beide
Wochen (thisweek endet Sa, Markt oeffnet So 23:00 -> sonst blinder Fleck),
1x/h im Daemon-Thread, dedupliziert. Filter: High+USD ODER Oil/OPEC-Titel.

WICHTIG - nicht gemessen: Events sind zu selten fuer eine 2-Stichproben-
Aussage. Das ist die Handbuch-Regel, kein belegter Edge. Deshalb bewusst
asymmetrisch: sperrt NUR die autonomen Entries (Auto-Squeeze + Auto-Signal,
ohne Dedup-Marker -> feuert nach dem Fenster nach), in der Entry-Checkliste
nur "warn" statt "fail". Manuelle Orders bleiben frei. Der gemessene
EIA-Blackout (Mi 15:30-16:30) bleibt unabhaengig aktiv und greift auch
ohne Netz.

Verifiziert: Live-Fetch (EIA korrekt Mi 16:30 Berlin, FOMC/GDP/PCE erkannt)
+ 4 synthetische Szenarien (5 min vor/nach Event, 50 min davor, disabled).

MQL5 v1.30: graue Konsolidierungs-Box beschriftet (User-Frage "was bedeutet
die graue Box") - sichtbares Label an der Oberkante, rechtsbuendig wie die
uebrigen: "Konsolidierung (10-Bar-Spanne)" bzw. bei Kompression
"Konsolidierung - komprimiert, Ausbruch steht bevor". 0 Fehler kompiliert.

Frontend v=122: #cal-note in der Meldungen-Karte (laufendes Fenster bzw.
Vorwarnung <=60 min).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-30 22:58:58 +02:00
co-authored by Claude Opus 5
parent 7e0d2a4563
commit a6f370ac02
6 changed files with 284 additions and 8 deletions
+16
View File
@@ -666,6 +666,22 @@ function render(d) {
if (txt) { ncEl.className = "news-conflict warn"; ncEl.textContent = txt; }
else { ncEl.className = "news-conflict hidden"; ncEl.textContent = ""; }
}
// Wirtschaftskalender (2026-07-30): laufendes News-Fenster bzw. Vorwarnung ≤60 min.
// ⚠ NICHT gemessen — Handbuch-Regel; der Bot pausiert im Fenster nur seine
// AUTONOMEN Entries, manuelle Orders bleiben frei.
const calEl = $("cal-note");
if (calEl) {
const c = d.calendar || {};
let t = "";
if (c.blackout) {
const m = c.blackout.minutes;
t = `📅 News-Fenster: ${c.blackout.title} ${m > 0 ? "in " + Math.round(m) + " min" : "vor " + Math.round(-m) + " min"} — Bot eröffnet gerade keine Auto-Trades`;
} else if (c.next && c.next.minutes <= 60) {
t = `📅 ${c.next.title} in ${c.next.minutes} min`;
}
if (t) { calEl.className = "news-conflict warn"; calEl.textContent = t; }
else { calEl.className = "news-conflict hidden"; calEl.textContent = ""; }
}
// Schalter-Zustand: Auto-Close am S/R an/aus + Mindestgewinn
const srBtn = $("srclose-btn");
if (srBtn) {
+3 -2
View File
@@ -6,7 +6,7 @@
<meta name="theme-color" content="#0d1117">
<title>Oil · MT5</title>
<link rel="manifest" href="manifest.json">
<link rel="stylesheet" href="style.css?v=121">
<link rel="stylesheet" href="style.css?v=122">
</head>
<body>
<!-- Modul-Menü (ganz oben) -->
@@ -96,6 +96,7 @@
<div class="pos-srhint hidden" id="pos-srhint"></div>
<div class="pos-stophint hidden" id="pos-stophint"></div>
<div class="news-conflict hidden" id="news-conflict"></div>
<div class="news-conflict hidden" id="cal-note"></div>
<div class="reasons" id="wave-reasons"></div>
<div class="kv"><span>Setup</span><b id="wave-setup"></b></div>
<div class="kv"><span>Lauf</span><b id="wave-move"></b></div>
@@ -229,6 +230,6 @@
<div id="toast" class="toast hidden"></div>
<script src="lightweight-charts.standalone.production.js?v=114"></script>
<script src="app.js?v=121"></script>
<script src="app.js?v=122"></script>
</body>
</html>