MQL5 v1.49: Knoepfe auf 200 % + Spalten-Rueckfall

User: "die knoepfe sind viel zu klein, vergroessere um 200%".
Breite 66->132, Hoehe 17->34, Schrift 8->16.

FALLE 1 - die Aenderung waere auf jedem laufenden Chart NIE angekommen:
XSIZE, YSIZE und FONTSIZE standen im if(ObjectFind<0)-Zweig, wurden also nur
beim ERZEUGEN gesetzt. Die Knoepfe leben unter BPFX und ueberstehen Redraw() -
ein bestehendes Objekt haette seine alte Groesse behalten. Exakt der
v1.44-Fehler bei den Meldungs-Labels. Alle drei stehen jetzt im Redraw-Teil.
Merksatz: bei einem Objekt, das den Redraw UEBERLEBT, gehoert jede
einstellbare Eigenschaft in den Redraw-Teil, nicht in den Erzeugungs-Zweig.

FALLE 2 - die Groesse haette eine Falle aufgemacht: 13 Knoepfe a 34 px sind ein
490 px hoher Stapel. Auf einem niedrigen Chartfenster liefen die obersten aus
dem sichtbaren Bereich - und weil genau diese Knoepfe die einzige Moeglichkeit
sind, eine Gruppe wieder einzublenden, waere das ein Zustand ohne Rueckweg.
BtnDraw() misst jetzt CHART_HEIGHT_IN_PIXELS und bricht bei Bedarf in eine
zweite Spalte um (400 px -> 10 je Spalte / 2 Spalten; ab ~600 px eine Spalte).
Im Umbruch-Fall stimmt die Lesereihenfolge nicht mehr exakt - bewusst in Kauf
genommen, erreichbar schlaegt schoen.

0 errors 0 warnings, .ex5 frisch, Spiegel bitgleich.
This commit is contained in:
Axel Hocks
2026-08-22 12:24:46 +02:00
parent 911d5220b9
commit 4a6be29c8f
2 changed files with 57 additions and 9 deletions
+24 -9
View File
@@ -12,7 +12,7 @@
//| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). |
//+------------------------------------------------------------------+
#property copyright "Oil Trading Bot"
#property version "1.48"
#property version "1.49"
// 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
@@ -302,9 +302,12 @@ input bool InpShowButtons = true; // Schaltflaechen links einblende
input bool InpBtnOben = false; // Knoepfe oben statt unten links
input int InpBtnX = 4; // Abstand vom linken Rand (px)
input int InpBtnY = 22; // Abstand vom Rand (px)
input int InpBtnBreite = 66; // Knopfbreite (px)
input int InpBtnHoehe = 17; // Knopfhoehe (px)
input int InpBtnFont = 8; // Schriftgroesse
// ⚠ Alle drei am 2026-08-22 auf 200 % (User: "viel zu klein").
// Vorher 66/17/8. Wer noch groesser will, dreht hier weiter — der
// Spalten-Rueckfall in BtnDraw() faengt zu hohe Stapel ab.
input int InpBtnBreite = 132; // Knopfbreite (px)
input int InpBtnHoehe = 34; // Knopfhoehe (px)
input int InpBtnFont = 16; // Schriftgroesse
input color InpBtnAnFarbe = C'58,116,84'; // Hintergrund AN
input color InpBtnAusFarbe = C'64,64,68'; // Hintergrund AUS
@@ -375,6 +378,15 @@ void BtnDraw()
{
if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; }
int h = MathMax(10, InpBtnHoehe);
// ⚠⚠ SPALTEN-RUECKFALL. Mit der 200-%-Groesse ist der Stapel 490 px hoch;
// auf einem niedrigen Chartfenster liefen die obersten Knoepfe aus dem
// sichtbaren Bereich — und weil GENAU DIESE Knoepfe die einzige
// Moeglichkeit sind, eine Gruppe wieder einzublenden, waere das eine
// Falle: ausgeblendet und nicht mehr erreichbar. Passt die Spalte nicht,
// wird umgebrochen.
int hoch = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);
int proSpalte = (hoch > 0) ? (hoch - InpBtnY - 8) / (h + 2) : BTN_N;
proSpalte = MathMax(1, MathMin(proSpalte, BTN_N));
for(int i = 0; i < BTN_N; i++)
{
string nm = BPFX + g_bkey[i];
@@ -383,20 +395,23 @@ void BtnDraw()
if(!ObjectCreate(0, nm, OBJ_BUTTON, 0, 0, 0)) continue;
ObjectSetInteger(0, nm, OBJPROP_CORNER,
InpBtnOben ? CORNER_LEFT_UPPER : CORNER_LEFT_LOWER);
ObjectSetInteger(0, nm, OBJPROP_XSIZE, InpBtnBreite);
ObjectSetInteger(0, nm, OBJPROP_YSIZE, h);
ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, InpBtnFont);
ObjectSetInteger(0, nm, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, nm, OBJPROP_BORDER_COLOR, C'90,90,96');
ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0, nm, OBJPROP_ZORDER, 100);
}
ObjectSetInteger(0, nm, OBJPROP_XDISTANCE, InpBtnX);
ObjectSetInteger(0, nm, OBJPROP_XSIZE, InpBtnBreite);
ObjectSetInteger(0, nm, OBJPROP_YSIZE, h);
ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, InpBtnFont);
// Stapelrichtung so, dass der ERSTE Knopf immer OBEN steht — bei
// CORNER_LEFT_LOWER waechst YDISTANCE nach oben, die Liste liefe
// sonst verkehrt herum.
int rang = InpBtnOben ? i : (BTN_N - 1 - i);
ObjectSetInteger(0, nm, OBJPROP_YDISTANCE, InpBtnY + rang * (h + 2));
int spalte = rang / proSpalte;
int zeile = rang % proSpalte;
ObjectSetInteger(0, nm, OBJPROP_XDISTANCE,
InpBtnX + spalte * (InpBtnBreite + 3));
ObjectSetInteger(0, nm, OBJPROP_YDISTANCE, InpBtnY + zeile * (h + 2));
BtnPaint(i);
}
}