From 3a1d8f76872d2b6fec023a03a54e0e535f9442d6 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Wed, 19 Aug 2026 00:25:11 +0200 Subject: [PATCH] Y-Stapel oben rechts: gemessen statt geschaetzt (Indikator v1.42) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User: oben rechts ueberlagern die Texte immer noch. ZWEI Fehler in meinem eigenen v1.41-Fix: (1) Die Y-Zuweisungen standen INNERHALB von if(ObjectFind < 0) -- sie griffen also nur beim ERZEUGEN. Ein bereits vorhandenes Label behielt seine alte Position. Denselben Fehler hatte ich bei der X-Zentrierung schon gefangen und hier trotzdem wiederholt. (2) Der Faktor 1,8 px je Punkt war nur die NAECHSTE Schaetzung. Bei anderer DPI-Skalierung waere er wieder falsch gewesen. Jetzt: LabelH() misst die TATSAECHLICHE Pixelhoehe ueber TextGetSize (TextSetFont nimmt 1/10 Punkt bei negativer Groesse) und gibt sie +6 px Luft zurueck; Rueckfall size*2, falls die Messung 0 liefert. Y wird bei JEDEM Redraw gesetzt. ⚠ TextGetSize verlangt uint& -- mit int& kompiliert es nicht (error 246). Kompiliert ins richtige Terminal: 0 errors, 0 warnings, .ex5 frisch. Co-Authored-By: Claude Opus 5 --- mql5/SR_Levels.mq5 | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/mql5/SR_Levels.mq5 b/mql5/SR_Levels.mq5 index cf6df51..b6e76fd 100644 --- a/mql5/SR_Levels.mq5 +++ b/mql5/SR_Levels.mq5 @@ -12,7 +12,12 @@ //| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). | //+------------------------------------------------------------------+ #property copyright "Oil Trading Bot" -#property version "1.41" +#property version "1.42" +// v1.42 (2026-08-19): Y-Stapel oben rechts GEMESSEN statt geschaetzt. Der +// Faktor 1,8 aus v1.41 war nur die naechste Schaetzung; jetzt liefert +// TextGetSize die TATSAECHLICHE Pixelhoehe (LabelH). Ausserdem wird Y bei +// JEDEM Redraw gesetzt, nicht nur beim Erzeugen -- ein bereits +// vorhandenes Label behielt sonst seine alte Position. // v1.41 (2026-08-19): Y-STAPEL oben rechts korrigiert (User: "oben rechts die // Texte ueberlagern sich"). Dieselbe Punkt-statt-Pixel-Rechnung wie // gestern links: bei InpPriceSize=20 lag G/V auf y=44 mitten im Kurs @@ -278,6 +283,25 @@ double g_conePx = 0.0; // aktueller Kurs (aus der PX-Zei bool g_range_drawn = false; // hat DIESE Instanz die Range gezeichnet? //+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| ECHTE Pixelhoehe eines Labels — gemessen, nicht geschaetzt. | +//| ⚠⚠ Die drei Labels oben rechts haben sich zweimal ueberlagert, | +//| weil OBJPROP_FONTSIZE in PUNKT angegeben wird und der Code mit | +//| Pixeln rechnete. Ein Korrekturfaktor (1,8) war nur die naechste| +//| Schaetzung — bei anderer DPI-Skalierung waere er wieder falsch.| +//| TextGetSize liefert die TATSAECHLICHE Hoehe in Pixeln. | +//| TextSetFont nimmt die Groesse in 1/10 Punkt, wenn sie NEGATIV | +//| ist — deshalb -size*10. | +//+------------------------------------------------------------------+ +int LabelH(const string font, const int size) +{ + TextSetFont(font, -size * 10); + uint w = 0, h = 0; + TextGetSize("0123456789.", w, h); + return (h > 0 ? (int)h + 6 : size * 2); // +6 px Luft; Rueckfall falls 0 +} + int OnInit() { if(InpApplyTheme) ApplyTheme(); @@ -884,14 +908,15 @@ void Redraw() ObjectSetInteger(0, hn, OBJPROP_CORNER, CORNER_RIGHT_UPPER); ObjectSetInteger(0, hn, OBJPROP_XDISTANCE, 12); // unter Kurs (14) und G/V (14+PriceSize+6) einreihen - ObjectSetInteger(0, hn, OBJPROP_YDISTANCE, - 14 + (int)(InpPriceSize * 1.8) - + (int)(MathMax(8, InpPriceSize - 4) * 1.8)); + // Y wird unten jeden Redraw gesetzt ObjectSetInteger(0, hn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER); ObjectSetInteger(0, hn, OBJPROP_SELECTABLE, false); ObjectSetString (0, hn, OBJPROP_FONT, "Arial"); } ObjectSetInteger(0, hn, OBJPROP_FONTSIZE, (int)MathMax(10, InpPriceSize - 7)); + ObjectSetInteger(0, hn, OBJPROP_YDISTANCE, + 14 + LabelH("Arial Black", InpPriceSize) + + LabelH("Arial", (int)MathMax(8, InpPriceSize - 4))); ObjectSetInteger(0, hn, OBJPROP_COLOR, InpHLColor); ObjectSetString (0, hn, OBJPROP_TEXT, "HL " + DoubleToString(hlp, (int)_Digits) @@ -923,12 +948,15 @@ void Redraw() // rechnen mit Faktor 1,8 px je PUNKT — FONTSIZE ist in Punkt, // nicht Pixel. Die alte Formel behandelte sie wie Pixel, dadurch // lag G/V (y=44) IM Kurs (14..50) und HL (y=56) IM G/V (44..73). - ObjectSetInteger(0, pn, OBJPROP_YDISTANCE, 14); + ObjectSetInteger(0, pn, OBJPROP_YDISTANCE, 14); // s. u. — jeden Redraw ObjectSetInteger(0, pn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER); ObjectSetString (0, pn, OBJPROP_FONT, "Arial Black"); ObjectSetInteger(0, pn, OBJPROP_FONTSIZE, InpPriceSize); ObjectSetInteger(0, pn, OBJPROP_SELECTABLE, false); } + // ⚠ JEDEN Redraw setzen, nicht nur beim Erzeugen — sonst behaelt ein + // bereits vorhandenes Label seine ALTE Position fuer immer. + ObjectSetInteger(0, pn, OBJPROP_YDISTANCE, 14); ObjectSetString (0, pn, OBJPROP_TEXT, DoubleToString(pxv, (int)_Digits)); ObjectSetInteger(0, pn, OBJPROP_COLOR, InpPriceColor); continue; @@ -1038,13 +1066,14 @@ void Redraw() 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 + (int)(InpPriceSize * 1.8)); + // Y wird unten jeden Redraw gesetzt 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)); + ObjectSetInteger(0, qn, OBJPROP_YDISTANCE, + 14 + LabelH("Arial Black", InpPriceSize)); ObjectSetString (0, qn, OBJPROP_TEXT, (plv >= 0 ? "+" : "") + DoubleToString(plv, 2) + (StringLen(cur) > 0 ? " " + cur : ""));