MT5-Chart: echte Liquiditaets-Waende statt Chartmuster-Linien (Indikator v1.12)

User-Wunsch: "zeichne mir die liquiditaetslinien in den mt5 ein. entferne die
chartmuster linien aus dem mt5".

- core/hl_walls.py: holt GET /api/walls vom HL-Dashboard (groesstes L2-Level je
  Seite, basis-korrigiert auf CFD-Niveau). Fail-safe: HL aus -> keine Linien, kein
  Fehler; Cache 10s, Daten >60s alt werden verworfen, Log nur 1x.
- engine._write_levels_file: PT-Zeilen raus, LQ;<B|A>;preis;size rein.
- SR_Levels.mq5 v1.12: PT-Handler entfernt, LQ-Handler (dick gestrichelt +
  Groessen-Label), InpShowWalls/InpWallBidColor/InpWallAskColor. Kompiliert.
- config: export_hl_walls=true, hl_walls_url.

Zwei Fallen dokumentiert: (1) Basis-Differenz HL vs CFD ~0,45$ -- ungerechnet laegen
die Linien falsch. (2) 127.0.0.1 statt localhost (IPv6 -> 2066ms statt 19-46ms, lief
in den 2s-Timeout).

Verifiziert: LQ-Zeilen erscheinen in sr_levels.csv (B 83.619/3120, A 83.665/1721),
plausibel zwischen R 83.721 und S 83.516.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-30 15:16:19 +02:00
co-authored by Claude Opus 4.8
parent 29f53c45c1
commit 7f2285ddb3
5 changed files with 176 additions and 65 deletions
+44 -50
View File
@@ -12,9 +12,13 @@
//| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). |
//+------------------------------------------------------------------+
#property copyright "Oil Trading Bot"
#property version "1.11"
// v1.11: zeichnet zusätzlich erkannte Chartmuster (PT;… aus der CSV) — Trigger-/
// Nackenlinie (rot/grün) + gepunktete Ziel-Linie + Label. Reine Anzeige.
#property version "1.12"
// v1.12 (2026-07-30): Chartmuster-Linien (PT;…) ENTFERNT (User-Wunsch, Chart war zu
// voll — Kachel/PWA-Anzeige bleibt). NEU: ECHTE Liquiditäts-Wände (LQ;…) aus
// dem Hyperliquid-L2-Orderbuch, basis-korrigiert auf CFD-Niveau — die einzigen
// Linien im Chart, die nicht aus Pivots geschätzt sind, sondern tatsächlich
// ruhende Orders zeigen (dick gestrichelt + Größen-Label). Reine Anzeige.
// v1.11: Chartmuster-Linien (jetzt entfernt).
// ⚠ nach dem Update den Indikator NEU mit F7 kompilieren.
#property indicator_chart_window
#property indicator_plots 0
@@ -29,6 +33,9 @@ input color InpRangeColor = clrGoldenrod; // Range-Farbe
input bool InpRangeFill = false; // Range füllen (aus = nur Umriss)
input bool InpShowChannel = true; // Regressionskanal (M30) zeichnen
input color InpChanColor = clrYellow; // Kanal-Farbe
input bool InpShowWalls = true; // echte Liquiditäts-Wände (Hyperliquid-Orderbuch)
input color InpWallBidColor = clrMediumSpringGreen; // Nachfrage-Wand (Bid, Käufer)
input color InpWallAskColor = clrOrangeRed; // Angebots-Wand (Ask, Verkäufer)
const string PFX = "SRB_"; // Präfix S/R-Linien (aus Datei)
const string RPFX = "SRR_"; // Präfix dynamische Range (aus Chart)
@@ -244,63 +251,50 @@ void Redraw()
}
continue;
}
// Chartmuster: PT;name;dir;trigger;target;status → kräftige Trigger-/Nacken-
// linie (rot=bear/grün=bull/grau=neutral) + gepunktete Ziel-Linie + Labels.
// REINE ANZEIGE (im Bot als Signal noch unbelegt).
if(typ == "PT")
// ECHTE Liquiditäts-Wände: LQ;<B|A>;preis;size (B = Nachfrage/Bid-Wand,
// A = Angebot/Ask-Wand). Quelle = Hyperliquid-L2-Orderbuch, größtes Level je
// Seite, im Bot BASIS-KORRIGIERT auf CFD-Niveau (HL notiert ~0,45 $ tiefer).
// ⚠ Das ist die EINZIGE Linie im Chart, die nicht aus Pivots geschätzt ist,
// sondern tatsächlich ruhende Orders zeigt. Dick + gestrichelt, damit sie sich
// klar von den dünnen S/R-Linien abhebt. REINE ANZEIGE (kein Signal).
// (Chartmuster-Linien „PT;…" wurden 2026-07-30 auf User-Wunsch entfernt.)
if(typ == "LQ")
{
if(k < 4) continue;
string pname = p[1];
string pdir = p[2];
double ptrig = StringToDouble(p[3]);
double ptgt = (k > 4 && StringLen(p[4]) > 0) ? StringToDouble(p[4]) : 0.0;
if(ptrig <= 0) continue;
color pcol = (pdir == "bull" ? clrLime : (pdir == "bear" ? clrRed : clrSilver));
// Trigger-/Nackenlinie (WIDTH 2 → hebt sich von den dünnen S/R-Linien ab)
string nm = PFX + "PT_" + IntegerToString(idx);
if(ObjectCreate(0, nm, OBJ_HLINE, 0, 0, ptrig))
if(k < 3) continue;
if(!InpShowWalls) continue;
string side = p[1];
double lpx = StringToDouble(p[2]);
double lsz = (k > 3) ? StringToDouble(p[3]) : 0.0;
if(lpx <= 0) continue;
bool isBid = (side == "B");
color lcol = isBid ? InpWallBidColor : InpWallAskColor;
string nm = PFX + "LQ_" + side;
if(ObjectCreate(0, nm, OBJ_HLINE, 0, 0, lpx))
{
ObjectSetInteger(0, nm, OBJPROP_COLOR, pcol);
ObjectSetInteger(0, nm, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, nm, OBJPROP_COLOR, lcol);
ObjectSetInteger(0, nm, OBJPROP_STYLE, STYLE_DASH);
ObjectSetInteger(0, nm, OBJPROP_WIDTH, 2);
ObjectSetInteger(0, nm, OBJPROP_BACK, true);
ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false);
}
string lbl = (ptgt > 0)
? pname + " -> Ziel " + DoubleToString(ptgt, (int)_Digits)
: pname + " (Trigger " + DoubleToString(ptrig, (int)_Digits) + ")";
string tn = PFX + "TPT_" + IntegerToString(idx);
if(ObjectCreate(0, tn, OBJ_TEXT, 0, CenterTime(), ptrig))
else
ObjectMove(0, nm, 0, 0, lpx);
string llbl = (isBid ? "Liquidität NACHFRAGE " : "Liquidität ANGEBOT ")
+ DoubleToString(lsz, 0);
string ltn = PFX + "TLQ_" + side;
if(ObjectCreate(0, ltn, OBJ_TEXT, 0, CenterTime(), lpx))
{
ObjectSetString (0, tn, OBJPROP_TEXT, lbl);
ObjectSetInteger(0, tn, OBJPROP_COLOR, pcol);
ObjectSetInteger(0, tn, OBJPROP_FONTSIZE, 9);
ObjectSetInteger(0, tn, OBJPROP_ANCHOR, ANCHOR_LOWER);
ObjectSetInteger(0, tn, OBJPROP_SELECTABLE, false);
ObjectSetString (0, ltn, OBJPROP_TEXT, llbl);
ObjectSetInteger(0, ltn, OBJPROP_COLOR, lcol);
ObjectSetInteger(0, ltn, OBJPROP_FONTSIZE, 9);
ObjectSetInteger(0, ltn, OBJPROP_ANCHOR, ANCHOR_LOWER);
ObjectSetInteger(0, ltn, OBJPROP_SELECTABLE, false);
}
// Ziel-Linie (gepunktet) + Label, falls Ziel bekannt
if(ptgt > 0)
else
{
string tg = PFX + "PTG_" + IntegerToString(idx);
if(ObjectCreate(0, tg, OBJ_HLINE, 0, 0, ptgt))
{
ObjectSetInteger(0, tg, OBJPROP_COLOR, pcol);
ObjectSetInteger(0, tg, OBJPROP_STYLE, STYLE_DOT);
ObjectSetInteger(0, tg, OBJPROP_WIDTH, 1);
ObjectSetInteger(0, tg, OBJPROP_BACK, true);
ObjectSetInteger(0, tg, OBJPROP_SELECTABLE, false);
}
string tgn = PFX + "TPTG_" + IntegerToString(idx);
if(ObjectCreate(0, tgn, OBJ_TEXT, 0, CenterTime(), ptgt))
{
ObjectSetString (0, tgn, OBJPROP_TEXT, "Ziel " + pname);
ObjectSetInteger(0, tgn, OBJPROP_COLOR, pcol);
ObjectSetInteger(0, tgn, OBJPROP_FONTSIZE, 8);
ObjectSetInteger(0, tgn, OBJPROP_ANCHOR, ANCHOR_LOWER);
ObjectSetInteger(0, tgn, OBJPROP_SELECTABLE, false);
}
ObjectMove(0, ltn, 0, CenterTime(), lpx);
ObjectSetString(0, ltn, OBJPROP_TEXT, llbl);
}
idx++;
continue;
}
// ("Z;"-Zonen-Zeilen schreibt der Bot nicht mehr — die dynamische Handels-