## Ergebnis der fokussierten Analyse ### 1. Größte Lücke: v76 verwendet überwiegend synthetische Marktdaten In `src/tools/v76_paper_runtime.py` werden echte Hyperliquid-Daten derzeit fast nur für `allMids` verwendet. Die entscheidenden Entry-Features sind konstant oder aus nur zwei Mid-Preisen konstruiert: - `_context()` ab Zeile 142: - synthetische SMA, High, Baseline und Retest-Level - `volume_24h=50000000` - `atr_pct=1.20` - feste Breadth und Relative-Strength-Ränge - `_anti_chase_context()` ab Zeile 189: - synthetische SMA/Retest/Recent-High - feste ATR, Liquidität, Slippage und Funding - 1h-Move lediglich `move_pct * 1.5` - `_swing_context()` ab Zeile 221: - vollständig synthetische Swing-, SMA- und Retest-Werte - feste ATR, Volume, Breadth und RS - `scan_once()` ab Zeile 596: - `spread_pct=0.03` - künstlicher `CoinMarketContext` mit RSI 55, Volume 50 Mio., ATR 1 %, fester L2-Tiefe und Impact Dadurch können Data-Quality- und Confluence-Gates valide aussehen, obwohl ihre Inputs nicht gemessen wurden. Besonders kritisch: `_confluence_gate()` kann bei fehlendem Report auf diesen künstlichen Tick-Kontext zurückfallen und so einen Entry freigeben. --- ## 2. Bereits vorhandene, wiederverwendbare Marktdaten-Komponenten ### Direkt geeignet **`src/hyperliquid/market_data.py`** `HyperliquidMarketData` ist eine saubere read-only Quelle für: - `get_all_mids()` - `get_candles()` - `get_l2_book()` - `get_meta_and_asset_ctxs()` `summarize_l2_book()` liefert bereits: - echten Spread - Bid-/Ask-Tiefe - Buy-/Sell-Impact für 1k und 5k USD **`src/market/collector.py`** `MarketContextCollector.collect()` berechnet bereits aus echten Candles und Asset-Kontexten: - RSI - SMA fast/slow - ATR - Candle-Volume - Funding - Open Interest - Premium, Mark und Oracle - `dayNtlVlm` - Spread, L2-Tiefe und Market Impact - Reliability/Stale/L2-Status Wichtige Einschränkung: `_atr()` nutzt dort aktuell nur `high-low`, nicht True Range inklusive Gap zum vorherigen Close. Für v2 besser die robustere ATR-Implementierung aus dem Shadow-Trader verwenden. **`src/tools/market_regime_shadow_trader.py:candle_features()`** Berechnet aus echten 15m/1h/4h-Candles: - EMA20/EMA50 auf 1h und 4h - RSI 1h - echte True-Range-ATR - 4h- und 24h-Return - aktuelles Volume relativ zum historischen Durchschnitt Diese Funktion deckt einen großen Teil der gewünschten v2-Trend-/Anti-Chase-Features ab. Sie sollte allerdings aus dem Tool-Modul in ein neutrales Modul wie `src/market/features.py` extrahiert werden, statt den Runtime-Code gegen ein anderes Runtime-Tool zu koppeln. **`src/market/snapshot.py`** Vorhandene Normalisierung für: - Trendzustand - RSI/Momentum - ATR und ATR-Prozent - Liquidität - Derivate - Confluence und Datenrisiken ### Fehlende echte Feature-Berechnung Noch nicht zentral vorhanden beziehungsweise nicht direkt passend: - strukturelles Retest-Low - Rolling High vor dem Pullback - Reclaim über Retest/SMA - Relative-Strength-Rang über das aktuelle Coin-Universum - reale positive Market Breadth über eine definierte Zeitspanne - VWAP-Distanz und Candle-Wick/Body aus dem aktuellen Entry-Timeframe Diese Werte lassen sich direkt aus denselben Candle-Fenstern ableiten. --- ## 3. Wiederverwendbare Long- und Anti-Chase-Komponenten ### Long **`src/strategies/swing_trend_retest.py`** Bereits gute, isolierte Gates: - `current_price > sma_fast > sma_slow` - Mindest-Trendstärke - sinnvoller Pullback-Bereich - Retest muss halten - Mindest-Reclaim - Funding-, Spread-, Liquiditäts-, Breadth- und RS-Gates - Edge mindestens 5× Kosten `build_swing_trend_retest_intent()` erzeugt bereits einen paper-tauglichen Long-Intent mit ATR-/Retest-basiertem Stop. ### Anti-Chase **`src/strategies/v76_fee_aware_anti_chase.py`** `anti_chase_blockers()` enthält bereits: - bearishen Markt als Long-Blocker - Market-Breadth-Gate - Stop-Cooldown - TradingView-Konflikt-Gates - Overextension ohne Retest - SMA-/Retest-Hold - Mindest-R/R - Edge-vs.-Kosten-Gate Die Strategie ist für v2 grundsätzlich wiederverwendbar. Ihr Hauptproblem liegt nicht in den Gates, sondern in den aktuell synthetischen Inputs aus `_anti_chase_context()`. ### Minimaler v2-Ansatz Keine neue parallele Strategie-Logik bauen. Stattdessen: 1. echte Feature-Snapshots erzeugen; 2. daraus `AntiChaseContext` beziehungsweise `SwingRetestContext` bauen; 3. vorhandene Blocker und Intent-Builder weiterverwenden; 4. Feature-Werte und Quellen vollständig journalisieren. --- ## 4. Wiederverwendbare Short-Research-Komponenten ### Bereits vorhanden **`src/tools/market_regime_shadow_trader.py`** Enthält bereits paper-only Long/Short-Unterstützung: - `market_regime()` erkennt bullish/bearish/choppy aus BTC und ETH - `score_coin()` unterstützt echte bearish Short-Setups - Short-Gates: - 1h-Downtrend - negativer 4h-Momentum-Filter - Short-RSI-Bereich - Funding Carry - Kostenhürde - `short_chase_risk_overextended` - `manage_positions()` behandelt Long und Short richtungsabhängig Die zugehörigen Tests liegen in: - `tests/test_market_regime_shadow_trader.py` - Short-Kosten - Funding gegen Short - überverkaufte Short-Chase-Sperre - gültiger bearish Short **`src/trader_desk/decision.py`** Unterstützt ebenfalls: - bearish/risk-off → `short` - Short-Retest-Zone - Short-Stop oberhalb des Entries - Short-TP1 und TP2 unterhalb des Entries - explizit Shadow-only bei Long-only-Mandat **`src/tools/trader_desk_shadow_runner.py`** Kann Long- und Short-Hypothesen öffnen und schließen und prüft Stop/TP1 richtungsabhängig. ### Kritische Integrationsgrenze `src/execution/paper_lifecycle.py` ist ausdrücklich **long-only**: ```python if intent.side != "buy": raise ValueError(...) ``` Außerdem sind Gross-PnL, MFE/MAE, Stop, TP und Trailing auf Long ausgerichtet. Ein `side="sell"`-Intent kann deshalb nicht einfach in die v76-Lifecycle-Pipeline gesteckt werden. **Empfehlung:** Short zunächst ausschließlich unter einer neuen Research-Variante führen, beispielsweise `candidate_v76_v2_short_research`, und die Lifecycle-Simulation zuerst explizit side-aware machen. Keinesfalls Short über die bestehende Long-Funktion „durchreichen“. --- ## 5. Wiederverwendbare Exit-Komponenten ### Vorhanden **`src/execution/paper_lifecycle.py`** Unterstützt bereits: - Stop-Loss - Take-Profit - Trailing Stop - Time Exit - MFE/MAE - Funding - Maker/Taker-Gebühren - Depth Slippage - Stop-Gap-Slippage - Partial-Fill-Cap Tests: `tests/test_paper_lifecycle.py`. **`src/tools/v76_paper_runtime.py`** Bereits vorhanden: - `_hold_policy_for_coin()` - Dead-Fish-Exit - Max-Hold-Exit - per Coin differenzierte WLD-Halteparameter - persistierte High-/Low-Watermarks und MFE/MAE **`src/tools/tiny_autonomous_live_runtime.py:_maybe_manage_position_exits()`** Als reine Logikvorlage wiederverwendbar: - Break-even ab konfigurierbarem R - Break-even-Cushion - Profit-Lock - Trailing ab R-Schwelle Diese Funktion selbst sollte wegen ihrer Live-/Exchange-Kopplung nicht importiert werden. Nur die mathematische Stop-Policy sollte in ein side-effect-freies Modul extrahiert werden. **`src/tools/market_regime_shadow_trader.py:manage_positions()`** Bietet bereits side-aware Profit-Lock/Trailing und Dead-Fish-Time-Exit für Long und Short. ### Noch nicht vorhanden - 50-%-Teilverkauf an TP1 - Zustandsübergang nach TP1 - Break-even für den verbleibenden Anteil - persistentes, korrektes Trailing über mehrere Runtime-Ticks --- ## 6. Konkrete Exit-Risiken im aktuellen v76-Code 1. **Trailing ist nicht wirklich tickübergreifend persistent.** `_close_lifecycle_positions()` persistiert zwar `high_watermark`, übergibt es aber nicht an `simulate_paper_lifecycle()`. Der Simulator startet `highest` bei jedem Aufruf erneut am Entry. Ein früheres Hoch kann daher beim späteren Trailing-Exit verloren gehen. 2. **Keine echten OHLC-Candles im Lifecycle.** `PaperCandle` wird nur aus `previous mid` und `current mid` gebaut. Intratick High/Low, Stop-Gaps und die Reihenfolge TP/Stop sind damit nicht realistisch. 3. **TP ist immer Vollausstieg.** Die Lifecycle-API kann keine Teilgröße schließen und den Rest offen halten. 4. **Break-even fehlt in der Paper-Pipeline.** 5. **Fester Trailing-Abstand von 1,20 %.** Nicht ATR-, R- oder Setup-abhängig. 6. **TP basiert auf `mid`, nicht auf dem tatsächlichen Entry-Fill.** `_open_lifecycle_position()` berechnet TP aus `mid`, obwohl `entry_fill_price` separat vorhanden ist. 7. **Dead-Fish wird in Ticks statt Zeit/Candle-Fenster gemessen.** Eine Änderung des Supervisor-Intervalls verändert die Strategie, ohne dass sich die Strategieversion ändert. 8. **MFE/MAE und PnL sind bei Short derzeit falsch oder nicht unterstützt.** --- ## 7. Minimale Patch-Empfehlungen ### Patch A – echte Feature-Snapshots **Neue Datei:** `src/market/v76_features.py` Side-effect-freie Funktionen: - `build_v76_feature_snapshot(md, coins, now_ms)` - `true_range_atr(candles, period=14)` - `rolling_vwap(candles)` - `retest_features(candles, fast_ma, atr)` - `rank_relative_strength(features)` - `compute_market_breadth(features)` Empfohlene Datenfenster: - 15m: Entry, Retest, Pullback, Wick/Body, VWAP - 1h: SMA/EMA, RSI, ATR, 1h/4h-Momentum - 4h: übergeordneter Trend - `metaAndAssetCtxs`: Funding, OI, 24h Notional Volume - L2: Spread, Tiefe, Slippage-Impact **Änderungen:** `src/tools/v76_paper_runtime.py` - `_context()`, `_anti_chase_context()` und `_swing_context()` nehmen einen echten Feature-Datensatz statt `mid/prev`-Proxies. - Fake-`CoinMarketContext` in `scan_once()` entfernen. - Bei fehlenden Candles/L2/Meta: fail closed mit konkreten `feature_missing_*`-Blockern. - `_confluence_gate()` darf bei unvollständigen echten Inputs nicht auf einen künstlichen lokalen Score zurückfallen. ### Patch B – v2 Entry-Gates **Änderungen:** - `src/strategies/v76_fee_aware_anti_chase.py` - optional `src/strategies/swing_trend_retest.py` Zusätzliche, datenbasierte Gates: - 1h und 4h Trend müssen für Long ausgerichtet sein - Pullback muss nach einem realen Rolling High erfolgt sein - Retest-Zone beispielsweise SMA20/VWAP/Breakout-Level ± ATR-Toleranz - bestätigter Reclaim durch abgeschlossene Candle - Anti-Chase gegen: - zu großen 15m-/1h-Return - zu große Distanz zu VWAP/SMA - schlechten Wick/Body - unbestätigtes Volume - keine Defaults, die automatisch Mindest-Breadth oder Top-RS erfüllen ### Patch C – 50-% TP1, Break-even und persistentes Trailing **Bevorzugt:** `src/execution/paper_lifecycle.py` um einen zustandsbasierten Manager ergänzen, statt die bestehende One-shot-Funktion weiter zu überladen. Persistierte Positionsfelder: - `initial_size` - `remaining_size` - `tp1_price` - `tp1_fraction="0.50"` - `tp1_filled` - `initial_stop_loss` - `active_stop_loss` - `break_even_armed` - `high_watermark` / `low_watermark` - `trailing_armed` - `realized_partial_pnl_usd` Reihenfolge pro echter Candle konservativ: 1. Stop prüfen 2. TP1 prüfen und 50 % schließen 3. Stop für Rest auf Break-even plus Kosten-Cushion 4. nach weiterer R-/ATR-Schwelle Trailing aktivieren 5. Dead-Fish/Max-Hold nur auf verbleibende Position **Änderungen:** `_close_lifecycle_positions()` und `_open_lifecycle_position()`. ### Patch D – paper-only Short-Research **Neue Strategie-ID** in `v76_paper_runtime.py`, ausschließlich: - `research=True` - `paper_trading=True` - `live_order_allowed=False` - `mainnet_signed_action=False` Wiederverwenden: - Regime- und Short-Chase-Logik aus `market_regime_shadow_trader.py` - Short-Preisplanung aus `trader_desk/decision.py` Vor Aktivierung: - `simulate_paper_lifecycle()` side-aware machen: - Short-Stop oberhalb Entry - Short-TP unterhalb Entry - PnL `entry-exit` - MFE/MAE invers - Short-Trailing über Low-Watermark - `_intent_from_position()` darf nicht länger immer `side="buy"` setzen. ### Patch E – Run-/Version-/Window-Attribution In alle Signal-, Entry-, Partial-Exit- und Exit-Zeilen aufnehmen: - `run_id` - `strategy_version="v76-v2"` - `feature_schema_version` - `config_version` oder Parameter-Hash - `window_id` - `window_start` - `window_end` - `market_data_interval` - `market_data_last_closed_candle_ts` - `entry_signal_id` - `position_id` `run_id` einmal beim Runtime-Start generieren und im State speichern. `window_id` aus Timeframe plus letzter abgeschlossener Candle ableiten. Exit-Zeilen müssen die Attribution aus der Position übernehmen und dürfen nicht die aktuelle Runtime-Version stillschweigend einsetzen. --- ## 8. Empfohlene Tests ### `tests/test_v76_paper_runtime_and_replay.py` Ergänzen: - echte Fake-Candles/L2/AssetCtxs statt nur `get_all_mids()` - fehlende Candles blockieren fail-closed - gemessene ATR/SMA/Volume/Spread erscheinen im Signaljournal - überdehnter Move ohne echten Retest wird blockiert - echter Pullback plus Reclaim wird akzeptiert - TP1 schließt genau 50 % - Restposition erhält Break-even-Stop - High-Watermark bleibt über mehrere Scans erhalten - Dead-Fish nutzt dokumentiertes Zeit-/Candle-Fenster - Signal, Entry und Exit behalten identische Run-/Version-/Window-IDs - bearish Short öffnet nur Research/Paper - Short-PnL, Stop, TP und Trailing sind richtungsrichtig ### `tests/test_paper_lifecycle.py` Ergänzen: - Long TP1 → 50-%-Restgröße - Long Break-even nach TP1 - persistentes Trailing mit vorherigem High-Watermark - Short Stop/TP/MFE/MAE - konservative Reihenfolge bei Stop und TP innerhalb derselben Candle - Gebühren und Slippage pro Teilfüllung ### Neue Datei `tests/test_v76_features.py` Deterministische Candle-Fixtures für: - True-Range-ATR - SMA/EMA/RSI/VWAP - Rolling High und Retest-Low - Reclaim - Volume Ratio - Relative-Strength-Ranking - Breadth - keine Look-ahead-Nutzung der noch offenen Candle --- ## Priorisierung 1. **Zuerst echte Features und fail-closed Datenqualität.** 2. **Dann Attribution vor neuen Experimenten**, damit v1/v2 nicht vermischt werden. 3. **Danach persistente Exit-State-Machine mit TP1/BE/Trailing.** 4. **Short erst nach side-aware Lifecycle**, strikt unter separater Research-ID. 5. Bestehende Journale nicht rückwirkend als v2 klassifizieren. ## Arbeitsstatus - Analysiert wurden v76-Runtime, Marktpfade, Long-/Short-Strategien, Lifecycle und relevante Tests. - Keine Dateien erstellt oder verändert. - Keine Runtime-/Bot-Prozesse gestartet oder gestoppt. - Repository war auf `feature/hyperliquid-v76-live-preview` sauber; `git diff --check` meldete keine Probleme.