diff --git a/CLAUDE.md b/CLAUDE.md index bf0e99b..c49e65b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4328,7 +4328,7 @@ Trader wäre sie nie abgelaufen. Latte unverändert: Verhältnis < 1,0 ODER PF < („⚠ die Welle (steuert die Order) schweigt"). Live gegengerechnet, beide Zeilen erscheinen wie beabsichtigt. ⚠ Reine Anzeige — an Gewichten, Gates und Order-Logik ist nichts geändert. -- Asset-Version aktuell **v=169** (in `web/index.html` hochzählen, siehe Workflows). +- Asset-Version aktuell **v=182** (in `web/index.html` hochzählen, siehe Workflows). - **✅ SCHRIFT SKALIERT MIT DEM FENSTER (2026-08-13, v=167).** User: „die Größe der Schriftarten im Dashboard auf em einstellen, damit auf jedem Gerät oder je nach Fenstergröße die Schriftgröße automatisch angepasst wird." @@ -8586,3 +8586,67 @@ besser) · Teil-Exit bei 1:1 (`_PARTIAL_TP_FRAC=0`, User-Vorgabe). weg (kurz); M1 ist die Master-Auflösung → aus M1 jede höhere TF exakt aggregierbar. ⚠ Ticks/Echtzeit bewusst NICHT geloggt (~85k/Tag = 30M/Jahr, kein Bedarf — Strategien sind M5+, Slippage aus echten Fills gemessen). ~370k Bars/Jahr = vernachlässigbar. + +## ✅ EINSATZ JE AUTONOMEM PFAD + MELDUNGS-ABSTAND IM CHART (2026-08-19, v=182 / MQL5 v1.44) + +**(1) Eingabefeld `Einsatz je Pfad` in der Breakout-Karte** (User-Wunsch +"Margin Verhaeltnis von M15 / BRK manuell setzen"). Zwei Zahlenfelder +`BRK / M15`, **0 = globaler Wert** (`margin_buffer_pct`, live 40). +`POST /api/automargin {brk, m15}` · `engine.set_auto_margin` · Snapshot +`margin_brk`/`margin_m15` · neustart-fest. + +⚠⚠ **ES IST KEINE GLEICHZEITIGE RESERVIERUNG — das war der Wunsch, aber es +geht heute nicht.** Der Bot haelt **EINE** Position (`_check_auto_squeeze` +feuert "nur FLAT"), und Trailing, Notfall-Stop, S/R-Close, Time-Stop und +Circuit-Breaker verwalten je EINE Position — **42 Einzel-Positions-Annahmen in +`engine.py`, 25 in `trader.py`**. Bei zwei Positionen auf demselben Symbol +haengt der GESAMTE Schutz-Stack an einer davon, die andere liefe ungeschuetzt. +**Das ist ein Sicherheits-, kein Aufwandsargument.** Das Feld steuert die +**GROESSE** der jeweiligen Position, wenn dieser Pfad eroeffnet. +⚠ **Manuelle Trades bleiben beim globalen Wert** — Absicht: der Mensch ist die +gemessen bessere Population (+1,56 gegen −4,71 EUR/Lot). +Umsetzung quellen-abhaengig wie die SL-Zeitebene seit 05.08.: `_open()` setzt +`config.MARGIN_BUFFER` fuer die Dauer des einen Aufrufs, `finally` stellt ihn +zurueck. ⚠ Direkt gesetzt statt ueber `set_margin_buffer()` — das loggt je +Trade eine Zeile und wuerde den globalen Wert dauerhaft ueberschreiben. +✅ Ende-zu-Ende: 50/25 gesetzt → Snapshot → persistiert · 150 abgelehnt · 0/0 +zurueck · `deploy.py --feld margin_brk`, alle 5 Schritte. + +⚠⚠ **ZWEI ECHTE FEHLER VOM LINTER GEFANGEN, die `py_compile` durchwinkte:** +`config` war in `engine.py` **gar nicht importiert** (nur Einzelnamen via +`from core.config import ...`), und in `server.py` hiess die Engine `eng` statt +`app.state.engine`. Beide sassen in Pfaden, die erst beim **ERSTEN autonomen +Trade** bzw. beim ersten Klick gefeuert haetten — genau die Klasse, fuer die +`ruff F821` am 07.08. eingebaut wurde. **Zweiter echter Fang seit dem Einbau.** + +**(2) MQL5 v1.44 — Meldungs-Zeilenabstand MESSEN statt schaetzen.** +User: "die zeilenabstaende sind immer noch zu gering" (nach v1.43). Zwei +Ursachen: **(a)** `OBJPROP_FONTSIZE` wurde **nur beim Erzeugen** gesetzt — ein +bestehendes Label behaelt seine Groesse, die Erhoehung 10→11 pt kam auf dem +Chart nie an (gleiche Klasse wie die X-Position, die genau deshalb schon jeden +Redraw neu gesetzt wird). **(b)** Der Abstand wurde aus der **Punkt**groesse +hochgerechnet (Faktor 2,0, dann 2,6) — Punkt→Pixel haengt an der DPI-Skalierung +und ist vom Quelltext aus **nicht bekannt**. Jetzt `TextGetSize` (+8 px Luft), +Fallback 2,6. ⚠ `TextSetFont` mit **negativer** Groesse = 1/10 pt, nur diese +Form wird DPI-korrekt skaliert. +⚠⚠ **Und ein eigener Fehler der bekannten Klasse:** der erste v1.44-Compile +**schlug fehl** (`error 246: TextGetSize verlangt uint&`) 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). Exakt der dokumentierte Fall *"eine +Erfolgsmeldung muss den Zustand NACH der Aktion pruefen, nicht den davor"*. +Aufgefallen nur durch die `.ex5`-Zeitstempelpruefung danebenan. +**➤ Regel: je Compile einen EIGENEN Logpfad, und auf `Result: N errors` PLUS +`.ex5`-Alter pruefen — nie auf den Default-Log des Terminals.** + +⚠⚠ **ZWEI COMMIT-FALLEN, beide neu und beide dokumentierenswert:** +**(a)** **Backticks in einer Bash-Commit-Nachricht** werden als +Kommando-Substitution ausgefuehrt — alle eingeklammerten Namen verschwanden +aus dem Text (`_check_auto_squeeze` → leer). **(b)** Ein **Bash-Pfad** +(`/c/Users/...`) an Python uebergeben schlaegt fehl, und +`git commit --amend -F ` nahm daraufhin eine **STALE +`COMMIT_EDITMSG`** — also die Nachricht eines **fremden** Commits. +✅ Der Code war nie betroffen (Arbeitsbaum sauber, Remote synchron), nur die +Beschriftung. **➤ Commit-Nachrichten mit Backticks oder deutschen Quotes ueber +eine DATEI (`-F`) schreiben, und die Datei vorher auf `-s` pruefen** — dieselbe +Familie wie die dokumentierte Heredoc-Regel.