Sieben Verbesserungen umgesetzt: Breaker scharf, B5 entschieden, 5 Werkzeuge

1) CIRCUIT-BREAKER SCHARF -- daily_loss_limit_pct 0 -> 8. Live verifiziert:
   enabled=True, limit_eur 89,44. Steht nicht in runtime_state.json, die ini
   greift direkt. Begruendung: MaxDD 82,8 % auf dem gemessenen IST-Pfad,
   schlechtester Einzeltrade -381 EUR.

2) B5-DEADLOCK RECHNERISCH AUFGELOEST -- die Regel ist ENTSCHIEDEN, nicht
   vertagt. Stand 11/20: Verhaeltnis 0,14 (Latte 1,0), PF 0,39 (Latte 1,0).
   Was die 9 Rest-Trades leisten muessten:
     9/0 Gewinner -> 165,72 EUR je Trade = 12,2x der bisherige Schnitt
     7/2          -> 186,17 EUR
     5/4          -> 222,99 EUR
   Der groesste Squeeze-Gewinn des Zeitraums war 77,34 EUR -- selbst der beste
   Fall verlangt 2,1x den Rekord, neunmal in Folge. Latte nicht mehr erreichbar.
   auto_squeeze bleibt FALSE. Wiederaufnahme waere eine NEUE Entscheidung mit
   NEUER, vorab fixierter Latte.

3) core/kontrolle.py -- Kontroll-Fixture mit den Referenzwerten. Bricht bewusst
   NICHT ab: ein Backtest darf abweichen, er muss es nur wissen und sagen.

4) core/live_config.py -- EINE Quelle der Live-Parameter (ini + runtime_state in
   der Vorrangfolge des Engine-Starts). Dritte Instanz derselben Fehlerklasse:
   ATRMIN_STD 0,12 statt 0,06, fehlendes set_entry_room, nachgebauter Cluster.

5) stichprobe.paarweise()/zeig_paarweise() -- gepaarter Vergleich. Anlass:
   trail_start sah sequentiell besser aus, gepaart kippte das Vorzeichen
   (Selektions- statt Exit-Effekt). Selbsttest in drei Richtungen bestanden.

6) tools/check_konstanten.py -- Waechter fuer veraltete Zahlen.
   Erster Lauf: zwei Befunde, BEIDE Fehler in meiner eigenen Ableitung (Margin
   aus Balance geschaetzt statt vom Broker gelesen; Elliott ohne
   Gueltigkeitsfenster gezaehlt). Beide korrigiert.
   Danach ein ECHTER Fund: meine am 13.08. notierten "~405 EUR/Lot" sind falsch,
   der exakte Broker-Wert ist 712,84 -- die urspruenglich notierten 670 lagen
   naeher als meine Korrektur. Lehre: eine abgeleitete Zahl ist keine gemessene.
   Stand jetzt 0 Befunde.

7) Puls-Waechter bedingungs-bewusst: PULS traegt je Zeile die Vorbedingung,
   bedingte Tabellen erscheinen als Hinweis statt als Ausfall. 0 Zeilen bleibt
   IMMER ein Befund (der rec_outcomes-Fall). Grund: ein Waechter mit
   Fehlalarmen wird ignoriert -- so ist der Divergenz-Waechter verstummt.

Pipeline gruen (85 Tests), Deployment ueber deploy.py --feld circuit_breaker
verifiziert, genau eine Instanz je Port.
Nicht angefasst: Sizing (User-Entscheidung) und die 44 Backtests mit eigener
Exit-Kopie (Migrations-Regel).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-17 00:57:38 +02:00
co-authored by Claude Opus 5
parent 9dbc5d0452
commit 792355e8f9
7 changed files with 641 additions and 19 deletions
+89 -2
View File
@@ -5626,8 +5626,16 @@ Folge der S/R-Widerlegung: der Hebel zeigt auf die GRÖSSE. Pfad-Simulation übe
**1.278 geschlossene Trades (08.05.13.08.)**, `pnl/lots` als größenunabhängiges
Ergebnis, Lots aus der jeweils simulierten Equity abgeleitet.
⚠ Zwei dokumentierte Zahlen stimmen nicht mehr und wurden **aus den Daten neu
geschätzt**: EUR je $ und Lot = **86,90** (notiert 87,6) und Margin je Lot
**~405 €** (notiert 670 — bei 1.279 € Balance und ~3 Lots).
geschätzt**: EUR je $ und Lot = **86,90** (notiert 87,6).
⚠⚠ **KORREKTUR MEINER EIGENEN KORREKTUR (2026-08-17, vom Konstanten-Wächter
gefunden):** hier stand „Margin je Lot **~405 €** (notiert 670)". **Die 405 waren
falsch.** Ich hatte sie aus `Balance × 95 % / Lots` abgeleitet — das unterstellt,
jede Position sei auf volle 95 % gesized. Der **exakte** Wert kommt vom Broker
(`position.margin / position.lots`) und beträgt **~713 €/Lot**; die ursprünglich
notierten 670 lagen also deutlich näher als meine „Korrektur".
**Lehre: eine abgeleitete Zahl ist keine gemessene.** Wo der Broker die Größe
selbst ausrechnet, gehört sie von dort geholt — `tools/check_konstanten.py`
macht das jetzt.
**(1) DER IST-PFAD IST DIE EIGENTLICHE BOTSCHAFT:**
| | |
@@ -5975,6 +5983,85 @@ Funding trägt nicht); und der einzige je gemessene grosse Hebel war die
zusammen). Eine neue Datenquelle müsste diese Latte schlagen, nicht nur „auch
Information enthalten".
### ✅✅ SIEBEN VERBESSERUNGEN UMGESETZT (User-Auftrag 2026-08-17)
**1 · CIRCUIT-BREAKER SCHARF** — `[trading] daily_loss_limit_pct = 0 → 8`
(Backup `…bak-2026-08-17-breaker`). Live verifiziert: `enabled=True`,
`limit_eur` **89,44 €**. ⚠ Steht **nicht** in `runtime_state.json` — die ini
greift direkt (die Falle, durch die `auto_signal` am 31.07. unbemerkt lief).
Begründung: der gemessene IST-Pfad hat **MaxDD 82,8 %** und einen schlechtesten
Einzeltrade von **381 €**; der Breaker kostet an normalen Tagen nichts und
greift nur in der Serie. ⚠ Ehrlich: 70 % des gemessenen Nutzens stammten aus
EINEM Tag — das ist das Wesen einer Versicherung, aber die +739 € sind eine
Realisierung, keine Erwartung. **Zurück: `= 0`.**
**2 · B5-DEADLOCK RECHNERISCH AUFGELÖST — die Regel ist ENTSCHIEDEN.**
Stand 11/20: ØGewinn 13,62 gegen ØVerlust 94,15 = **Verhältnis 0,14** (Latte
1,0), **PF 0,39** (Latte 1,0). Nachgerechnet, was die 9 Rest-Trades leisten
müssten:
| Rest-Szenario | nötiger Ø-Gewinn | ר bisher |
|---|---|---|
| 9 Gewinner / 0 Verlierer | **165,72 €** | **12,2×** |
| 7 / 2 | 186,17 € | 13,7× |
| 5 / 4 | 222,99 € | 16,4× |
⚠ Der **grösste** Squeeze-Gewinn des Zeitraums war **77,34 €** — selbst der
beste Fall verlangt **2,1× den Rekord**, neunmal in Folge. **Die Latte ist nicht
mehr erreichbar.** Auf 20 zu warten hätte den Zustand nie entschieden, zumal der
Trader seit 11.08. aus ist und der Zähler damit einfror (der Deadlock).
`auto_squeeze` bleibt **FALSE**. ⚠ Eine Wiederaufnahme wäre eine **NEUE**
Entscheidung mit **NEUER, vorab fixierter** Latte — nicht die Fortsetzung dieser.
**3 · `core/kontrolle.py` — Kontroll-Fixture.** Referenzwerte (Squeeze
Touchfill +0,124/+0,292 · Close-Bruch +0,456/+0,611 · Markt 0,158/0,006) plus
`pruefe_squeeze()`. Anlass: zwei Messungen am 13.08. konnten die Referenz nicht
reproduzieren, wodurch ihre Absolutwerte unbrauchbar waren. ⚠ Es bricht **nicht
ab** — ein Backtest darf abweichen, er muss es nur WISSEN und sagen; ein harter
Abbruch würde legitime Varianten unmöglich machen, eine stille Abweichung
erzeugt genau die Fehlschlüsse.
**4 · `core/live_config.py` — EINE Quelle der Live-Parameter.** Liest ini +
`runtime_state.json` in derselben Vorrangfolge wie der Engine-Start. ⚠ Anlass
ist die **dritte** Instanz derselben Fehlerklasse: `ATRMIN_STD`=0,12 statt live
0,06 (13.08.), `set_entry_room(0.6)` vergessen (05.08.), nachgebauter
Level-Cluster (07.08.). **Ein aufgerufenes Gate ist nicht dasselbe wie ein
aktives.** Aufruf: `python -m core.live_config`.
**5 · `stichprobe.paarweise()` / `zeig_paarweise()`.** Anlass: beim
`trail_start`-Sweep (14.08.) sahen sequentiell vier Werte beidhälftig besser aus
— gepaart kippte in H2 das Vorzeichen, weil ein anderer Exit ANDERE Trades in
den EINEN Slot lässt (Selektions- statt Exit-Effekt). ⚠ Der gepaarte Test ist
nicht nur richtiger, sondern **trennschärfer**: er misst die Streuung des
UNTERSCHIEDS, nicht die der Trades. Selbsttest: identisch → KI [0,0000 … 0,0000],
+0,30 → KI ohne Null, Rauschen → KI mit Null.
**6 · `tools/check_konstanten.py` — Wächter für veraltete Zahlen.** Leitet vier
tragende Grössen aus den Daten ab und hält sie gegen CLAUDE.md.
⚠⚠ **Er hat beim ersten Lauf zwei Befunde geliefert — beide waren FEHLER IN
MEINER EIGENEN ABLEITUNG**, also genau die Fehlalarme, gegen die Punkt 7 gebaut
ist: „Margin je Lot" war aus `Balance × 95 % / Lots` geschätzt (unterstellt volle
Auslastung), „Elliott-Stimmanteil" zählte über ALLE Zeilen statt über das
dokumentierte Fenster vor der Entmachtung. Beide korrigiert.
**Danach fand er einen ECHTEN veralteten Wert — meinen:** die am 13.08. von
mir notierten „~405 €/Lot" sind falsch; der exakte Broker-Wert
(`position.margin/lots`) ist **712,84 €/Lot**, die ursprünglich notierten 670
lagen also näher als meine „Korrektur". **Lehre: eine abgeleitete Zahl ist keine
gemessene.** Stand jetzt: **0 Befunde** über alle vier Grössen.
**7 · Puls-Wächter bedingungs-bewusst.** Er meldete `pbreak_predictions` als
„63,5 h still" — die Tabelle schreibt aber nur bei **frischem Level-Touch auf
der Ziel-Seite einer OFFENEN Position**. `PULS` trägt jetzt je Zeile ihre
**Vorbedingung**; bedingte Tabellen erscheinen als **ⓘ Hinweis** statt als
Ausfall. ⚠ **0 Zeilen bleibt IMMER ein Befund** — „hat nie geschrieben" lässt
sich nicht wegerklären (das war der `rec_outcomes`-Fall). Grund: ein Wächter mit
Fehlalarmen wird ignoriert, und mit ihm die eine echte Meldung — genau das ist
dem Divergenz-Wächter passiert (6 Tage Dauerwarnung).
✅ Pipeline grün (85 Tests), Deployment über `tools/deploy.py --feld
circuit_breaker` verifiziert, genau eine Instanz je Port.
**Nicht angefasst:** das Sizing (95 % Margin) — Ihre mehrfach bestätigte
Entscheidung; und die 44 Backtests mit eigener Exit-Kopie (Migrations-Regel:
ihre publizierten Zahlen würden sich verschieben).
### ✅ S/R-AUTO-CLOSE WIEDER AN (User-Entscheidung 2026-08-11)
Frage war: „sollten wir Trades bei einem S/R-Bounce automatisch schliessen?"