Zeitzonen-Bug in analyze_tageszeit.py behoben + Squeeze-Nachtsperre 05.08. dokumentiert

Zeitzone: datetime.fromtimestamp(rates["time"], UTC+3) behandelt den MT5-
Bar-Zeitstempel als echten UTC-Epoch - MT5 liefert dort aber bereits die
Broker-Wallclock. Jede Stunde war 3 h zu spaet einsortiert. Empirisch gegen
die Wallclock geprueft (letzte Bar 11:00 statt real 08:00). Helfer _berlin()
mit korrekter Konvention; Rest des Projekts war nicht betroffen (geprueft).

Neu gerechnet: ALLE VIER Tagesbloecke kippen zwischen den Haelften - es gibt
gar kein Tageszeit-Muster. Der zuvor gemeldete "Nachmittag robust negativ"
war der um 3 h verschobene Abend. Plausibilitaetstest, der es entlarvt haette:
die duennen Stunden (n~650) muessen am Marktschluss liegen, nicht nachts.

Squeeze 05.08.: 5 active-Ausbrueche zwischen 02:00 und 07:30 Berlin, alle von
auto_squeeze_skip_night geblockt; Bot war ab 01:15 flat, also alleiniger
Blocker. Mit kanonischem Exit + Echtkosten Sigma +3,56 R (~+95 EUR), davon
92 % in zwei Trades - n=5 an einem Tag ist kein Gegenbeleg zum Guard.
Messbarer Ansatz notiert: kosten- statt stundenbasiertes Gate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 08:07:25 +02:00
co-authored by Claude Opus 5
parent d75789ac72
commit c9f1e8d039
2 changed files with 75 additions and 20 deletions
+19 -4
View File
@@ -31,7 +31,22 @@ import MetaTrader5 as mt5
_BERLIN = ZoneInfo("Europe/Berlin")
_BROKER = timezone(timedelta(hours=3)) # Pepperstone: UTC+3 ganzjährig
_ATRMIN = 0.06
_UTC = timezone.utc
def _berlin(ts):
"""Bar-Zeitstempel → echte Berliner Zeit (DST-korrekt).
⚠⚠ FEHLERQUELLE, hier einmal falsch gemacht (Fix 2026-08-05): MT5 liefert
`rates["time"]` so, dass `fromtimestamp(ts, UTC)` bereits die BROKER-Wallclock
zeigt — die Zahl ist KEIN echter UTC-Epoch. Ein `fromtimestamp(ts, UTC+3)`
behandelt sie fälschlich als echten Epoch und landet **3 Stunden zu spät**.
Empirisch geprüft: letzte M5-Bar ergab so 11:00, während es real 08:00 war.
Richtig ist: die Wallclock als UTC lesen, dann als UTC+3 ETIKETTIEREN und
erst danach nach Berlin umrechnen.
"""
return (datetime.fromtimestamp(int(ts), _UTC)
.replace(tzinfo=_BROKER).astimezone(_BERLIN))
def _atr_series(H, L, C, p=14):
@@ -59,7 +74,7 @@ def auswerten(bars, H, L, C, A, lo, hi):
out = defaultdict(list)
for i in range(max(lo, 1), hi):
# Broker-Epoch → echte Berliner Stunde (DST-korrekt)
t = datetime.fromtimestamp(int(bars[i]["time"]), _BROKER).astimezone(_BERLIN)
t = _berlin(bars[i]["time"])
out[t.hour].append(C[i] - C[i - 1])
return out
@@ -75,8 +90,8 @@ def main():
C = [float(b["close"]) for b in bars]
A = _atr_series(H, L, C)
N = len(C); mid = N // 2
t0 = datetime.fromtimestamp(int(bars[0]["time"]), _BROKER).astimezone(_BERLIN)
t1 = datetime.fromtimestamp(int(bars[-1]["time"]), _BROKER).astimezone(_BERLIN)
t0 = _berlin(bars[0]["time"])
t1 = _berlin(bars[-1]["time"])
h1 = auswerten(bars, H, L, C, A, 0, mid)
h2 = auswerten(bars, H, L, C, A, mid, N)