MT5-Chart v1.18: Trade-Marker, Liquiditaetszonen, Kurs oben rechts + Pfeil-Bugfix

Pfeil-Bugfix (User: "liquiditaetspfeile werden immer noch nicht angezeigt"):
  (1) ANCHOR_LEFT ist fuer OBJ_ARROW UNGUELTIG (nur TOP/BOTTOM)
  (2) Pfeile sitzen rechts neben der letzten Kerze -> ohne CHART_SHIFT kein
      sichtbarer Bereich dort
Blink-Fix (User: "blinken nur manchmal auf"): hl_walls setzte den Cache bei jedem
Fehlschlag auf None -> LQ-Zeilen fehlten -> Indikator loeschte die Pfeile. Jetzt
letzter guter Stand 120s Grace.

Neu (alles reine Anzeige):
- TR;<O|C>;zeit  -> Kerze der Eroeffnung HELLGRUEN, des Close DUNKELGRUEN umrandet
- EQ;<H|L>;lo;hi;zeit -> Equal Highs/Lows aus M30-Pivots als goldenes Band +
  gestrichelte Kante (wie im User-Referenzbild). Als Signal gemessen verworfen.
- PX;bid -> aktueller Kurs fett oben rechts
- Beschriftung der Liquiditaets-Trendlinie per Default aus (v1.16)

Alles kompiliert und live in sr_levels.csv verifiziert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-30 18:36:22 +02:00
co-authored by Claude Opus 4.8
parent b75997d703
commit 03567adf6b
5 changed files with 280 additions and 14 deletions
+41
View File
@@ -75,6 +75,8 @@ _SQUEEZE_REENTRY_COOLDOWN_S = 180.0 # nach JEDEM Close eines Trades (Notfall/SL
# gegen die Open→Instant-Close-Kaskade bei zu engem Stop
# (real 2026-07-27 15:39: 3-€-Stop killte Entry #1 in 16 s,
# Squeeze noch aktiv → sofortiger Re-Entry; 2026-07-28)
_TRADE_MARKS = 6 # so viele letzte Trades im MQL5-Chart markieren
# (Kerze umranden: Eröffnung hellgrün, Close dunkelgrün)
_STARTUP_GRACE_S = 60.0 # nach Bot-Start schließt der Bot 60 s lang KEINEN
# laufenden Trade server-seitig (S/R-Close/Notfall/
# Time-Stop/Reverse) — die Daten (Preis/ATR/P(break)/
@@ -1984,6 +1986,45 @@ class TradingEngine:
f"{'U' if tr.get('dir')=='up' else 'D'}")
except Exception:
pass
# Liquiditätszonen (Equal Highs/Lows, M30): EQ;<H|L>;lo;hi;<broker_time>
# → goldenes Band ab dem ersten Pivot, nach rechts verlängert.
# ⚠ REINE ANZEIGE (als Signal gemessen verworfen, s. backtest_liquidity_sweep).
try:
zs = (self.wave.snapshot() or {}).get("liq_zones") or {}
boff_z = self.trader._broker_offset_s()
for key, tag in (("eqh", "H"), ("eql", "L")):
z = zs.get(key)
if z and z.get("lo") and z.get("hi"):
# `t` ist ROHE Broker-Zeit aus copy_rates → NICHT nochmal
# umrechnen (anders als die HL-Trendlinie, die lokal tickt).
lines.append(f"EQ;{tag};{z['lo']};{z['hi']};{int(z['t'])}")
except Exception:
pass
# Aktueller Kurs für die fette Anzeige oben rechts (User-Wunsch): PX;bid
try:
_bid = (self.data.snapshot() or {}).get("bid")
if _bid:
lines.append(f"PX;{_bid}")
except Exception:
pass
# Trade-Marker: TR;<O|C>;<broker_time> → der Indikator umrandet die Kerze,
# in der eröffnet (hellgrün) bzw. geschlossen (dunkelgrün) wurde
# (User-Vorgabe 2026-07-30). Offene Position + die letzten Trades des Tages.
try:
boff = self.trader._broker_offset_s()
marks: list[tuple[str, int]] = []
ps = self.trader.snapshot()
if ps.get("ticket") and ps.get("open_time"):
marks.append(("O", int(float(ps["open_time"]) + boff)))
for t in (self.history.last_closed_trades(_TRADE_MARKS) or []):
if t.get("entry_time"):
marks.append(("O", int(float(t["entry_time"]) + boff)))
if t.get("exit_time"):
marks.append(("C", int(float(t["exit_time"]) + boff)))
for kind, ts in marks[:2 * _TRADE_MARKS + 1]:
lines.append(f"TR;{kind};{ts}")
except Exception:
pass
# Zonen NICHT mehr aus der (statischen) [zones]-Config — die dynamische
# Handels-Range zeichnet der Indikator selbst aus den Chart-Kerzen (TF-genau).
path = os.path.join(self._mql5_files_dir, "sr_levels.csv")