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
+33
View File
@@ -9628,3 +9628,36 @@ nie auf das eingelesene Dokument.** Und: **eine Größenprüfung belegt nur, das
nichts abgeschnitten wurde — nicht, dass der Inhalt stimmt** (dieselbe Klasse nichts abgeschnitten wurde — nicht, dass der Inhalt stimmt** (dieselbe Klasse
wie „eine LEERE Datei besteht `node --check`"). Wo es billig ist, gehört die wie „eine LEERE Datei besteht `node --check`"). Wo es billig ist, gehört die
erwartete Zunahme mitgeprüft, nicht nur ihr Vorzeichen. erwartete Zunahme mitgeprüft, nicht nur ihr Vorzeichen.
### ⚠⚠ Knöpfe auf 200 % (2026-08-22, v1.49) — und zwei Fallen dabei
User: „die Knöpfe sind viel zu klein, vergrößere um 200 %".
Breite **66 → 132**, Höhe **17 → 34**, Schrift **8 → 16**.
⚠⚠ **DIE ÄNDERUNG WÄRE AUF JEDEM LAUFENDEN CHART NIE ANGEKOMMEN.** `XSIZE`,
`YSIZE` und `FONTSIZE` standen im `if(ObjectFind(...) < 0)`-Zweig, wurden also
**nur beim Erzeugen** gesetzt. Die Knöpfe leben unter `BPFX` und überstehen
`Redraw()` — ein bestehendes Objekt hätte seine alte Größe behalten. Das ist
**exakt der v1.44-Fehler** bei den Meldungs-Labels („`OBJPROP_FONTSIZE` wurde
nur beim Erzeugen gesetzt"), und ich hätte ihn beim Bauen von v1.48 schon
vermeiden können. Alle drei stehen jetzt im Redraw-Teil.
**➜ Merksatz: bei einem Objekt, das den Redraw ÜBERLEBT, gehört jede
einstellbare Eigenschaft in den Redraw-Teil — nicht in den Erzeugungs-Zweig.**
⚠⚠ **SPALTEN-RÜCKFALL, weil die Größe eine Falle aufgemacht hätte.** 13 Knöpfe
à 34 px sind ein **490 px** hoher Stapel. Auf einem niedrigen Chartfenster
liefen die obersten aus dem sichtbaren Bereich — und weil **genau diese Knöpfe
die einzige Möglichkeit sind, eine Gruppe wieder einzublenden**, wäre das ein
Zustand ohne Rückweg: ausgeblendet und nicht mehr erreichbar. `BtnDraw()` misst
jetzt `CHART_HEIGHT_IN_PIXELS` und bricht bei Bedarf in eine zweite Spalte um.
| Chart-Höhe | je Spalte | Spalten |
|---|---|---|
| 400 px | 10 | **2** |
| ab ~600 px | 13 | 1 |
⚠ Im Umbruch-Fall stimmt die Lesereihenfolge nicht mehr exakt (bei
`CORNER_LEFT_LOWER` wächst `YDISTANCE` nach oben) — bewusst in Kauf genommen:
erreichbar schlägt schön, und der Normalfall ist eine Spalte.
`0 errors, 0 warnings`, `.ex5` frisch, Spiegel bitgleich.
⚠ Wer noch größer will, dreht `InpBtnBreite`/`InpBtnHoehe`/`InpBtnFont` weiter —
der Spalten-Rückfall fängt zu hohe Stapel ab.
+24 -9
View File
@@ -12,7 +12,7 @@
//| 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.48" #property version "1.49"
// v1.42 (2026-08-19): Y-Stapel oben rechts GEMESSEN statt geschaetzt. Der // 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 // Faktor 1,8 aus v1.41 war nur die naechste Schaetzung; jetzt liefert
// TextGetSize die TATSAECHLICHE Pixelhoehe (LabelH). Ausserdem wird Y bei // 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 bool InpBtnOben = false; // Knoepfe oben statt unten links
input int InpBtnX = 4; // Abstand vom linken Rand (px) input int InpBtnX = 4; // Abstand vom linken Rand (px)
input int InpBtnY = 22; // Abstand vom Rand (px) input int InpBtnY = 22; // Abstand vom Rand (px)
input int InpBtnBreite = 66; // Knopfbreite (px) // ⚠ Alle drei am 2026-08-22 auf 200 % (User: "viel zu klein").
input int InpBtnHoehe = 17; // Knopfhoehe (px) // Vorher 66/17/8. Wer noch groesser will, dreht hier weiter — der
input int InpBtnFont = 8; // Schriftgroesse // 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 InpBtnAnFarbe = C'58,116,84'; // Hintergrund AN
input color InpBtnAusFarbe = C'64,64,68'; // Hintergrund AUS input color InpBtnAusFarbe = C'64,64,68'; // Hintergrund AUS
@@ -375,6 +378,15 @@ void BtnDraw()
{ {
if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; } if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; }
int h = MathMax(10, InpBtnHoehe); 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++) for(int i = 0; i < BTN_N; i++)
{ {
string nm = BPFX + g_bkey[i]; string nm = BPFX + g_bkey[i];
@@ -383,20 +395,23 @@ void BtnDraw()
if(!ObjectCreate(0, nm, OBJ_BUTTON, 0, 0, 0)) continue; if(!ObjectCreate(0, nm, OBJ_BUTTON, 0, 0, 0)) continue;
ObjectSetInteger(0, nm, OBJPROP_CORNER, ObjectSetInteger(0, nm, OBJPROP_CORNER,
InpBtnOben ? CORNER_LEFT_UPPER : CORNER_LEFT_LOWER); 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_COLOR, clrWhite);
ObjectSetInteger(0, nm, OBJPROP_BORDER_COLOR, C'90,90,96'); ObjectSetInteger(0, nm, OBJPROP_BORDER_COLOR, C'90,90,96');
ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false); ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0, nm, OBJPROP_ZORDER, 100); 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 // Stapelrichtung so, dass der ERSTE Knopf immer OBEN steht — bei
// CORNER_LEFT_LOWER waechst YDISTANCE nach oben, die Liste liefe // CORNER_LEFT_LOWER waechst YDISTANCE nach oben, die Liste liefe
// sonst verkehrt herum. // sonst verkehrt herum.
int rang = InpBtnOben ? i : (BTN_N - 1 - i); 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); BtnPaint(i);
} }
} }