MQL5 v1.48: Schaltflaechen links zum Ein-/Ausblenden der Objektgruppen
User-Wunsch. 13 OBJ_BUTTON am linken Chartrand, Klick ueber OnChartEvent: S/R, Zonen, Kanal, Liq, LiqTr, EqH/L, Box, Kegel, Pfeile, Muster, Meldung, Kurs, Trades. Gruen = an, grau = aus. EIGENER PRAEFIX BPFX="SRBTN_": Redraw() ruft bei jedem Datei-Update ObjectsDeleteAll(0, PFX) - unter PFX waeren die Knoepfe sofort wieder weg. Nachgerechnet statt angenommen: "SRBTN_" beginnt NICHT mit "SRB_" (viertes Zeichen T gegen _), die Praefix-Loeschung greift also nicht. g_last wird beim Klick zurueckgesetzt: Redraw() steigt bei unveraendertem Dateiinhalt sofort wieder aus, ohne den Reset waere das Umschalten erst beim naechsten CSV-Update sichtbar und der Knopf saehe tot aus. Voreinstellung UNTEN links, weil oben links der Meldungs-Stapel (MS;) steht. InpBtnOben=true stellt um; die Stapelrichtung dreht mit, damit der erste Knopf immer oben steht (bei CORNER_LEFT_LOWER waechst YDISTANCE nach oben). Zustand je Symbol UND Periode in einer GlobalVariable - ueberlebt Neustart und Zeitebenen-Wechsel und hat Vorrang vor der Eingabe. Die InpShow*-Eingaben bleiben die Voreinstellung; Vis(i) ist danach die einzige Quelle fuer alle Zeichen-Zweige. OBJPROP_STATE bleibt immer false, sonst bliebe der Knopf optisch gedrueckt haengen. BtnDraw() laeuft auch im Timer (Fenstergroesse, von Hand geloeschte Objekte). Neu ist, dass die S/R-Linien ueberhaupt abschaltbar sind - sie waren als einzige Gruppe fest verdrahtet. 0 errors 0 warnings, Spiegel bitgleich, statisch geprueft: 13 Vis()-Guards, genau ein OnChartEvent, keine Praefix-Kollision. Das Klick-Verhalten selbst ist NICHT verifiziert - dafuer braucht es einen echten Klick im Chart.
This commit is contained in:
@@ -9564,3 +9564,67 @@ stimmen; der Dreiecks-Apex landet korrekt in der Zukunft.
|
|||||||
CSV-Zeile
|
CSV-Zeile
|
||||||
`PT;M5;Doppeltop;bear;87.384;86.814;dreieck;1787327400;87.954;1787328000;87.384;1787330100;87.914`.
|
`PT;M5;Doppeltop;bear;87.384;86.814;dreieck;1787327400;87.954;1787328000;87.384;1787330100;87.914`.
|
||||||
Abschaltbar wie bisher `InpShowMuster=false`; Füllfarbe `InpMusterFill`.
|
Abschaltbar wie bisher `InpShowMuster=false`; Füllfarbe `InpMusterFill`.
|
||||||
|
|
||||||
|
## ✅ SCHALTFLÄCHEN LINKS IM MT5-CHART (2026-08-21, v1.48)
|
||||||
|
|
||||||
|
User-Wunsch: die einzelnen Objektgruppen im Chart von Hand ein- und ausblenden.
|
||||||
|
**13 Knöpfe** (`OBJ_BUTTON`) am linken Rand, Klick über `OnChartEvent`:
|
||||||
|
|
||||||
|
`S/R · Zonen · Kanal · Liq · LiqTr · EqH/L · Box · Kegel · Pfeile · Muster ·
|
||||||
|
Meldung · Kurs · Trades`
|
||||||
|
|
||||||
|
Grün = an (mit `*`), grau = aus. Eingaben: `InpShowButtons` ·
|
||||||
|
`InpBtnOben` (Voreinstellung **unten** links) · `InpBtnX/Y` · `InpBtnBreite/Hoehe` ·
|
||||||
|
`InpBtnFont` · `InpBtnAnFarbe`/`InpBtnAusFarbe`.
|
||||||
|
|
||||||
|
⚠⚠ **EIGENER PRÄFIX — sonst wären die Knöpfe sofort wieder weg.** `Redraw()`
|
||||||
|
ruft bei jedem Datei-Update `ObjectsDeleteAll(0, PFX)`. Die Knöpfe liegen
|
||||||
|
deshalb unter **`BPFX = "SRBTN_"`** und werden nur in `OnDeinit` aufgeräumt.
|
||||||
|
✅ Geprüft, dass das wirklich trennt: `"SRBTN_"` beginnt **nicht** mit `"SRB_"`
|
||||||
|
(viertes Zeichen `T` gegen `_`) — die Präfix-Löschung greift also nicht. Das ist
|
||||||
|
knapp und war der erste Punkt, den ich nachgerechnet statt angenommen habe.
|
||||||
|
|
||||||
|
⚠⚠ **`g_last` MUSS beim Klick zurückgesetzt werden.** `Redraw()` steigt bei
|
||||||
|
unverändertem Dateiinhalt sofort wieder aus (`if(content == g_last) return;`) —
|
||||||
|
ohne den Reset würde ein Umschalten erst beim nächsten CSV-Update sichtbar, bis
|
||||||
|
zu Sekunden später. Es sähe aus, als reagiere der Knopf nicht.
|
||||||
|
|
||||||
|
⚠ **Voreinstellung UNTEN links**, weil oben links der Meldungs-Stapel (`MS;`)
|
||||||
|
steht — dort wären die Knöpfe eine Überdeckung. `InpBtnOben=true` stellt um; die
|
||||||
|
Stapelrichtung dreht dabei mit, damit der erste Knopf **immer oben** steht (bei
|
||||||
|
`CORNER_LEFT_LOWER` wächst `YDISTANCE` nach oben, die Liste liefe sonst verkehrt
|
||||||
|
herum).
|
||||||
|
|
||||||
|
⚠ **Der Zustand überlebt Neustart und Zeitebenen-Wechsel**: er liegt je Symbol
|
||||||
|
UND Periode in einer `GlobalVariable` (`SRB_<sym>_<period>_<key>`) und hat
|
||||||
|
Vorrang vor der Eingabe. Ohne das wäre jeder Chart-Wechsel ein Zurücksetzen von
|
||||||
|
dreizehn Knöpfen.
|
||||||
|
⚠ Die `InpShow*`-Eingaben bleiben die **Voreinstellung**; der Knopf ist danach
|
||||||
|
die Autorität. `Vis(i)` ist die **einzige** Quelle für alle Zeichen-Zweige — ein
|
||||||
|
zweiter Pfad wäre genau die Divergenz, die in diesem Projekt mehrfach
|
||||||
|
zugeschlagen hat.
|
||||||
|
⚠ **`OBJPROP_STATE` bleibt immer `false`**: sonst bliebe der Knopf optisch
|
||||||
|
„gedrückt" hängen und arbeitete gegen die Hintergrundfarbe.
|
||||||
|
⚠ **`BtnDraw()` läuft auch im Timer** — das Chart-Fenster kann seine Größe
|
||||||
|
ändern, und ein von Hand gelöschtes Objekt baut sich so wieder auf.
|
||||||
|
|
||||||
|
✅ Neu ist, dass die **S/R-Linien überhaupt abschaltbar** sind — sie waren als
|
||||||
|
einzige Gruppe fest verdrahtet.
|
||||||
|
✅ Kompiliert ins richtige Terminal, `0 errors, 0 warnings`, Spiegel
|
||||||
|
`mql5/SR_Levels.mq5` bitgleich. Statisch geprüft: 13 `Vis()`-Guards, genau ein
|
||||||
|
`OnChartEvent`, keine Präfix-Kollision.
|
||||||
|
⚠ **NICHT verifiziert ist das Klick-Verhalten selbst** — dafür braucht es einen
|
||||||
|
echten Klick im Chart. Compile und Verdrahtung sind belegt, die Wirkung nicht.
|
||||||
|
|
||||||
|
⚠⚠ **BEIM SCHREIBEN DIESES ABSCHNITTS EIN NEUER FALL DER SCHREIB-FALLE — und
|
||||||
|
die Größenprüfung hat ihn NICHT gefangen.** Der Doku-Patch wandelte `\n` nach
|
||||||
|
`\r\n` auf dem **gesamten** Dokument statt nur auf dem angehängten Block. Die
|
||||||
|
bereits vorhandenen `\r\n` wurden dadurch zu **`\r\r\n`** — 9.567 Zeilen,
|
||||||
|
+9,5 KB. Die Datei wuchs also, die Prüfung `neu > alt` war zufrieden.
|
||||||
|
✅ Aufgefallen nur, weil die Zunahme (12,5 KB) nicht zum geschriebenen Text
|
||||||
|
(~3 KB) passte; repariert durch `\r\r\n` → `\r\n`, kein Inhalt verloren.
|
||||||
|
**➜ Regel: die Zeilenenden-Umwandlung IMMER nur auf den neuen Text anwenden,
|
||||||
|
nie auf das eingelesene Dokument.** Und: **eine Größenprüfung belegt nur, dass
|
||||||
|
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.
|
||||||
|
|||||||
+164
-16
@@ -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.47"
|
#property version "1.48"
|
||||||
// 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
|
||||||
@@ -283,6 +283,146 @@ input color InpMusterFill = C'205,205,205';// Fuellung der Musterform
|
|||||||
const string PFX = "SRB_"; // Präfix S/R-Linien (aus Datei)
|
const string PFX = "SRB_"; // Präfix S/R-Linien (aus Datei)
|
||||||
const string RPFX = "SRR_"; // Präfix dynamische Range (aus Chart)
|
const string RPFX = "SRR_"; // Präfix dynamische Range (aus Chart)
|
||||||
string g_last = "\x01"; // letzter Datei-Inhalt (gegen Flackern)
|
string g_last = "\x01"; // letzter Datei-Inhalt (gegen Flackern)
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| SCHALTFLAECHEN links (User-Vorgabe 2026-08-21): jede Objektgruppe |
|
||||||
|
//| von Hand ein-/ausblenden. |
|
||||||
|
//| ⚠⚠ EIGENER PRAEFIX. `Redraw()` ruft `ObjectsDeleteAll(0, PFX)` — |
|
||||||
|
//| laegen die Knoepfe unter PFX, waeren sie bei jedem Datei-Update |
|
||||||
|
//| weg. Sie leben deshalb unter BPFX und werden NUR in OnDeinit |
|
||||||
|
//| aufgeraeumt. |
|
||||||
|
//| ⚠ Der Zustand ueberlebt Neustart und Timeframe-Wechsel: er liegt |
|
||||||
|
//| je Symbol UND Periode in einer GlobalVariable. Ohne das waere |
|
||||||
|
//| jedes Umschalten des Charts ein Zuruecksetzen — und der Nutzer |
|
||||||
|
//| muesste zwoelf Knoepfe neu stellen. |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
input bool InpShowButtons = true; // Schaltflaechen links einblenden
|
||||||
|
// ⚠ Standard ist UNTEN links: oben links stapelt der Indikator die
|
||||||
|
// Meldungen (MS;) — dort waeren die Knoepfe eine Ueberdeckung.
|
||||||
|
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
|
||||||
|
input color InpBtnAnFarbe = C'58,116,84'; // Hintergrund AN
|
||||||
|
input color InpBtnAusFarbe = C'64,64,68'; // Hintergrund AUS
|
||||||
|
|
||||||
|
#define BTN_N 13
|
||||||
|
#define B_SR 0
|
||||||
|
#define B_ZO 1
|
||||||
|
#define B_KA 2
|
||||||
|
#define B_LQ 3
|
||||||
|
#define B_LT 4
|
||||||
|
#define B_EQ 5
|
||||||
|
#define B_CO 6
|
||||||
|
#define B_CN 7
|
||||||
|
#define B_AR 8
|
||||||
|
#define B_PT 9
|
||||||
|
#define B_MS 10
|
||||||
|
#define B_PX 11
|
||||||
|
#define B_TR 12
|
||||||
|
|
||||||
|
const string BPFX = "SRBTN_";
|
||||||
|
string g_bkey[BTN_N];
|
||||||
|
string g_blbl[BTN_N];
|
||||||
|
bool g_bvis[BTN_N];
|
||||||
|
|
||||||
|
//| Sichtbar? Einzige Quelle fuer alle Zeichen-Zweige.
|
||||||
|
bool Vis(int i) { return (i >= 0 && i < BTN_N) ? g_bvis[i] : true; }
|
||||||
|
|
||||||
|
string BtnGV(int i) { return "SRB_" + _Symbol + "_"
|
||||||
|
+ IntegerToString((int)_Period) + "_" + g_bkey[i]; }
|
||||||
|
|
||||||
|
void BtnInit()
|
||||||
|
{
|
||||||
|
// ⚠ Element-weise, NICHT als Array-Initialisierer: `input`-Variablen sind
|
||||||
|
// in MQL5 keine Konstanten, ein `bool x[N] = {InpA, InpB}` kompiliert nicht.
|
||||||
|
g_bkey[B_SR] = "SR"; g_blbl[B_SR] = "S/R"; g_bvis[B_SR] = true;
|
||||||
|
g_bkey[B_ZO] = "ZO"; g_blbl[B_ZO] = "Zonen"; g_bvis[B_ZO] = InpShowZonen;
|
||||||
|
g_bkey[B_KA] = "KA"; g_blbl[B_KA] = "Kanal"; g_bvis[B_KA] = InpShowChannel;
|
||||||
|
g_bkey[B_LQ] = "LQ"; g_blbl[B_LQ] = "Liq"; g_bvis[B_LQ] = InpShowWalls;
|
||||||
|
g_bkey[B_LT] = "LT"; g_blbl[B_LT] = "LiqTr"; g_bvis[B_LT] = InpShowLiqTrend;
|
||||||
|
g_bkey[B_EQ] = "EQ"; g_blbl[B_EQ] = "EqH/L"; g_bvis[B_EQ] = InpShowLiqZones;
|
||||||
|
g_bkey[B_CO] = "CO"; g_blbl[B_CO] = "Box"; g_bvis[B_CO] = InpShowConsol;
|
||||||
|
g_bkey[B_CN] = "CN"; g_blbl[B_CN] = "Kegel"; g_bvis[B_CN] = InpShowCone;
|
||||||
|
g_bkey[B_AR] = "AR"; g_blbl[B_AR] = "Pfeile"; g_bvis[B_AR] = InpShowArrows;
|
||||||
|
g_bkey[B_PT] = "PT"; g_blbl[B_PT] = "Muster"; g_bvis[B_PT] = InpShowMuster;
|
||||||
|
g_bkey[B_MS] = "MS"; g_blbl[B_MS] = "Meldung"; g_bvis[B_MS] = InpShowMeldungen;
|
||||||
|
g_bkey[B_PX] = "PX"; g_blbl[B_PX] = "Kurs"; g_bvis[B_PX] = InpShowPrice;
|
||||||
|
g_bkey[B_TR] = "TR"; g_blbl[B_TR] = "Trades"; g_bvis[B_TR] = InpShowTrades;
|
||||||
|
// Gemerkter Zustand hat Vorrang vor der Eingabe.
|
||||||
|
for(int i = 0; i < BTN_N; i++)
|
||||||
|
{
|
||||||
|
string gv = BtnGV(i);
|
||||||
|
if(GlobalVariableCheck(gv)) g_bvis[i] = (GlobalVariableGet(gv) > 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BtnPaint(int i)
|
||||||
|
{
|
||||||
|
string nm = BPFX + g_bkey[i];
|
||||||
|
ObjectSetInteger(0, nm, OBJPROP_BGCOLOR,
|
||||||
|
g_bvis[i] ? InpBtnAnFarbe : InpBtnAusFarbe);
|
||||||
|
ObjectSetString(0, nm, OBJPROP_TEXT,
|
||||||
|
(g_bvis[i] ? "* " : " ") + g_blbl[i]);
|
||||||
|
// ⚠ STATE bewusst immer FALSE: sonst bliebe der Knopf optisch
|
||||||
|
// "gedrueckt" haengen und wuerde gegen die Hintergrundfarbe arbeiten.
|
||||||
|
ObjectSetInteger(0, nm, OBJPROP_STATE, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BtnDraw()
|
||||||
|
{
|
||||||
|
if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; }
|
||||||
|
int h = MathMax(10, InpBtnHoehe);
|
||||||
|
for(int i = 0; i < BTN_N; i++)
|
||||||
|
{
|
||||||
|
string nm = BPFX + g_bkey[i];
|
||||||
|
if(ObjectFind(0, nm) < 0)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
// 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));
|
||||||
|
BtnPaint(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//| Klick auf eine Schaltflaeche → Gruppe umschalten.
|
||||||
|
//| ⚠⚠ `g_last` MUSS zurueckgesetzt werden: `Redraw()` steigt sonst bei
|
||||||
|
//| unveraendertem Dateiinhalt sofort wieder aus, und das Umschalten
|
||||||
|
//| wuerde erst beim naechsten Datei-Update sichtbar (bis zu Sekunden
|
||||||
|
//| spaeter — es saehe aus, als reagiere der Knopf nicht).
|
||||||
|
void OnChartEvent(const int id, const long &lparam,
|
||||||
|
const double &dparam, const string &sparam)
|
||||||
|
{
|
||||||
|
if(id != CHARTEVENT_OBJECT_CLICK) return;
|
||||||
|
if(StringFind(sparam, BPFX) != 0) return;
|
||||||
|
for(int i = 0; i < BTN_N; i++)
|
||||||
|
{
|
||||||
|
if(sparam != BPFX + g_bkey[i]) continue;
|
||||||
|
g_bvis[i] = !g_bvis[i];
|
||||||
|
GlobalVariableSet(BtnGV(i), g_bvis[i] ? 1.0 : 0.0);
|
||||||
|
BtnPaint(i);
|
||||||
|
g_last = "\x01"; // vollen Neuaufbau erzwingen
|
||||||
|
Redraw(); DrawRange(); RepositionLabels();
|
||||||
|
ChartRedraw();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
// Kegel: Verkettung der Horizonte (30->60->120). Die CSV liefert sie aufsteigend;
|
// Kegel: Verkettung der Horizonte (30->60->120). Die CSV liefert sie aufsteigend;
|
||||||
// jeder Abschnitt startet dort, wo der vorherige endete -> ein sich oeffnender
|
// jeder Abschnitt startet dort, wo der vorherige endete -> ein sich oeffnender
|
||||||
// Faecher statt drei unverbundener Geraden. Wird je Redraw zurueckgesetzt.
|
// Faecher statt drei unverbundener Geraden. Wird je Redraw zurueckgesetzt.
|
||||||
@@ -314,9 +454,11 @@ int LabelH(const string font, const int size)
|
|||||||
int OnInit()
|
int OnInit()
|
||||||
{
|
{
|
||||||
if(InpApplyTheme) ApplyTheme();
|
if(InpApplyTheme) ApplyTheme();
|
||||||
|
BtnInit();
|
||||||
EventSetTimer(MathMax(1, InpRefreshS));
|
EventSetTimer(MathMax(1, InpRefreshS));
|
||||||
Redraw();
|
Redraw();
|
||||||
DrawRange();
|
DrawRange();
|
||||||
|
BtnDraw();
|
||||||
return(INIT_SUCCEEDED);
|
return(INIT_SUCCEEDED);
|
||||||
}
|
}
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
@@ -433,10 +575,13 @@ void OnDeinit(const int reason)
|
|||||||
EventKillTimer();
|
EventKillTimer();
|
||||||
ObjectsDeleteAll(0, PFX);
|
ObjectsDeleteAll(0, PFX);
|
||||||
ObjectsDeleteAll(0, RPFX);
|
ObjectsDeleteAll(0, RPFX);
|
||||||
|
ObjectsDeleteAll(0, BPFX);
|
||||||
ChartRedraw();
|
ChartRedraw();
|
||||||
}
|
}
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
void OnTimer() { Redraw(); DrawRange(); RepositionLabels(); }
|
// ⚠ `BtnDraw()` auch im Timer: das Chart-Fenster kann seine Groesse aendern,
|
||||||
|
// und ein Nutzer kann ein Objekt von Hand loeschen — dann baut es sich neu auf.
|
||||||
|
void OnTimer() { Redraw(); DrawRange(); RepositionLabels(); BtnDraw(); }
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
//| Zeitpunkt der horizontalen Chart-Mitte (sichtbarer Bereich) |
|
//| Zeitpunkt der horizontalen Chart-Mitte (sichtbarer Bereich) |
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
@@ -619,6 +764,9 @@ void Redraw()
|
|||||||
// Horizontale S/R-Linien + sichtbares Text-Label an der Linie
|
// Horizontale S/R-Linien + sichtbares Text-Label an der Linie
|
||||||
if(typ == "R" || typ == "S")
|
if(typ == "R" || typ == "S")
|
||||||
{
|
{
|
||||||
|
// ⚠ Neu 2026-08-21: die S/R-Linien waren als einzige Gruppe nicht
|
||||||
|
// abschaltbar. Der Knopf ist die einzige Quelle dafuer.
|
||||||
|
if(!Vis(B_SR)) continue;
|
||||||
double price = StringToDouble(p[1]);
|
double price = StringToDouble(p[1]);
|
||||||
if(price <= 0) continue;
|
if(price <= 0) continue;
|
||||||
// Feld 3 (optional) = P(Durchbruch) in % aus dem kalibrierten Modell des
|
// Feld 3 (optional) = P(Durchbruch) in % aus dem kalibrierten Modell des
|
||||||
@@ -677,7 +825,7 @@ void Redraw()
|
|||||||
// nach rechts verlängert. Anker in Broker-Zeit (= Server-Zeit im Terminal).
|
// nach rechts verlängert. Anker in Broker-Zeit (= Server-Zeit im Terminal).
|
||||||
if(typ == "CH")
|
if(typ == "CH")
|
||||||
{
|
{
|
||||||
if(!InpShowChannel) continue;
|
if(!Vis(B_KA)) continue;
|
||||||
if(k < 6) continue;
|
if(k < 6) continue;
|
||||||
string kind = p[1];
|
string kind = p[1];
|
||||||
datetime t1 = (datetime)StringToInteger(p[2]);
|
datetime t1 = (datetime)StringToInteger(p[2]);
|
||||||
@@ -709,7 +857,7 @@ void Redraw()
|
|||||||
if(typ == "LQ")
|
if(typ == "LQ")
|
||||||
{
|
{
|
||||||
if(k < 3) continue;
|
if(k < 3) continue;
|
||||||
if(!InpShowWalls) continue;
|
if(!Vis(B_LQ)) continue;
|
||||||
string side = p[1];
|
string side = p[1];
|
||||||
double lpx = StringToDouble(p[2]);
|
double lpx = StringToDouble(p[2]);
|
||||||
double lsz = (k > 3) ? StringToDouble(p[3]) : 0.0;
|
double lsz = (k > 3) ? StringToDouble(p[3]) : 0.0;
|
||||||
@@ -760,7 +908,7 @@ void Redraw()
|
|||||||
if(typ == "EQ")
|
if(typ == "EQ")
|
||||||
{
|
{
|
||||||
if(k < 5) continue;
|
if(k < 5) continue;
|
||||||
if(!InpShowLiqZones) continue;
|
if(!Vis(B_EQ)) continue;
|
||||||
string zs = p[1];
|
string zs = p[1];
|
||||||
double zlo = StringToDouble(p[2]), zhi = StringToDouble(p[3]);
|
double zlo = StringToDouble(p[2]), zhi = StringToDouble(p[3]);
|
||||||
datetime zt = (datetime)StringToInteger(p[4]);
|
datetime zt = (datetime)StringToInteger(p[4]);
|
||||||
@@ -815,7 +963,7 @@ void Redraw()
|
|||||||
if(typ == "CO")
|
if(typ == "CO")
|
||||||
{
|
{
|
||||||
if(k < 3) continue;
|
if(k < 3) continue;
|
||||||
if(!InpShowConsol) continue;
|
if(!Vis(B_CO)) continue;
|
||||||
double clo = StringToDouble(p[1]), chi = StringToDouble(p[2]);
|
double clo = StringToDouble(p[1]), chi = StringToDouble(p[2]);
|
||||||
bool tight = (k > 3 && p[3] == "1");
|
bool tight = (k > 3 && p[3] == "1");
|
||||||
if(clo <= 0 || chi <= clo) continue;
|
if(clo <= 0 || chi <= clo) continue;
|
||||||
@@ -865,7 +1013,7 @@ void Redraw()
|
|||||||
if(typ == "CN")
|
if(typ == "CN")
|
||||||
{
|
{
|
||||||
if(k < 4) continue;
|
if(k < 4) continue;
|
||||||
if(!InpShowCone) continue;
|
if(!Vis(B_CN)) continue;
|
||||||
int mins = (int)StringToInteger(p[1]);
|
int mins = (int)StringToInteger(p[1]);
|
||||||
double clo = StringToDouble(p[2]);
|
double clo = StringToDouble(p[2]);
|
||||||
double chi = StringToDouble(p[3]);
|
double chi = StringToDouble(p[3]);
|
||||||
@@ -916,7 +1064,7 @@ void Redraw()
|
|||||||
if(typ == "AR")
|
if(typ == "AR")
|
||||||
{
|
{
|
||||||
if(k < 5) continue;
|
if(k < 5) continue;
|
||||||
if(!InpShowArrows) continue;
|
if(!Vis(B_AR)) continue;
|
||||||
string art = p[1];
|
string art = p[1];
|
||||||
if(art == "K" && !InpShowConsensus) continue; // Konsens-Pfeil optional
|
if(art == "K" && !InpShowConsensus) continue; // Konsens-Pfeil optional
|
||||||
double a_from = StringToDouble(p[2]);
|
double a_from = StringToDouble(p[2]);
|
||||||
@@ -966,7 +1114,7 @@ void Redraw()
|
|||||||
if(typ == "HL")
|
if(typ == "HL")
|
||||||
{
|
{
|
||||||
if(k < 6) continue;
|
if(k < 6) continue;
|
||||||
if(!InpShowHL) continue;
|
if(!InpShowHL || !Vis(B_PX)) continue;
|
||||||
double hlp = StringToDouble(p[1]);
|
double hlp = StringToDouble(p[1]);
|
||||||
if(hlp <= 0) continue;
|
if(hlp <= 0) continue;
|
||||||
int hage = (int)StringToInteger(p[2]);
|
int hage = (int)StringToInteger(p[2]);
|
||||||
@@ -1006,7 +1154,7 @@ void Redraw()
|
|||||||
// Kegel-Startpunkt IMMER merken - auch wenn das Kurs-Label aus ist
|
// Kegel-Startpunkt IMMER merken - auch wenn das Kurs-Label aus ist
|
||||||
// (sonst verliert der Faecher seinen Anker).
|
// (sonst verliert der Faecher seinen Anker).
|
||||||
g_conePx = pxv;
|
g_conePx = pxv;
|
||||||
if(!InpShowPrice) continue;
|
if(!Vis(B_PX)) continue;
|
||||||
string pn = PFX + "PRICE";
|
string pn = PFX + "PRICE";
|
||||||
if(ObjectFind(0, pn) < 0)
|
if(ObjectFind(0, pn) < 0)
|
||||||
{
|
{
|
||||||
@@ -1050,7 +1198,7 @@ void Redraw()
|
|||||||
// dem noch nichts gebrochen ist.
|
// dem noch nichts gebrochen ist.
|
||||||
if(typ == "PT")
|
if(typ == "PT")
|
||||||
{
|
{
|
||||||
if(!InpShowMuster || k < 6) continue;
|
if(!Vis(B_PT) || k < 6) continue;
|
||||||
// ⚠⚠ `_Period`, NICHT `PERIOD_CURRENT`. PERIOD_CURRENT ist der Wert 0 —
|
// ⚠⚠ `_Period`, NICHT `PERIOD_CURRENT`. PERIOD_CURRENT ist der Wert 0 —
|
||||||
// MT5-Funktionen wie iTime() deuten das als "dieser Chart", ein
|
// MT5-Funktionen wie iTime() deuten das als "dieser Chart", ein
|
||||||
// `switch` trifft damit aber KEINEN case und TFName() gab
|
// `switch` trifft damit aber KEINEN case und TFName() gab
|
||||||
@@ -1149,7 +1297,7 @@ void Redraw()
|
|||||||
}
|
}
|
||||||
if(typ == "RZ" || typ == "SZ")
|
if(typ == "RZ" || typ == "SZ")
|
||||||
{
|
{
|
||||||
if(!InpShowZonen || k < 3) continue;
|
if(!Vis(B_ZO) || k < 3) continue;
|
||||||
double zlo = StringToDouble(p[1]), zhi = StringToDouble(p[2]);
|
double zlo = StringToDouble(p[1]), zhi = StringToDouble(p[2]);
|
||||||
if(zlo <= 0 || zhi <= 0) continue;
|
if(zlo <= 0 || zhi <= 0) continue;
|
||||||
string zn = PFX + "ZONE_" + typ;
|
string zn = PFX + "ZONE_" + typ;
|
||||||
@@ -1190,7 +1338,7 @@ void Redraw()
|
|||||||
// stehen — genau der Fehler, den die HL-Pfeile schon einmal hatten).
|
// stehen — genau der Fehler, den die HL-Pfeile schon einmal hatten).
|
||||||
if(typ == "MS")
|
if(typ == "MS")
|
||||||
{
|
{
|
||||||
if(!InpShowMeldungen || k < 2) continue;
|
if(!Vis(B_MS) || k < 2) continue;
|
||||||
string mn = PFX + "MSG_" + IntegerToString(msg_idx);
|
string mn = PFX + "MSG_" + IntegerToString(msg_idx);
|
||||||
if(ObjectFind(0, mn) < 0)
|
if(ObjectFind(0, mn) < 0)
|
||||||
{
|
{
|
||||||
@@ -1242,7 +1390,7 @@ void Redraw()
|
|||||||
if(typ == "PL")
|
if(typ == "PL")
|
||||||
{
|
{
|
||||||
if(k < 2) continue;
|
if(k < 2) continue;
|
||||||
if(!InpShowPnL) continue;
|
if(!InpShowPnL || !Vis(B_PX)) continue;
|
||||||
double plv = StringToDouble(p[1]);
|
double plv = StringToDouble(p[1]);
|
||||||
string cur = (k > 2) ? p[2] : "";
|
string cur = (k > 2) ? p[2] : "";
|
||||||
string qn = PFX + "PNL";
|
string qn = PFX + "PNL";
|
||||||
@@ -1276,7 +1424,7 @@ void Redraw()
|
|||||||
if(typ == "TR")
|
if(typ == "TR")
|
||||||
{
|
{
|
||||||
if(k < 3) continue;
|
if(k < 3) continue;
|
||||||
if(!InpShowTrades) continue;
|
if(!Vis(B_TR)) continue;
|
||||||
string tkind = p[1];
|
string tkind = p[1];
|
||||||
datetime tts = (datetime)StringToInteger(p[2]);
|
datetime tts = (datetime)StringToInteger(p[2]);
|
||||||
if(tts <= 0) continue;
|
if(tts <= 0) continue;
|
||||||
@@ -1312,7 +1460,7 @@ void Redraw()
|
|||||||
if(typ == "LT")
|
if(typ == "LT")
|
||||||
{
|
{
|
||||||
if(k < 5) continue;
|
if(k < 5) continue;
|
||||||
if(!InpShowLiqTrend) continue;
|
if(!Vis(B_LT)) continue;
|
||||||
datetime t1 = (datetime)StringToInteger(p[1]);
|
datetime t1 = (datetime)StringToInteger(p[1]);
|
||||||
double q1 = StringToDouble(p[2]);
|
double q1 = StringToDouble(p[2]);
|
||||||
datetime t2 = (datetime)StringToInteger(p[3]);
|
datetime t2 = (datetime)StringToInteger(p[3]);
|
||||||
|
|||||||
Reference in New Issue
Block a user