Bestaetigtes Chartmuster je Zeitebene ins MT5-Chart (Indikator v1.45)
User-Wunsch: das bestaetigte Muster in das jeweils passende Chart einzeichnen. CSV: neue Zeile `PT;<TF>;<name>;<dir>;<trigger>;<ziel>` je Zeitebene. INDIKATOR: zeichnet NUR die Zeile, deren <TF> zu SEINEM Chart passt (`TFName(PERIOD_CURRENT)`). Ohne diesen Filter laegen alle Zeitebenen uebereinander im selben Fenster und keine waere lesbar - so bekommt jedes Chartfenster (M1/M5/M15/M30/H1) sein eigenes Muster. Gezeichnet werden zwei waagerechte Linien: Trigger (Nackenlinie, durchgezogen, Breite 2) und Ziel (gestrichelt), gruen bei bullisch, rot bei baerisch, dazu ein Label an der Triggerlinie. ⚠⚠ NUR `confirmed`. "Bildet sich" ist genau der Zustand, in dem noch nichts gebrochen ist - ihn zu zeichnen waere eine Vorhersage. Live gegengeprueft: M30 "Tasse+Henkel" und H1 "Aufsteigendes Dreieck" stehen auf confirmed und sind in der CSV; der M5-"Steigende Keil" ist nur forming und wird korrekt NICHT exportiert. ⚠⚠ EHRLICHKEIT IM LABEL: die Muster-Klasse ist als SIGNAL gemessen und VERWORFEN - die Ziel-Trefferquote liegt bei nur 13-38 % (backtest_patterns.py). Deshalb steht "(trifft 13-38 %)" im Chart-Label. Eine gezeichnete Ziellinie ohne diesen Zusatz liest sich wie eine Prognose, und genau das ist sie nicht. Kein Verdict-Gewicht, kein Trade-Trigger. ⚠ Nur ZUSAMMENGESETZT aus `patterns_tf`, das der Snapshot ohnehin baut - kein zweiter Rechenweg (der Konsens-Pfeil-Fehler). ⚠ Der dokumentierte Fallstrick beachtet: kompiliert wurde ins RICHTIGE Terminal (D0E8209F..., das einzige mit sr_levels.csv), mit EIGENEM Logpfad, und geprueft wurde auf "Result: 0 errors, 0 warnings" PLUS frischen .ex5-Zeitstempel - nicht auf den Default-Log. Der erste Versuch lief ins Leere, weil der Editor-Pfad falsch war (Pepperstone-Ordner existiert nicht, es ist "MetaTrader 5"); das leere Log und die unveraenderte .ex5 haben es verraten. Quelle ins Repo gespiegelt (mql5/SR_Levels.mq5), Backup daneben. Abschaltbar: InpShowMuster=false; Farben ueber InpMusterBullColor/-BearColor. Pipeline A-G gruen, 97 Tests, deployt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
db0de81ef6
commit
263ec9f9a5
@@ -3601,6 +3601,33 @@ class TradingEngine:
|
|||||||
lines.append(f"{_tag};{round(_lo2, 3)};{round(_hi2, 3)}")
|
lines.append(f"{_tag};{round(_lo2, 3)};{round(_hi2, 3)}")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# ── BESTAETIGTES CHARTMUSTER je Zeitebene (User-Wunsch 2026-08-21)
|
||||||
|
# PT;<TF>;<name>;<dir>;<trigger>;<ziel>
|
||||||
|
# Der Indikator zeichnet NUR die Zeile, deren <TF> zu SEINEM Chart
|
||||||
|
# passt — so bekommt jedes Fenster (M1/M5/M15/H1) sein eigenes
|
||||||
|
# Muster, ohne dass fuenf Linien uebereinander liegen.
|
||||||
|
# ⚠⚠ NUR `confirmed`. "Bildet sich" ist genau der Zustand, in dem noch
|
||||||
|
# nichts gebrochen ist; ihn zu zeichnen waere eine Vorhersage.
|
||||||
|
# ⚠⚠ EHRLICHKEIT IM LABEL: die Muster-Klasse ist als SIGNAL gemessen
|
||||||
|
# und VERWORFEN — die Ziel-Trefferquote liegt bei nur 13-38 %
|
||||||
|
# (`backtest_patterns.py`). Deshalb steht die Zahl im Chart mit
|
||||||
|
# dran. Eine gezeichnete Ziellinie ohne diesen Hinweis liest sich
|
||||||
|
# wie eine Prognose, und genau das ist sie nicht.
|
||||||
|
# ⚠ Nur zusammengesetzt aus `patterns_tf`, das der Snapshot ohnehin
|
||||||
|
# baut — kein zweiter Rechenweg (der Konsens-Pfeil-Fehler).
|
||||||
|
try:
|
||||||
|
for _tf, _m in (self._patterns_tf() or {}).items():
|
||||||
|
if not _m or _m.get("status") != "confirmed":
|
||||||
|
continue
|
||||||
|
_trg, _zl = _m.get("trigger"), _m.get("target")
|
||||||
|
if not _trg or not _zl:
|
||||||
|
continue
|
||||||
|
_nm = str(_m.get("name") or "").replace(";", ",")[:28]
|
||||||
|
lines.append(f"PT;{_tf};{_nm};{_m.get('dir') or ''};"
|
||||||
|
f"{float(_trg):.3f};{float(_zl):.3f}")
|
||||||
|
except Exception as _pe:
|
||||||
|
log.debug(f"PT-Export: {_pe}")
|
||||||
|
|
||||||
# ── MELDUNGEN oben links (MS;<text>) — User-Wunsch 2026-08-17 ────
|
# ── MELDUNGEN oben links (MS;<text>) — User-Wunsch 2026-08-17 ────
|
||||||
# Dieselben Zeilen wie die Dashboard-Karte „Meldungen" (`#card-pos`).
|
# Dieselben Zeilen wie die Dashboard-Karte „Meldungen" (`#card-pos`).
|
||||||
# ⚠⚠ NUR ZUSAMMENSETZEN, NICHT NEU RECHNEN. Der Konsens-Pfeil hat im
|
# ⚠⚠ NUR ZUSAMMENSETZEN, NICHT NEU RECHNEN. Der Konsens-Pfeil hat im
|
||||||
|
|||||||
+82
-1
@@ -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.44"
|
#property version "1.45"
|
||||||
// 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
|
||||||
@@ -271,6 +271,12 @@ input bool InpShowZonen = true; // S/R als ZONE (Band) zeichnen
|
|||||||
input color InpZoneResColor = C'60,25,30'; // Widerstands-Zone (dunkelrot)
|
input color InpZoneResColor = C'60,25,30'; // Widerstands-Zone (dunkelrot)
|
||||||
input color InpZoneSupColor = C'20,45,35'; // Support-Zone (dunkelgruen)
|
input color InpZoneSupColor = C'20,45,35'; // Support-Zone (dunkelgruen)
|
||||||
|
|
||||||
|
// Bestaetigtes Chartmuster je Zeitebene (User-Wunsch 2026-08-21).
|
||||||
|
// ⚠ Gezeichnet wird NUR das Muster, dessen Zeitebene zum EIGENEN Chart passt.
|
||||||
|
input bool InpShowMuster = true; // bestaetigtes Chartmuster zeichnen
|
||||||
|
input color InpMusterBullColor = C'70,180,100';// bullisch
|
||||||
|
input color InpMusterBearColor = C'220,90,80'; // baerisch
|
||||||
|
|
||||||
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)
|
||||||
@@ -317,6 +323,25 @@ int OnInit()
|
|||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
//| Farbe mit dem Chart-Hintergrund mischen — simuliert TRANSPARENZ. |
|
//| Farbe mit dem Chart-Hintergrund mischen — simuliert TRANSPARENZ. |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Zeitebene dieses Charts als Text ("M1","M5","M15","M30","H1" ...) |
|
||||||
|
//| ⚠ Muss zu den Schluesseln passen, die der Bot in `PT;` schreibt |
|
||||||
|
//| (`engine.patterns_tf`). Weicht die Schreibweise ab, wird still |
|
||||||
|
//| NICHTS gezeichnet — deshalb die Fallback-Zeile am Ende. |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
string TFName(ENUM_TIMEFRAMES tf)
|
||||||
|
{
|
||||||
|
switch(tf)
|
||||||
|
{
|
||||||
|
case PERIOD_M1: return "M1";
|
||||||
|
case PERIOD_M5: return "M5";
|
||||||
|
case PERIOD_M15: return "M15";
|
||||||
|
case PERIOD_M30: return "M30";
|
||||||
|
case PERIOD_H1: return "H1";
|
||||||
|
}
|
||||||
|
return EnumToString(tf);
|
||||||
|
}
|
||||||
|
|
||||||
//| ⚠ MT5 kann bei OBJ_RECTANGLE KEIN echtes Alpha (nur Canvas- |
|
//| ⚠ MT5 kann bei OBJ_RECTANGLE KEIN echtes Alpha (nur Canvas- |
|
||||||
//| Objekte könnten das). Da der Hintergrund bekannt und einfarbig |
|
//| Objekte könnten das). Da der Hintergrund bekannt und einfarbig |
|
||||||
//| ist, sieht die Mischung exakt aus wie eine transparente Füllung. |
|
//| ist, sieht die Mischung exakt aus wie eine transparente Füllung. |
|
||||||
@@ -981,6 +1006,62 @@ void Redraw()
|
|||||||
// Linie; die BREITE ist die echte Spanne der Pivots, die den Cluster
|
// Linie; die BREITE ist die echte Spanne der Pivots, die den Cluster
|
||||||
// gebildet haben (nicht Fibonacci — das ist im Projekt gemessen und
|
// gebildet haben (nicht Fibonacci — das ist im Projekt gemessen und
|
||||||
// verworfen). Nach rechts verlaengert, damit es wie im Vorbild wirkt.
|
// verworfen). Nach rechts verlaengert, damit es wie im Vorbild wirkt.
|
||||||
|
// BESTAETIGTES CHARTMUSTER je Zeitebene (PT;<TF>;<name>;<dir>;<trigger>;<ziel>)
|
||||||
|
// — User-Wunsch 2026-08-21.
|
||||||
|
// ⚠⚠ Es wird NUR die Zeile gezeichnet, deren <TF> zum EIGENEN Chart passt.
|
||||||
|
// Der Bot liefert alle Zeitebenen in derselben CSV; ohne diesen Filter
|
||||||
|
// laegen fuenf Musterpaare uebereinander und keines waere lesbar.
|
||||||
|
// So bekommt jedes Chartfenster (M1/M5/M15/H1) sein eigenes Muster.
|
||||||
|
// ⚠⚠ EHRLICHKEIT: die Ziel-Trefferquote dieser Muster-Klasse liegt gemessen
|
||||||
|
// bei nur 13-38 % (backtest_patterns.py). Sie steht im Label, weil eine
|
||||||
|
// gezeichnete Ziellinie sonst wie eine Prognose aussieht — und genau das
|
||||||
|
// ist sie nicht.
|
||||||
|
// ⚠ Nur `confirmed` kommt ueberhaupt an; "bildet sich" waere der Zustand, in
|
||||||
|
// dem noch nichts gebrochen ist.
|
||||||
|
if(typ == "PT")
|
||||||
|
{
|
||||||
|
if(!InpShowMuster || k < 6) continue;
|
||||||
|
if(p[1] != TFName(PERIOD_CURRENT)) continue; // fremde Zeitebene
|
||||||
|
double trg = StringToDouble(p[4]), zl = StringToDouble(p[5]);
|
||||||
|
if(trg <= 0 || zl <= 0) continue;
|
||||||
|
bool bull = (p[3] == "bull");
|
||||||
|
color pc = bull ? InpMusterBullColor : InpMusterBearColor;
|
||||||
|
datetime pt0 = iTime(_Symbol, PERIOD_CURRENT,
|
||||||
|
MathMin(80, Bars(_Symbol, PERIOD_CURRENT) - 1));
|
||||||
|
string ln1 = PFX + "MUST_TRG", ln2 = PFX + "MUST_ZIEL";
|
||||||
|
if(ObjectFind(0, ln1) < 0)
|
||||||
|
{
|
||||||
|
ObjectCreate(0, ln1, OBJ_TREND, 0, pt0, trg, RightTime(), trg);
|
||||||
|
ObjectSetInteger(0, ln1, OBJPROP_RAY_RIGHT, false);
|
||||||
|
ObjectSetInteger(0, ln1, OBJPROP_WIDTH, 2);
|
||||||
|
ObjectSetInteger(0, ln1, OBJPROP_SELECTABLE, false);
|
||||||
|
}
|
||||||
|
if(ObjectFind(0, ln2) < 0)
|
||||||
|
{
|
||||||
|
ObjectCreate(0, ln2, OBJ_TREND, 0, pt0, zl, RightTime(), zl);
|
||||||
|
ObjectSetInteger(0, ln2, OBJPROP_RAY_RIGHT, false);
|
||||||
|
ObjectSetInteger(0, ln2, OBJPROP_STYLE, STYLE_DOT);
|
||||||
|
ObjectSetInteger(0, ln2, OBJPROP_SELECTABLE, false);
|
||||||
|
}
|
||||||
|
ObjectSetInteger(0, ln1, OBJPROP_COLOR, pc);
|
||||||
|
ObjectMove(0, ln1, 0, pt0, trg); ObjectMove(0, ln1, 1, RightTime(), trg);
|
||||||
|
ObjectSetInteger(0, ln2, OBJPROP_COLOR, pc);
|
||||||
|
ObjectMove(0, ln2, 0, pt0, zl); ObjectMove(0, ln2, 1, RightTime(), zl);
|
||||||
|
string plb = PFX + "MUST_LBL";
|
||||||
|
if(ObjectFind(0, plb) < 0)
|
||||||
|
{
|
||||||
|
ObjectCreate(0, plb, OBJ_TEXT, 0, RightTime(), trg);
|
||||||
|
ObjectSetInteger(0, plb, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER);
|
||||||
|
ObjectSetInteger(0, plb, OBJPROP_FONTSIZE, InpLabelSize);
|
||||||
|
ObjectSetInteger(0, plb, OBJPROP_SELECTABLE, false);
|
||||||
|
}
|
||||||
|
ObjectSetString(0, plb, OBJPROP_TEXT,
|
||||||
|
(bull ? "^ " : "v ") + p[2] + " bestaetigt - Ziel "
|
||||||
|
+ DoubleToString(zl, (int)_Digits) + " (trifft 13-38 %)");
|
||||||
|
ObjectSetInteger(0, plb, OBJPROP_COLOR, pc);
|
||||||
|
ObjectMove(0, plb, 0, RightTime(), trg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if(typ == "RZ" || typ == "SZ")
|
if(typ == "RZ" || typ == "SZ")
|
||||||
{
|
{
|
||||||
if(!InpShowZonen || k < 3) continue;
|
if(!InpShowZonen || k < 3) continue;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user