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:
co-authored by
Claude Opus 5
parent
d75789ac72
commit
c9f1e8d039
+19
-4
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user