From 4a6be29c8f2c75ca324b5fc4e5c248ecd9349ff7 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Sat, 22 Aug 2026 12:24:46 +0200 Subject: [PATCH] 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. --- CLAUDE.md | 33 +++++++++++++++++++++++++++++++++ mql5/SR_Levels.mq5 | 33 ++++++++++++++++++++++++--------- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index af29c9e..63b9c76 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 wie „eine LEERE Datei besteht `node --check`"). Wo es billig ist, gehört die 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. diff --git a/mql5/SR_Levels.mq5 b/mql5/SR_Levels.mq5 index 9866273..38b98a4 100644 --- a/mql5/SR_Levels.mq5 +++ b/mql5/SR_Levels.mq5 @@ -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); } }