Y-Stapel oben rechts: gemessen statt geschaetzt (Indikator v1.42)

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 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-19 00:25:11 +02:00
co-authored by Claude Opus 5
parent e1a671a137
commit 3a1d8f7687
+36 -7
View File
@@ -12,7 +12,12 @@
//| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). | //| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). |
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
#property copyright "Oil Trading Bot" #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 // v1.41 (2026-08-19): Y-STAPEL oben rechts korrigiert (User: "oben rechts die
// Texte ueberlagern sich"). Dieselbe Punkt-statt-Pixel-Rechnung wie // Texte ueberlagern sich"). Dieselbe Punkt-statt-Pixel-Rechnung wie
// gestern links: bei InpPriceSize=20 lag G/V auf y=44 mitten im Kurs // 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? 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() int OnInit()
{ {
if(InpApplyTheme) ApplyTheme(); if(InpApplyTheme) ApplyTheme();
@@ -884,14 +908,15 @@ void Redraw()
ObjectSetInteger(0, hn, OBJPROP_CORNER, CORNER_RIGHT_UPPER); ObjectSetInteger(0, hn, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0, hn, OBJPROP_XDISTANCE, 12); ObjectSetInteger(0, hn, OBJPROP_XDISTANCE, 12);
// unter Kurs (14) und G/V (14+PriceSize+6) einreihen // unter Kurs (14) und G/V (14+PriceSize+6) einreihen
ObjectSetInteger(0, hn, OBJPROP_YDISTANCE, // Y wird unten jeden Redraw gesetzt
14 + (int)(InpPriceSize * 1.8)
+ (int)(MathMax(8, InpPriceSize - 4) * 1.8));
ObjectSetInteger(0, hn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER); ObjectSetInteger(0, hn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
ObjectSetInteger(0, hn, OBJPROP_SELECTABLE, false); ObjectSetInteger(0, hn, OBJPROP_SELECTABLE, false);
ObjectSetString (0, hn, OBJPROP_FONT, "Arial"); ObjectSetString (0, hn, OBJPROP_FONT, "Arial");
} }
ObjectSetInteger(0, hn, OBJPROP_FONTSIZE, (int)MathMax(10, InpPriceSize - 7)); 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); ObjectSetInteger(0, hn, OBJPROP_COLOR, InpHLColor);
ObjectSetString (0, hn, OBJPROP_TEXT, ObjectSetString (0, hn, OBJPROP_TEXT,
"HL " + DoubleToString(hlp, (int)_Digits) "HL " + DoubleToString(hlp, (int)_Digits)
@@ -923,12 +948,15 @@ void Redraw()
// rechnen mit Faktor 1,8 px je PUNKT — FONTSIZE ist in Punkt, // rechnen mit Faktor 1,8 px je PUNKT — FONTSIZE ist in Punkt,
// nicht Pixel. Die alte Formel behandelte sie wie Pixel, dadurch // 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). // 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); ObjectSetInteger(0, pn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
ObjectSetString (0, pn, OBJPROP_FONT, "Arial Black"); ObjectSetString (0, pn, OBJPROP_FONT, "Arial Black");
ObjectSetInteger(0, pn, OBJPROP_FONTSIZE, InpPriceSize); ObjectSetInteger(0, pn, OBJPROP_FONTSIZE, InpPriceSize);
ObjectSetInteger(0, pn, OBJPROP_SELECTABLE, false); 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)); ObjectSetString (0, pn, OBJPROP_TEXT, DoubleToString(pxv, (int)_Digits));
ObjectSetInteger(0, pn, OBJPROP_COLOR, InpPriceColor); ObjectSetInteger(0, pn, OBJPROP_COLOR, InpPriceColor);
continue; continue;
@@ -1038,13 +1066,14 @@ void Redraw()
ObjectSetInteger(0, qn, OBJPROP_CORNER, CORNER_RIGHT_UPPER); ObjectSetInteger(0, qn, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0, qn, OBJPROP_XDISTANCE, 12); ObjectSetInteger(0, qn, OBJPROP_XDISTANCE, 12);
// direkt unter dem Kurs: dessen Y (14) + Schrifthoehe + kleiner Abstand // direkt unter dem Kurs: dessen Y (14) + Schrifthoehe + kleiner Abstand
ObjectSetInteger(0, qn, OBJPROP_YDISTANCE, // Y wird unten jeden Redraw gesetzt
14 + (int)(InpPriceSize * 1.8));
ObjectSetInteger(0, qn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER); ObjectSetInteger(0, qn, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
ObjectSetString (0, qn, OBJPROP_FONT, "Arial Black"); ObjectSetString (0, qn, OBJPROP_FONT, "Arial Black");
ObjectSetInteger(0, qn, OBJPROP_SELECTABLE, false); ObjectSetInteger(0, qn, OBJPROP_SELECTABLE, false);
} }
ObjectSetInteger(0, qn, OBJPROP_FONTSIZE, (int)MathMax(8, InpPriceSize - 4)); 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, ObjectSetString (0, qn, OBJPROP_TEXT,
(plv >= 0 ? "+" : "") + DoubleToString(plv, 2) (plv >= 0 ? "+" : "") + DoubleToString(plv, 2)
+ (StringLen(cur) > 0 ? " " + cur : "")); + (StringLen(cur) > 0 ? " " + cur : ""));