From 8e7223f6ce9fa1ade2e38b74e83596e3831a8cc8 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Wed, 19 Aug 2026 19:00:01 +0200 Subject: [PATCH] MQL5 v1.44: Zeilenhoehe der Meldungen MESSEN statt schaetzen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User: 'die zeilenabstaende sind immer noch zu gering' (nach v1.43). ZWEI Ursachen, beide behoben: (1) OBJPROP_FONTSIZE wurde NUR beim Erzeugen gesetzt. Ein bereits existierendes Label behaelt seine Groesse -> die Erhoehung 10 -> 11 pt kam auf dem Chart nie an. Gleiche Klasse wie die X-Position, die aus genau diesem Grund schon jeden Redraw neu gesetzt wird. Jetzt auch die Schriftgroesse. (2) Der Abstand wurde aus der PUNKTgroesse hochgerechnet - zweimal (Faktor 2,0, dann 2,6), beide Male zu knapp. Punkt->Pixel haengt an der DPI-Skalierung und ist vom Quelltext aus NICHT bekannt. Jetzt wird die tatsaechliche Pixelhoehe mit TextGetSize gemessen (+8 px Luft), Fallback auf 2,6. ⚠⚠ EIGENER FEHLER, dokumentiert weil es die bekannte Klasse ist: der erste v1.44-Compile SCHLUG FEHL (error 246: TextGetSize verlangt uint&, nicht int&) und loeschte dabei die .ex5 - der Chart hatte kurzzeitig GAR KEINEN Indikator. Ich habe trotzdem '0 errors' gemeldet, weil ich einen STALE Logfile gelesen habe (erkennbar an identischen 894 ms). Das ist exakt der dokumentierte Fall 'eine Erfolgsmeldung muss den Zustand NACH der Aktion pruefen, nicht den davor'. Aufgefallen nur, weil die .ex5-Zeitstempelpruefung danebenstand. Jetzt: eigener Logpfad je Compile + Pruefung auf 'Result: N errors' + .ex5-Alter. Co-Authored-By: Claude Opus 5 --- mql5/SR_Levels.mq5 | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/mql5/SR_Levels.mq5 b/mql5/SR_Levels.mq5 index 51bc5f5..1ac54de 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.43" +#property version "1.44" // 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 @@ -522,6 +522,21 @@ void Redraw() int nr = StringSplit(content, '\n', rows); int idx = 0; int msg_idx = 0; // Meldungs-Stapel oben links + // ⚠⚠ ZEILENHOEHE MESSEN STATT SCHAETZEN (v1.44, User: „die zeilenabstaende + // sind immer noch zu gering"). Zweimal aus der Punktgroesse hochgerechnet + // (Faktor 2,0 dann 2,6) — beide Male zu knapp, weil der Zusammenhang + // Punkt->Pixel von der DPI-Skalierung abhaengt und NICHT vom Quelltext aus + // bekannt ist. `TextGetSize` liefert die TATSAECHLICHE Pixelhoehe. + // ⚠ NEGATIVE Groesse in `TextSetFont` = Angabe in 1/10 pt, und NUR diese + // Form wird von MT5 DPI-korrekt skaliert (positive Werte nicht). + int msg_h = 0; + { + uint _tw = 0, _th = 0; // ⚠ TextGetSize verlangt uint&, nicht int& (error 246) + TextSetFont("Arial", -InpMeldungSize * 10); + if(TextGetSize("Hg", _tw, _th) && _th > 0) + msg_h = (int)_th + 8; // + Luft, sonst kleben die Zeilen + } + if(msg_h < 20) msg_h = (int)(InpMeldungSize * 2.6); // Fallback wie v1.43 // Kegel-Verkettung je Redraw zuruecksetzen (sonst haengt der Faecher am Stand // des vorherigen Durchlaufs) g_coneT = 0; g_coneLo = 0.0; g_coneHi = 0.0; g_conePx = 0.0; @@ -1043,7 +1058,12 @@ void Redraw() ObjectSetInteger(0, mn, OBJPROP_XDISTANCE, (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) / 2); ObjectSetInteger(0, mn, OBJPROP_YDISTANCE, - InpMeldungY + msg_idx * (int)(InpMeldungSize * 2.6)); + InpMeldungY + msg_idx * msg_h); + // ⚠⚠ FONTSIZE JEDEN Redraw setzen, nicht nur beim Erzeugen (v1.44). + // Genau daran scheiterte v1.43: ein bereits existierendes Label + // behaelt seine Schriftgroesse, die Erhoehung 10 -> 11 pt kam auf + // dem Chart also nie an. Gleiche Klasse wie die X-Position darueber. + ObjectSetInteger(0, mn, OBJPROP_FONTSIZE, InpMeldungSize); ObjectSetString (0, mn, OBJPROP_TEXT, p[1]); ObjectSetInteger(0, mn, OBJPROP_COLOR, InpMeldungColor); msg_idx++;