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 : ""));