Fix: Broker-Offset bei geschlossenem Markt (-9,5 h statt +3 h)
`_broker_offset_s()` leitete die Zeitzone aus `tick.time - now` ab. Das misst die Zeitzone nur bei FRISCHEM Tick; steht der Markt, misst es die Veraltung. Real am 01.08. (letzter Tick Fr 23:54): -34210 s -> gerundet -34200 (-9,5 h) statt +10800. Die Pruefung [-12h,+14h] liess das durch. Folgen (die Laufzeit-Uhr war nur das Sichtbare): - open_time 12,5 h in der Zukunft -> Laufzeit 0:00 - Time-Stop-Alter (trailing.py:504) negativ -> 120-min-Stop haette nicht ausgeloest - deal.time-Umrechnung beim externen Close, alle MQL5-Chart-Anker Fix: Offset nur noch aus frischem Tick bestimmen, sonst letzter gueltiger Wert (vorbelegt UTC+3 = dieselbe Konstante wie engine.broker_utc_offset). Frische am bereits bekannten Offset gemessen -> nicht zirkulaer. Schwelle 900 s < halbes Rundungsraster. Zeitzonen-Wechsel wird uebernommen und geloggt. Ausserdem: - market_closed greift sofort nach Neustart: _last_bid_move_ts wird aus dem echten Tick-Alter vorbelegt statt bei null zu starten (vorher 180 s blind) - pollSnapshot: der stille catch umschloss render() -> Render-Fehler wurden lautlos verschluckt, das Dashboard fror ohne Konsolen-Fehler ein. Jetzt ist nur noch der fetch im try. - Header-Labels ausgeschrieben: "PEPPERSTONE KURS" / "HYPERLIQUID KURS" - v=131, CLAUDE.md (Deployment-Drift Fall 4) Verifiziert: market_closed sofort True, tick_age gegen die Rohwerte 0 s Abweichung, open_time -> 31.07. 22:54 (Laufzeit +15,8 h). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2ea17ce3e0
commit
b8bb1d260f
+20
-1
@@ -3031,11 +3031,30 @@ class TradingEngine:
|
||||
# und das Alter hebt sich rechnerisch auf (Ergebnis: −347 s).
|
||||
# Verwendet wird daher der direkte Beleg: **wann hat sich der Kurs zuletzt
|
||||
# BEWEGT?** Kein Zeitzonen-, Kalender- oder Feiertagswissen nötig.
|
||||
# ⚠ NACHTRAG 2026-08-01: Punkt (2) galt nur, solange `_broker_offset_s()`
|
||||
# den Offset aus einem MÖGLICHERWEISE STALEN Tick ableitete. Seit dem Fix
|
||||
# dort (Offset nur aus frischem Tick, sonst letzter gültiger Wert) ist die
|
||||
# Rechnung nicht mehr zirkulär — deshalb dient das echte Tick-Alter jetzt
|
||||
# als STARTWERT der Stillstands-Uhr. Ohne ihn begann die Uhr bei jedem
|
||||
# Neustart bei null und der Bot brauchte 180 s, um ein längst geschlossenes
|
||||
# Wochenende zu bemerken (real: Reload direkt nach `restart_server.bat`
|
||||
# zeigte „KURS" statt „KURS · ZU" und den eingefrorenen Broker-G/V).
|
||||
# Laufender Betrieb bleibt bewusst bewegungs-basiert: das erkennt auch
|
||||
# einen eingefrorenen Feed, dessen Zeitstempel weiterlaufen.
|
||||
_now = time.time()
|
||||
try:
|
||||
_b = (market or {}).get("bid")
|
||||
if _b is not None:
|
||||
if self._last_bid is None or abs(float(_b) - self._last_bid) > 1e-9:
|
||||
if self._last_bid is None:
|
||||
self._last_bid = float(_b)
|
||||
_srv = (market or {}).get("tick_server_ts")
|
||||
_age0 = 0.0
|
||||
if _srv:
|
||||
_a = _now + self.trader._broker_offset_s() - float(_srv)
|
||||
if 0.0 <= _a <= 14 * 86400: # plausibel: bis ~2 Wochen Stillstand
|
||||
_age0 = _a
|
||||
self._last_bid_move_ts = _now - _age0
|
||||
elif abs(float(_b) - self._last_bid) > 1e-9:
|
||||
self._last_bid = float(_b)
|
||||
self._last_bid_move_ts = _now
|
||||
except Exception:
|
||||
|
||||
Reference in New Issue
Block a user