From 2bda2680bbe828aa4d82a32b5841900f77708734 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Thu, 30 Jul 2026 19:20:49 +0200 Subject: [PATCH] MQL5 v1.28: G/V der offenen Position unter dem Kurs User-Wunsch. Der Bot exportiert PL;wert;waehrung, der Indikator zeigt es als OBJ_LABEL direkt unter dem Kurs oben rechts (CORNER_RIGHT_UPPER, Y = Kurs-Y + Schrifthoehe + Abstand), gruen im Plus / rot im Minus. Wert ist NETTO wie im Dashboard: bei Gewinn abzueglich der WHT-Quellensteuer ([trading] wht_pct = 26.375), bei Verlust unveraendert (dort faellt keine an). Ohne offene Position schickt der Bot keine PL-Zeile -> Redraw() raeumt das Label per ObjectsDeleteAll(PFX) automatisch weg. Verifiziert: PL;-20.59;EUR in sr_levels.csv, deckt sich mit dem Dashboard-Netto. Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 2 +- core/engine.py | 15 +++++++++++++++ mql5/SR_Levels.mq5 | 39 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 7c993cf..9b80df3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1202,7 +1202,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche: Daten älter als 60 s werden verworfen. **REINE ANZEIGE** — ob HL-Buch-Signale auf den CFD übertragbar sind, wird gerade gemessen (`analyze_bookflow.py` im HL-Projekt, Datensammlung seit 2026-07-30, Urteil in ~2 Wochen). Der Indikator - **`mql5/SR_Levels.mq5`** (**v1.23** — `LQ`-Handler zeichnet seit v1.14 **nur noch + **`mql5/SR_Levels.mq5`** (**v1.28** — `LQ`-Handler zeichnet seit v1.14 **nur noch den PFEIL**, rechtsbündig am aktuellen Rand (in `RepositionLabels()` nachgeführt, bleibt beim Scrollen rechts; Details im **Tooltip**) — Linie und Text-Label sind auf User-Wunsch raus („Chart zu voll"). **v1.15 = CHART-THEME** (User „Farben im diff --git a/core/engine.py b/core/engine.py index ad3d235..9f22dd8 100644 --- a/core/engine.py +++ b/core/engine.py @@ -2031,6 +2031,21 @@ class TradingEngine: lines.append(f"PX;{_bid}") except Exception: pass + # G/V der offenen Position, direkt unter dem Kurs (User-Wunsch 2026-07-30): + # PL;wert;waehrung. **NETTO** wie im Dashboard — bei Gewinn abzüglich der + # WHT-Quellensteuer, die der Broker einbehält (`[trading] wht_pct`); bei + # Verlust unverändert (da fällt keine Steuer an). Ohne Position keine Zeile + # → der Indikator löscht das Label. + try: + _ps = self.trader.snapshot() + if _ps.get("ticket") and _ps.get("pnl") is not None: + _p = float(_ps["pnl"]) + if _p > 0 and self._wht_pct > 0: + _p *= (1.0 - self._wht_pct / 100.0) + _cur = (self.data.snapshot() or {}).get("currency") or "" + lines.append(f"PL;{_p:.2f};{_cur}") + except Exception: + pass # Trade-Marker: TR;; → 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. diff --git a/mql5/SR_Levels.mq5 b/mql5/SR_Levels.mq5 index 431fab0..bca144e 100644 --- a/mql5/SR_Levels.mq5 +++ b/mql5/SR_Levels.mq5 @@ -12,7 +12,11 @@ //| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). | //+------------------------------------------------------------------+ #property copyright "Oil Trading Bot" -#property version "1.27" +#property version "1.28" +// v1.28 (2026-07-30): G/V der offenen Position direkt UNTER dem Kurs oben rechts +// (User-Wunsch) — PL;wert;waehrung, NETTO wie im Dashboard (WHT-Quellensteuer +// bei Gewinn bereits abgezogen). Gruen im Plus, rot im Minus; ohne offene +// Position schickt der Bot keine PL-Zeile -> Label verschwindet. // v1.27 (2026-07-30): S/R-Label zeigt nur noch die Prozentzahl statt // „Durchbruch 34%" (User-Wunsch) — der ausgeschriebene Text bleibt im Tooltip. // v1.26 (2026-07-30): Beschriftungen + Pfeile stehen jetzt GANZ rechts am @@ -132,6 +136,9 @@ input int InpLabelSize = 12; // Schriftgroesse der Linien-Besc input bool InpShowPBreak = true; // Durchbruchwahrscheinlichkeit am S/R-Label input color InpLabelColor = clrWhite; // Farbe ALLER Linien-Beschriftungen (User-Wunsch: weiss) input color InpPriceColor = clrWhite; // Kurs oben rechts (weiss) +input bool InpShowPnL = true; // G/V der offenen Position unter dem Kurs +input color InpPnLUpColor = C'0,255,127'; // G/V im Plus (neongruen) +input color InpPnLDownColor = C'255,69,0'; // G/V im Minus (rot) // ── Chart-THEME (User-Vorgabe 2026-07-30 „Farben im MT5 wie im Bild") ──────── // Setzt beim Start die Chart-Eigenschaften auf die Dashboard-Palette, damit MT5 // und die PWA gleich aussehen. Farben in MQL5-Notation C'R,G,B'. @@ -594,6 +601,36 @@ void Redraw() ObjectSetInteger(0, pn, OBJPROP_COLOR, InpPriceColor); continue; } + // G/V der offenen Position — direkt UNTER dem Kurs (User-Wunsch 2026-07-30): + // PL;wert;waehrung. Wert ist NETTO (Bot rechnet die WHT-Quellensteuer schon + // raus, wie im Dashboard). Gruen im Plus, rot im Minus. Ohne offene Position + // schickt der Bot keine PL-Zeile -> das Label wird unten geloescht. + if(typ == "PL") + { + if(k < 2) continue; + if(!InpShowPnL) continue; + double plv = StringToDouble(p[1]); + string cur = (k > 2) ? p[2] : ""; + string qn = PFX + "PNL"; + if(ObjectFind(0, qn) < 0) + { + ObjectCreate(0, qn, OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, qn, OBJPROP_CORNER, CORNER_RIGHT_UPPER); + ObjectSetInteger(0, qn, OBJPROP_XDISTANCE, 12); + // direkt unter dem Kurs: dessen Y (14) + Schrifthoehe + kleiner Abstand + ObjectSetInteger(0, qn, OBJPROP_YDISTANCE, 14 + InpPriceSize + 10); + ObjectSetInteger(0, qn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER); + ObjectSetString (0, qn, OBJPROP_FONT, "Arial Black"); + ObjectSetInteger(0, qn, OBJPROP_SELECTABLE, false); + } + ObjectSetInteger(0, qn, OBJPROP_FONTSIZE, (int)MathMax(8, InpPriceSize - 4)); + ObjectSetString (0, qn, OBJPROP_TEXT, + (plv >= 0 ? "+" : "") + DoubleToString(plv, 2) + + (StringLen(cur) > 0 ? " " + cur : "")); + ObjectSetInteger(0, qn, OBJPROP_COLOR, + (plv >= 0 ? InpPnLUpColor : InpPnLDownColor)); + continue; + } // TRADE-MARKER: TR;; → die Kerze, in der eröffnet bzw. // geschlossen wurde, wird umrandet (User-Vorgabe 2026-07-30): // O = Eröffnung → HELLGRÜN · C = Close → DUNKELGRÜN