M15-Karte: Gate 3b zeigt Motor-Block + RAUM je Richtung

Anlass Trade #49671601 (-87,03 EUR). Die Praemisse "SL trotz LONG-
Empfehlung" stimmte nicht: 138 Zeilen zwischen Ein- und Ausstieg,
100 % WARTEN (entry_room 76 %, breakout_pending 19 %, min_conf 5 %).
Gesehen wurde "verboten: SHORT" - ein Veto. Dritter Fall derselben
Veto->Richtung-Umwandlung in dieser Karte (Code 08.08., Geometrie
10.08. frueh, jetzt die Lesart).

Der eigentliche Befund: entry_room und Gate 3 lesen DIESELBE Tatsache
("ein Level ist nah") mit umgekehrtem Vorzeichen. Beide gemessen,
beide richtig - ueber verschiedene Trades (Markt-Einstieg mit dem
Level als Hindernis vs. ruhende Order AM Level). Die Karte zeigte nur
die gruene Haelfte; die Block-Grund-Zeile war mit der Gesamtempfehlung
verschwunden.

Gebaut: Zeile 3b (#m15-motor) mit block_reason im Klartext + Raum je
Richtung. Reine Anzeige. Das Status-Banner bleibt bewusst unveraendert
- es auf gelb zu ziehen waere eine Strategie-Aenderung, und die einzige
Live-Zahl dafuer (-9,91 vs +3,24 EUR/Lot, n=76) hat ein KI, das die
Null enthaelt.

- wave_rec.room_info(): EINE Implementierung fuer Gate und Anzeige,
  _room_gate rechnet jetzt darueber (kein Nachbau)
- tests/test_room_info.py: Bitgleichheit ueber 2.000 Zufallslagen x 3
  Signale, Gate feuerte >300x; Grenzfall-Test fuer die Rundung
- v=160

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-10 09:09:27 +02:00
co-authored by Claude Opus 5
parent 5474c2be61
commit 47c596ed70
6 changed files with 375 additions and 19 deletions
+35 -2
View File
@@ -3879,7 +3879,7 @@ class TradingEngine:
# NICHT, `ruff F821` schon (4 Befunde, darunter `_m15` selbst) — genau
# die Fehlerklasse, fuer die der Linter am 07.08. eingebaut wurde.
_m15 = self._m15_setup(market, wave_snap, _cone,
self._alignment_cached())
self._alignment_cached(), wave_signal)
self._log_m15_state(_m15, market)
self._log_cone_check(_cone)
# Für den KI-Copiloten festhalten (2026-08-02) — er bekam bis dahin nur
@@ -4281,7 +4281,8 @@ class TradingEngine:
except Exception:
return None
def _m15_setup(self, market, wave_snap, cone, alignment) -> dict | None:
def _m15_setup(self, market, wave_snap, cone, alignment,
wave_signal=None) -> dict | None:
"""SETUP-BEREITSCHAFT auf M15 — der Ersatz für die entfernte Gesamtempfehlung.
BEWUSST KEINE RICHTUNGS-EMPFEHLUNG. Gemessen (2026-08-08) trägt auf
@@ -4360,6 +4361,38 @@ class TradingEngine:
"p_break": round(100 * p)})
out["zonen"] = zonen
# ── 3b) MOTOR-ZUSTAND + RAUM ─────────────────────────────────
# ⚠⚠ ANLASS 2026-08-10 (Trade #49671601, 87 €): die Karte zeigte
# GRÜN, während der Signal-Motor zu 76 % mit `entry_room` blockte.
# Das ist kein Widerspruch im Motor, sondern eine LÜCKE in der
# Karte: dieselbe geometrische Tatsache — „ein Level ist sehr nah"
# — wird von beiden Seiten mit UMGEKEHRTEM Vorzeichen gelesen:
# · Gate ③ (Karte): Level in Reichweite → man kann eine ruhende
# Order dort platzieren → GUT
# · entry_room (Motor): das Ziel-Level ist zu nah → Ertrag
# gedeckelt, Kosten fressen ihn → SCHLECHT
# (gemessen ØR 0,119/0,067 · PF 0,42/0,66)
# Beide sind gemessen und beide haben recht — über VERSCHIEDENE
# Trades (Markt-Einstieg mit dem Level als Hindernis gegen ruhende
# Order AM Level). Die Karte verschwieg nur die zweite Hälfte.
# ⚠ REINE ANZEIGE. Es wird nichts geblockt und keine Richtung
# ausgegeben — der Raum kommt für BEIDE Richtungen, weil der Mensch
# in jede handeln kann. Hartes Blockieren ist im Projekt verworfen
# (Übersteuerungen des Users liefen gemessen 68 % WR).
# ⚠ `room_info` ist DIESELBE Funktion, die das Gate entscheidet —
# kein Nachbau (die Divergenz-Falle, dreimal dokumentiert).
wsig = wave_signal or {}
try:
raum = self.wave.room_info(bid)
except Exception:
raum = None
out["motor"] = {
"signal": wsig.get("signal"),
"block": wsig.get("block"),
"grund": (wsig.get("reasons") or [None])[0],
"conf_pct": wsig.get("conf_pct"),
"raum": raum}
# ── 4) REICHWEITE — der Kegel (kalibriert: 80 %-Band trifft 77 %)
lv = (cone or {}).get("levels") or []
b80 = [x for x in lv if x.get("band") == 80]