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:
co-authored by
Claude Opus 5
parent
e1a671a137
commit
3a1d8f7687
+36
-7
@@ -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 : ""));
|
||||||
|
|||||||
Reference in New Issue
Block a user