User: "baue alle und integriere in die pipeline vor dem commit". Beide Stufen
schliessen Luecken, die HEUTE real zugeschlagen haben.
A3) TYPPRUEFUNG (ty 0.0.73, Konfiguration in ty.toml)
Anlass: `paarweise(d)` wurde mit 1 von 2 Pflichtargumenten gerufen. py_compile
sah nichts (Syntax ok), ruff F821 auch nicht (der Name IST definiert), kein Test
deckte den Pfad ab - der Fehler schlug erst zur Laufzeit zu.
⚠ BEWUSST ENGES REGELSET: der volle ty-Lauf meldet 172 Befunde, davon 97
`unresolved-attribute` aus fehlenden MetaTrader5-Stubs. Eine Stufe mit
Dauer-Treffern wird ignoriert, und mit ihr die eine echte Meldung (die Lehre vom
07.08.). Aktiv sind nur die Aritaets-Regeln. `call-non-callable` und
`not-iterable` sind AUS - beide melden hier ausschliesslich Falsch-Positive aus
heterogenen dicts (`c["have"]()`, `"up" in c`); geprueft, nicht angenommen.
⚠ Der dokumentierte Einwand "Pruefumgebung != Laufumgebung" greift NICHT: ein
Typchecker fuehrt nichts aus, er kann also nicht divergieren. Er braucht auch
kein MT5.
⚠ Nebenbefund: die CLAUDE.md-Begruendung gegen mypy ("kaum Annotationen
vorhanden") ist veraltet - gemessen sind 305 von 443 Funktionen annotiert (69 %).
B2) RENDER-PROBE (tools/render_check.mjs gegen tests/fixtures/snapshot.json)
Anlass: `node --check` prueft nur SYNTAX. Der ReferenceError von heute Abend
(RSI-Zeile griff in renderM15(s) auf d.market zu) war syntaktisch einwandfrei
und brach im Browser den GESAMTEN Render ab - sechs leere Zeilen und eine leere
Breakout-Karte. Fuer Python gibt es ruff F821, fuer JS gab es nichts.
⚠ Laeuft gegen einen GESPEICHERTEN Snapshot, nicht gegen den laufenden Server -
der Hook darf nicht davon abhaengen, ob gerade ein Server laeuft.
⚠ KEIN ESLint: das braeuchte npm und node_modules, gegen die dokumentierte
Entscheidung ("kein npm, keine package.json").
BEIDE RICHTUNGEN VERIFIZIERT, je Stufe:
A3 Aritaetsfehler eingebaut -> "FEHLER too-many-positional-arguments",
1 Befund; zurueck -> gruen
B2 d.market zurueckgebaut -> "❌ EXCEPTION: d is not defined",
1 Befund; zurueck -> gruen
Beide haengen an tools/check_nfalle.py und laufen damit im pre-commit-Hook mit.
Fehlt das Werkzeug (ty nicht installiert, node nicht im PATH, Fixture fehlt),
wird die Stufe uebersprungen statt zu blockieren - eine frische Maschine darf am
Hook nicht haengenbleiben. Ein WERKZEUGFEHLER (Exit != 0/1) gilt dagegen
ausdruecklich NICHT als sauber.
ty in requirements-dev.txt gepinnt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 line
14 KiB
JSON
1 line
14 KiB
JSON
{"ts":1787174006.9368982,"connected":true,"running":true,"error":null,"symbol":"SpotCrude","wave_tf":"M5","min_conf":70,"auth_required":false,"market":{"symbol":"SpotCrude","bid":85.227,"ask":85.259,"spread":0.032,"change":-0.04200000000000159,"pct":-0.04924664360673224,"day_high":86.678,"day_low":84.292,"balance":668.3,"equity":668.3,"currency":"EUR","error":null,"trend_angle":137.13918407284268,"angles":{"M5":79.10681441974654,"M15":137.13918407284262,"M30":151.34457584184128,"H1":110.58013642771405},"rsi_m15":44.41470027202243,"atr_m15":0.2942462693384998,"server_time":"2026-08-19T23:58:59+00:00","tick_local_ts":1787173139.6395023,"tick_server_ts":1787183939,"sessions":{"0":[[79200,86400]],"1":[[0,79200]],"2":[[0,79200]],"3":[[0,79200]],"4":[[0,79200]],"5":[[0,79200]],"6":[]},"reversal":null,"reasons":[],"sr":{"supports":[{"price":84.73625,"touches":4}],"resistances":[{"price":85.40066666666667,"touches":3},{"price":85.9305,"touches":6}],"trendline_up":null,"trendline_dn":null}},"sr_levels":{"resistance":85.412,"support":85.212,"resistances":[85.412],"supports":[85.212]},"session":{"active":[],"since_open_min":{"DE":853,"US":493},"just_opened":null,"next_open":null,"phase":"außerhalb DE/US","weekend":false},"position":{"ticket":null,"order_type":null,"entry_price":0.0,"lots":0.0,"pnl":0.0,"cur_price":0.0,"sl":0.0,"tp":0.0,"margin":0.0,"open_time":0.0},"day_pl":{"realized":-207.48,"open":0.0,"total":-207.48},"circuit_breaker":{"enabled":true,"limit_pct":8.0,"limit_eur":53.46,"day_total":-207.48,"tripped":true},"emergency_loss":null,"emergency_remember":0.0,"emergency_pct":0.0,"emergency_margin_pct":0.0,"wht_pct":26.375,"takeprofit":null,"takeprofit_remember":0.0,"trail":{"enabled":false,"atr":0.10099999999999706,"atr_raw":0.10099999999999706,"atr_tf":"M5","atr_tf_override":"M5","high_water":null,"last_sl":85.227,"last_tp":85.786,"trail_mult":1.0,"phase":"—"},"wave_signal":{"signal":"WARTEN","conf_pct":0,"score":0.0,"setup":"WAVE","regime":null,"rsi":null,"block":"entry_room","reasons":["kein Raum: Support 85.21 nur 0.13×ATR entfernt (Gate 0.6) — Ertrag gedeckelt, Kosten fressen den Edge"]},"wave":{"tf":"M5","atr":0.11042857142856885,"direction":"down","wave_start":85.339,"move_atr":-1.02,"n_pivots":0,"trend_sep":-1.86,"bounce":{"state":null,"dir":null,"tf":null},"htf_trend":0,"h1_trend":1,"tf_turns":{"M1":{"dir":1,"bars_ago":62,"fresh":false},"M5":{"dir":-1,"bars_ago":33,"fresh":false},"M15":{"dir":-1,"bars_ago":8,"fresh":false},"M30":{"dir":0,"bars_ago":0,"fresh":false},"H1":{"dir":1,"bars_ago":58,"fresh":false}},"tf_atr":{"M1":0.056642857142859625,"M5":0.11042857142856885,"M15":0.2934285714285707,"M30":0.4577142857142838,"H1":0.695214285714283},"pb_feats":{"mom6":0.583,"mom3":0.292,"ema_diff":-1.707,"atr":0.12},"pb_levels":{"ph":[85.08,85.025,85.08,85.396,85.412,85.382,85.367,85.402,85.392,85.797,85.797,85.892,85.992,85.802,85.762,85.717,85.877,85.587,85.832,85.587,86.263,85.927,86.103,85.837,85.332,85.433,85.663,86.337,86.423,86.678,86.132,85.247,85.247,85.152,85.227],"pl":[84.785,84.859,85.061,85.262,85.262,85.266,85.322,85.322,85.212,85.602,85.51,85.457,85.502,85.502,85.377,85.365,85.262,85.147,85.117,85.517,85.517,85.476,84.292,85.247,85.247,85.412,85.872,86.097,85.737,84.992,84.781,85.022]},"pb_levels30":{"ph":[85.412,85.992,85.877,86.263,86.678],"pl":[85.212,85.117,84.292]},"liq_zones":{"eqh":null,"eql":null},"squeeze":{"state":"armed","dir":"LONG","level":85.239,"box_atr":1.71,"box_hi":85.227,"box_lo":85.022},"breakout":{"pending":false,"dir":null,"need":null},"error":null,"last_update":1787174006.5307655},"elliott":{"tf":"M5","pattern":"impulse_up","wave":"5 (vollendet)","dir":"up","target":85.188,"target_label":"Reversal ~0.382–0.618","exhaustion":true,"invalidation":85.328,"valid":false,"fvg":{"type":"bullish","low":85.082,"high":85.087,"mid":85.084},"n_pivots":231,"note":"Impuls aufwärts vollendet bei 85.328 → Reversal abwärts wahrscheinlich","error":null,"last_update":1787174006.5317712,"stale":false},"tu":{"symbol":"WTI/USD","intervals":{},"error":null,"last_update":null,"busy":false},"agent":{"advisory":{"bias":"NEUTRAL","confidence":30,"timeframe":"M5","headline":"Kein Einstieg: Support zu nah, Setup-Historie negativ, außerhalb der Handelssession","reasoning":"Das WAVE-Signal wartet, da der Support bei 85.21 nur 0.13×ATR entfernt ist (zu geringe Ertragspotenzial). Das Setup hat eine negative durchschnittliche PnL (-0.43) und liegt außerhalb der aktiven Handelssessions, was die Volatilität erhöht.","risks":["Geringe Liquidität außerhalb der Handelssessions","Niedriges Ertragspotenzial durch nahen Support","Negatives Track-Record des aktuellen Setups"],"position_note":""},"error":null,"last_update":1787173743.7303193,"busy":false,"provider":"zai","configured":true,"provider_dead":{}},"daily_levels":{"support":null,"res_lo":null,"res_hi":null,"bias":"neutral","summary":"","ts":0.0,"error":null},"gaps":{"gaps":[{"date":"2026-06-04","dir":"down","kind":"close_open","lo":97.866,"hi":98.491,"fill":98.491,"size":0.625},{"date":"2026-07-13","dir":"up","kind":"close_open","lo":71.775,"hi":73.594,"fill":71.775,"size":1.819},{"date":"2026-07-27","dir":"down","kind":"vacuum","lo":86.222,"hi":88.288,"fill":88.288,"size":2.066},{"date":"2026-08-10","dir":"up","kind":"close_open","lo":77.383,"hi":78.769,"fill":77.383,"size":1.386}],"n_open":4,"n_vacuum":1,"n_close_open":3,"n_total":34,"last_update":1787173799.4602318},"structure":{"trend":"range","swings":[{"type":"HL","price":85.212},{"type":"HH","price":85.992},{"type":"LL","price":85.117},{"type":"HH","price":86.263},{"type":"LL","price":84.292},{"type":"HH","price":86.678}],"last_swing":"HH","bos":{"dir":"up","level":86.263,"bars_ago":6},"channel":{"dir":"up","pos":0.17,"upper":86.494,"lower":84.882,"mid":85.693,"slope_atr":0.016},"channel_line":{"t1":1787070600,"t2":1787180400,"dir":"up","upper":[86.039,86.494],"mid":[85.238,85.693],"lower":[84.428,84.882]},"tf":"M30","error":null},"patterns":{"patterns":[{"type":"double_bottom","name":"Doppelboden","dir":"bull","quality":0.7,"trigger":85.992,"target":86.867,"height_atr":1.9,"status":"forming","bars_ago":7,"note":"zwei Tiefs 85.21/85.12, Nackenlinie 85.99","measured":true},{"type":"inv_cup","name":"Inverse Tasse+Henkel","dir":"bear","quality":0.63,"trigger":85.117,"target":84.242,"height_atr":1.9,"status":"forming","bars_ago":7,"note":"abgerundetes Top 85.99, Rand ~85.12 (Henkel-Unterkante)","measured":true}],"atr":0.4577,"cur":85.227,"ts":1787173981.271978},"candle_anat":{"tf":"M5","items":[{"cls":"Engulfing","label":"Engulfing","dir":-1,"bars_ago":2,"vol_x":1.3,"hot":false,"reading":"⚠ Klimax-Kerze — gemessen läuft der Kurs danach eher GEGEN die Kerze (nicht Fortsetzung)","body_pct":62,"wick_up_pct":7,"wick_lo_pct":30},{"cls":"Doji","label":"Doji","dir":0,"bars_ago":4,"vol_x":0.7,"hot":false,"reading":"Gleichstand — keine Seite dominiert","body_pct":0,"wick_up_pct":13,"wick_lo_pct":87},{"cls":"Doji","label":"Doji","dir":0,"bars_ago":5,"vol_x":0.8,"hot":false,"reading":"Gleichstand — keine Seite dominiert","body_pct":4,"wick_up_pct":59,"wick_lo_pct":37},{"cls":"Doji","label":"Doji","dir":0,"bars_ago":6,"vol_x":0.8,"hot":false,"reading":"Gleichstand — keine Seite dominiert","body_pct":9,"wick_up_pct":9,"wick_lo_pct":81}],"vol_hot_x":2.0,"ts":1787173991.363231},"cone":{"atr":0.12,"price":85.227,"levels":[{"minutes":30,"bars":6,"band":50,"lo":85.12,"hi":85.337,"coverage":44.4,"skala":0.972},{"minutes":30,"bars":6,"band":80,"lo":84.994,"hi":85.456,"coverage":76.7,"skala":0.972},{"minutes":60,"bars":12,"band":50,"lo":85.064,"hi":85.391,"coverage":45.1,"skala":1.016},{"minutes":60,"bars":12,"band":80,"lo":84.879,"hi":85.572,"coverage":76.6,"skala":1.016},{"minutes":120,"bars":24,"band":50,"lo":84.999,"hi":85.461,"coverage":45.5,"skala":0.976},{"minutes":120,"bars":24,"band":80,"lo":84.737,"hi":85.716,"coverage":75.3,"skala":0.976}]},"stats_compact":{"week":{"n":75,"wr":49,"pf":0.49,"avg_win":14.89,"avg_loss":-29.7,"ratio":0.5,"pnl":-577.82},"all":{"n":1345,"wr":56,"pf":0.96,"avg_win":14.03,"avg_loss":-19.55,"ratio":0.72,"pnl":-462.05}},"close_alert_count":0,"news_storm":{"level":"elevated","fresh":4,"base_per_h":1.7},"news_sentiment":0.32,"alignment":{"with":{"n":359,"wr":56,"pnl":331.53,"pnl_lot":1.84},"against":{"n":91,"wr":41,"pnl":-262.58,"pnl_lot":-7.9},"none":{"n":895,"wr":57,"pnl":-531.0,"pnl_lot":-0.78}},"hl_ctx":{"funding":8.04049e-05,"open_interest":1973714.6100000003,"mark":84.612,"oracle":84.471,"premium":0.14099999999999113,"day_volume":128046328.89346,"network":"mainnet"},"rec_track":{"n":72,"wr30":48.6,"avg30":0.025,"n30":72,"wr60":46.4,"avg60":-0.202,"n60":69},"squeeze_b5":{"n":11,"ziel":20,"wins":8,"losses":3,"avg_win":13.62,"avg_loss":-94.15,"ratio":0.14,"pf":0.39,"sum_eur":-173.46,"latte":1.0},"auto_m15":false,"m15_entry_count":1,"manual_stats":{"tage":30,"fenster":{"n":453,"wr":58.3,"sum":-496.27,"avg":-1.1},"gesamt":{"n":1296,"wr":55.8,"sum":-422.84,"avg":-0.33},"heute":{"n":32,"wr":50.0,"sum":-206.17,"avg":-6.44},"mit_signal":{"n":63,"wr":58.7,"sum":-113.8,"avg":-1.81},"ohne_signal":{"n":382,"wr":57.9,"sum":-468.72,"avg":-1.23},"bot":{"n":35,"wr":54.3,"sum":-36.8,"avg":-1.05},"ctx_abdeckung":{"n":1296,"mit_ctx":181,"pct":14.0}},"manual_margin":0.0,"margin_pct":95.0,"position_brk":null,"margin_brk":10.0,"margin_m15":85.0,"cost_ratio":0.27,"m15_setup":{"atr_m15":0.2934,"bias":{"m30":0,"h1":1,"verboten":null,"einig":false,"richtung":null},"kosten":{"ratio":0.109,"stufe":"guenstig"},"zonen":[{"seite":"res","level":85.412,"gap_atr15":0.63,"p_break":36},{"seite":"sup","level":85.212,"gap_atr15":0.05,"p_break":42}],"motor":{"signal":"WARTEN","block":"entry_room","grund":"kein Raum: Support 85.21 nur 0.13×ATR entfernt (Gate 0.6) — Ertrag gedeckelt, Kosten fressen den Edge","conf_pct":0,"raum":{"gate":0.6,"atr_m5":0.12,"long":{"level":85.247,"dist_atr":0.17,"frei":false},"short":{"level":85.212,"dist_atr":0.13,"frei":false}}},"m5":{"squeeze":"armed","squeeze_dir":"LONG","box_atr":1.71,"atr":0.12,"kosten":0.267},"reichweite":[{"minutes":30,"lo":84.994,"hi":85.456},{"minutes":60,"lo":84.879,"hi":85.572},{"minutes":120,"lo":84.737,"hi":85.716}],"ziel":null,"ziel_grund":"kein Veto — Richtung offen, kein Ziel bestimmbar","status":"gruen","lesart":"auf","nah":{"seite":"sup","level":85.212,"gap_atr15":0.05,"p_break":42},"vola":{"datr":1.0,"stufe":"normal"},"veto":{"with":{"n":359,"wr":56,"pnl":331.53,"pnl_lot":1.84},"against":{"n":91,"wr":41,"pnl":-262.58,"pnl_lot":-7.9},"none":{"n":895,"wr":57,"pnl":-531.0,"pnl_lot":-0.78}}},"m15_track":{"n":200,"offen":47,"roh":8000,"wr30":59,"wr60":56,"avg30":0.253},"entry_gap":{"n_seit_umbau":3,"soll":12},"sr_close_hint":null,"stop_approach":null,"auto_sr_close":false,"sr_close_min_gain":0.0,"sr_close_pbreak":0.35,"sr_close_count":0,"close_notify_min":50.0,"auto_squeeze":true,"squeeze_night_hours":[3,4,5,6],"squeeze_pending":true,"pending_levels":[],"pending_quelle":"","squeeze_max_chase_atr":0.2,"squeeze_entry_count":0,"adverse15_atr":0.0,"adverse15_count":0,"flip_close":false,"flip_close_min_r":0.5,"flip_close_count":0,"last_trades":[{"direction":"BUY","lots":0.87,"entry_time":1787167100,"exit_time":1787173139,"entry_price":85.236,"exit_price":85.227,"pnl":-0.67,"commission":0.0,"closed_by":"sl","setup":"WAVE"},{"direction":"SELL","lots":0.87,"entry_time":1787165969,"exit_time":1787166966,"entry_price":85.212,"exit_price":85.272,"pnl":-4.47,"commission":0.0,"closed_by":"sl","setup":"WAVE"},{"direction":"BUY","lots":0.87,"entry_time":1787164282,"exit_time":1787165939,"entry_price":85.187,"exit_price":85.171,"pnl":-1.19,"commission":0.0,"closed_by":"sl","setup":"WAVE"},{"direction":"BUY","lots":0.09,"entry_time":1787164195,"exit_time":1787164226,"entry_price":85.116,"exit_price":85.161,"pnl":0.27,"commission":0.0,"closed_by":"manual","setup":"AUTOM15_LONG"},{"direction":"BUY","lots":0.37,"entry_time":1787163083,"exit_time":1787164193,"entry_price":85.836,"exit_price":85.102,"pnl":-23.29,"commission":0.0,"closed_by":"sl","setup":"WAVE"},{"direction":"BUY","lots":0.37,"entry_time":1787162863,"exit_time":1787163039,"entry_price":85.861,"exit_price":85.831,"pnl":-0.95,"commission":0.0,"closed_by":"circuit_breaker","setup":"WAVE"},{"direction":"BUY","lots":0.38,"entry_time":1787162741,"exit_time":1787162832,"entry_price":85.966,"exit_price":85.837,"pnl":-4.2,"commission":0.0,"closed_by":"circuit_breaker","setup":"WAVE"},{"direction":"BUY","lots":0.38,"entry_time":1787162411,"exit_time":1787162635,"entry_price":86.109,"exit_price":85.942,"pnl":-5.44,"commission":0.0,"closed_by":"circuit_breaker","setup":"WAVE"},{"direction":"BUY","lots":0.38,"entry_time":1787161336,"exit_time":1787162231,"entry_price":85.836,"exit_price":85.832,"pnl":-0.13,"commission":0.0,"closed_by":"sl","setup":"AUTOM15_LONG"},{"direction":"BUY","lots":0.39,"entry_time":1787159908,"exit_time":1787161335,"entry_price":86.506,"exit_price":85.812,"pnl":-23.21,"commission":0.0,"closed_by":"sl","setup":"WAVE"}],"calendar":{"enabled":true,"n":2,"blackout":null,"next":null,"age_min":4},"market_closed":true,"tick_age_s":866,"hl_live":{"mid_mt5":85.478,"hl_mid":84.596,"basis":0.8815,"age_s":1.6,"basis_stale":true,"bid":85.458,"ask":85.496,"bid_sz":668.48,"ask_sz":359.99,"imb5":0.9397,"trend":"up","slope_per_h":0.3867,"vs_mt5":0.251},"pnl_hl":null,"checklist":{"long":{"side":"LONG","items":[{"key":"signal","state":"fail","label":"Keine Empfehlung (WARTEN)","detail":"gemessen: Trades ohne Signal sind die größte Verlustquelle"},{"key":"htf","state":"warn","label":"HTF-Trend unklar/seitwärts","detail":"kein klarer M30/H1-Trend"},{"key":"room","state":"ok","label":"Raum bis zum Level: 1.5×ATR","detail":""},{"key":"cost","state":"warn","label":"Kosten erhöht (0.27×ATR)","detail":""},{"key":"streak","state":"fail","label":"Heute schon 17 Verluste (33 Trades, -207 € = 31% des Kontos)","detail":"deine Regel: nach 2 Losses Session beenden"}],"fails":2,"warns":2,"verdict":"stop"},"short":{"side":"SHORT","items":[{"key":"signal","state":"fail","label":"Keine Empfehlung (WARTEN)","detail":"gemessen: Trades ohne Signal sind die größte Verlustquelle"},{"key":"htf","state":"fail","label":"HTF-Trend steht dagegen (M30/H1)","detail":"deine Regel: nur MIT dem HTF-Trend, niemals dagegen"},{"key":"room","state":"fail","label":"Kein Raum: Level nur 0.1×ATR entfernt","detail":"gemessen: <0,6×ATR Raum = negativer Erwartungswert"},{"key":"cost","state":"warn","label":"Kosten erhöht (0.27×ATR)","detail":""},{"key":"streak","state":"fail","label":"Heute schon 17 Verluste (33 Trades, -207 € = 31% des Kontos)","detail":"deine Regel: nach 2 Losses Session beenden"}],"fails":4,"warns":1,"verdict":"stop"}}} |