# T1 / T2 Strategy-Profile-Plan — Konfigurationsentwurf **Stand:** 2026-05-16 · Branch `master` · HEAD `7e5cf6e` **Status:** **Plan**, keine Implementation. Read-only Vorschlag basierend auf FULLSTACK-ARCH-ERROR-REVIEW + heutiger Live-Beobachtung. --- ## 1. Executive Summary T1 und T2 sollen **echte unabhängige Strategie-Profile** werden statt nur DB-Klassifizierungs-Labels (Backlog-Pin STRATEGY-GROUP-CONFIG-1 + Architektur-Review von heute). Profil-Philosophie: ```text T1 Standard → Conservative Core Trading Mid-/Large-Caps, längere Holds, mean reversion + trend follow Geringe Drawdown-Akzeptanz, Stabilität vor Maximum Profit T2 Momentum → Aggressive Pump-/Listing-/Breakout-Hunting Volatilere Symbols, kürzere Holds, tighteres SL aber höhere TP-Multiples, Time-Stop greift früh ``` Die Profile **konkurrieren nicht** — sie laufen parallel auf getrennten Cash-Buckets, mit klaren Symbol- und Strategie-Filtern. Das Ziel ist **unkorrelierter PnL**: wenn T1 in einem BEAR-Range schläft, soll T2 durch frühere Breakouts/Listings noch produktiv sein. --- ## 2. Was T1 und T2 heute tatsächlich machen (Ist-Stand) ### T1 heute | Aspekt | Wert | |---|---| | Trigger | Legacy `main.run_scan_cycle` Score-Pipeline | | Score-Formel | `0.7 × tech_score + 0.2 × news_sentiment + 0.1 × fear_greed` | | Threshold | Dynamisch (heute BEAR: 7.5, im Testnet-Cap auf 6.0 begrenzt) | | Symbol-Filter | Binance USDT-Universe, min 1M USD 24h-Volume, max 0.30 % spread | | Position-Sizing | RiskManager via ATR-Stop-Distance, Cash-Tier-basiert | | SL/TP | 2× ATR Stop, 4× ATR TP (Default, regime-modifiziert) | | Trailing | Standard (PositionManager: News/Breakeven/96h-Hard-Exit) | | Max-Positions | Regime-abhängig (BEAR 5, BULL 8, default 10) | | DCA | Aktiv (3% Gap unter SL → Nachkauf statt Verkauf) | | Hold-Dauer | offen — bis SL/TP/Trailing/Time-Stop | | **DB-Label** | `t1_core` | ### T2 heute | Aspekt | Wert | |---|---| | Trigger | 3 separate Pfade in main.py: (a) web-channel signals, (b) telegram-bot-channel signals, (c) T3-forwarded large-cap signals | | Score | nicht eigenständig — übernimmt das aus dem Signal-Quell-Datensatz | | Position-Sizing | gleicher PositionSizer wie T1, eine `tranche_1` (~40 % des Score-Tier-Vorgabewerts) | | SL/TP | aus dem Signal übernommen (web/telegram-channel-eigen oder Default) | | Hold-Dauer | offen, gleiche Exit-Regeln wie T1 | | **DB-Label** | `t2_pump_dump` | → T2 ist heute **kein eigenständiges Profil**, sondern nur eine DB-Markierung für "Signal kommt nicht aus dem Score-Scanner". Die Risk-/Exit-Logik ist identisch zu T1. → MS-Runner-Trades wären heute auch `t1_core` (siehe Architektur-Review). --- ## 3. Design-Prinzipien für die neuen Profile 1. **Eindeutige Trennung pro Symbol-Cluster**: T1 darf nicht denselben Trade wie T2 öffnen (kein Doppel-Kauf). 2. **Eindeutige Trennung pro Strategie-ID**: `breakout` und `volatility_sweep` → T2. `trend_follow`, `mean_reversion`, `vwap_mean_reversion` → T1. (Operator-Entscheidung im Review-PDF) 3. **Eigene Cash-Quote**: T1 nimmt nicht alles Cash. T2 muss eine eigene Sub-Bucket-Cash-Tasche haben, sonst wird das aggressive Profil vom konservativen ausgehungert. 4. **Eigene Risk-Profile**: T1 = breitere SL (mehr Rauschen tolerieren), niedrigerer TP-Multiple T2 = tighter SL (Pumps reversieren brutal), höherer TP-Multiple, zwingender Time-Stop 5. **Unterschiedliche Symbol-Filter**: T1 = Large-Cap-Universe (Top-50 USDT-Pairs, min 5M USD 24h-Vol) T2 = Mid-Cap + neue Listings, min 500K USD 24h-Vol, neu gelistete Pairs explizit erlaubt 6. **Trotzdem gemeinsame Mainnet-Boundary**: BINANCE_TESTNET=true bleibt für beide. Keine Mainnet-Aktivierung in dieser Phase. --- ## 4. T1 Standard — Konfigurationsvorschlag ### 4.1 Trigger-Quellen | Quelle | Aktiv für T1? | Notiz | |---|---|---| | Legacy `run_scan_cycle` Score-Pipeline | ja | unverändert | | MS-Runner `trend_follow` Strategy | ja | nach STRATEGY-GROUP-CONTRACT-1 | | MS-Runner `mean_reversion` Strategy | ja | counter-trend, RSI-extremes | | MS-Runner `vwap_mean_reversion` Strategy | ja | VWAP-Range-Trading | | Web-Channel-Signals | nein | bleiben T2 | | Telegram-Bot-Channel-Signals | nein | bleiben T2 | | T3-forwarded Signals | nein | bleiben T2 | | MS-Runner `breakout` | nein | T2 | | MS-Runner `volatility_sweep` | nein | T2 | ### 4.2 Symbol-Filter T1 ```text universe = Binance USDT-Spot min_24h_volume = 5_000_000 USDT (heute 1M, T1 zieht auf Mid-Cap+) max_spread_bps = 30 (0.30 %, wie heute) exclude_leveraged = true exclude_stables = true (N7.2 safety_check) whitelist_caps = Top-50 nach 30d-Volumen exclude_t2_symbols_when_t2_holds_them = true (Doppel-Buy-Verbot) ``` ### 4.3 Position-Sizing T1 ```text cash_quote = 70 % # T1 bekommt 70 % des frei verfügbaren Cash max_positions = 6 # regime-modifiziert (BEAR -1, BULL +2) tier_high_pct = 6 % # Score >= 9.0 → 6 % der T1-Cash-Quote tier_mid_pct = 4 % # Score >= 8.0 → 4 % tier_low_pct = 2 % # Score >= 7.0 → 2 % min_position_usd = 50 max_position_usd = 600 ``` ### 4.4 Risk-Profile T1 ```text sl_atr_mult = 2.0 # konservativ tp_atr_mult = 4.0 # 1:2 R:R use_fixed_tp = true trailing = aktiv (Default Trailing-Step) breakeven_after_h = 60 # nach 60h auf BE ziehen time_stop_h = 96 # Hard-Exit nach 96h dca_enabled = true dca_max_gap_pct = 3 # Nachkauf bis 3 % unter SL dca_max_count = 2 ``` ### 4.5 Score-Threshold T1 ```text threshold_BULL = 7.0 threshold_BEAR = 7.5 threshold_RANGE = 7.5 threshold_HIGH_VOL = 8.0 # höher gegen Whipsaws testnet_cap = 6.0 # heute: erlaubt mehr Trades zum Beobachten ``` ### 4.6 GUI-Ansicht T1 - KPI-Card "T1 Standard" zeigt: open_positions, exposure_usdt, realized_pnl_7d, unrealized_pnl, hit_rate_7d - TradeLog-Filter "T1 Standard" zeigt nur konservative Closes --- ## 5. T2 Momentum/Pump — Konfigurationsvorschlag ### 5.1 Trigger-Quellen | Quelle | Aktiv für T2? | Notiz | |---|---|---| | MS-Runner `breakout` Strategy | ja | Volatility-Breakout | | MS-Runner `volatility_sweep` Strategy | ja | High-Vol Hunt | | Web-Channel-Signals | ja | pump-typische external feeds | | Telegram-Bot-Channel-Signals | ja | dito | | T3-forwarded large-cap-Pump Signals | ja | Tier3-Bridge | | Legacy Score-Pipeline | nein | bleibt T1 | | MS-Runner trend_follow / mean_rev / vwap | nein | T1 | ### 5.2 Symbol-Filter T2 ```text universe = Binance USDT-Spot + neue Listings (last 30 days) min_24h_volume = 500_000 USDT (mehr Risiko, mehr Symbols zugänglich) max_spread_bps = 80 (0.8 % — bei Pumps oft hoch) exclude_leveraged = true exclude_stables = true new_listing_priority = true # neue Pairs +1 Score-Boost exclude_t1_symbols_when_t1_holds_them = true ``` ### 5.3 Position-Sizing T2 ```text cash_quote = 25 % # T2 bekommt 25 % des frei verfügbaren Cash max_positions = 10 # mehr Streuung, kleinere Tickets tier_high_pct = 4 % # kleinere Max-Tickets gegen Volatilität tier_mid_pct = 2.5 % tier_low_pct = 1.5 % min_position_usd = 30 max_position_usd = 250 ``` (Restliche 5 % = Buffer / Reserve, nicht handelbar.) ### 5.4 Risk-Profile T2 ```text sl_atr_mult = 1.5 # tighter — Pumps reverse hart tp_atr_mult = 6.0 # höher — Pumps brauchen 1:4 R:R um lohnend zu sein use_fixed_tp = false # Trailing TP, weil Peaks unvorhersehbar trailing = aggressiv (Step 0.5 statt 1.0) breakeven_after_min = 30 # früh auf BE time_stop_h = 6 # Pumps sind in 4-6h durch — danach raus dca_enabled = false # KEIN DCA bei T2 (gegen Pump-Reversal-Trap) ``` ### 5.5 Score-Threshold T2 T2 nutzt nicht denselben Score-Filter wie T1, sondern eigene Strategy-Confidence: ```text confidence_min_BULL = 0.60 confidence_min_BEAR = 0.70 # höher gegen False-Pumps in BEAR confidence_min_HIGH_VOL = 0.55 # erwartet, dafür sind wir hier testnet_cap = 0.45 # heute: erlaubt mehr Trades ``` ### 5.6 Anti-Patterns für T2 - **Mean-Reversion-Symbole NIE als T2** — counter-trend ist T1-Domain - **Stablecoins NIE** (N7.2) - **Leveraged-Tokens NIE** (Risiko) - **Symbole mit > 80% 1h-Drawdown** → time-stop sofort ### 5.7 GUI-Ansicht T2 - KPI-Card "T2 Pump & Dump" eigene Farbe (amber, schon heute), eigene Metriken: open_positions, exposure, time_to_exit_avg, peak_to_close_pct - Optional: separate "Active Pumps"-Widget mit Live-Tickern der offenen T2-Trades --- ## 6. Konfigurations-Modell (technisch) ### 6.1 Wo lebt die Config Heute: alles via env-Vars + Hardcoded in `config/settings.py`. Vorgeschlagen: pro-Profil-JSON in `.env-runtime/strategy_profiles.json` (neue Datei). ```json { "schema_version": 1, "profiles": { "t1_core": { "active": true, "cash_quote_pct": 0.70, "max_positions": 6, "tier_pcts": {"high": 0.06, "mid": 0.04, "low": 0.02}, "min_position_usd": 50, "max_position_usd": 600, "risk": { "sl_atr_mult": 2.0, "tp_atr_mult": 4.0, "use_fixed_tp": true, "breakeven_after_h": 60, "time_stop_h": 96 }, "dca": {"enabled": true, "max_gap_pct": 3, "max_count": 2}, "thresholds": {"BULL": 7.0, "BEAR": 7.5, "RANGE": 7.5, "HIGH_VOL": 8.0}, "universe": { "min_24h_volume_usd": 5000000, "max_spread_bps": 30, "include_strategies": [ "legacy_scanner", "trend_follow", "mean_reversion", "vwap_mean_reversion" ] } }, "t2_pump_dump": { "active": true, "cash_quote_pct": 0.25, "max_positions": 10, "tier_pcts": {"high": 0.04, "mid": 0.025, "low": 0.015}, "min_position_usd": 30, "max_position_usd": 250, "risk": { "sl_atr_mult": 1.5, "tp_atr_mult": 6.0, "use_fixed_tp": false, "trailing_aggression": "high", "breakeven_after_min": 30, "time_stop_h": 6 }, "dca": {"enabled": false}, "thresholds": {"BULL": 0.60, "BEAR": 0.70, "HIGH_VOL": 0.55}, "universe": { "min_24h_volume_usd": 500000, "max_spread_bps": 80, "new_listing_boost": 1.0, "include_strategies": [ "breakout", "volatility_sweep", "web_channel", "telegram_bot_channel", "t3_forwarded" ] } } } } ``` ### 6.2 Reload-Strategie - Bot liest beim Startup, cached in-memory - `apply_profile_testnet` CommandBus-Command (existiert schon!) ist der Hot-Reload-Mechanismus → Operator kann via GUI Profil ändern, Worker setzt das via Postgres, Bot reload-t bei nächstem Cycle - Audit-Trail: jede Profile-Änderung schreibt in `commands` + `bot_statuses` ### 6.3 Hard-Boundary - KEINE Mainnet-Aktivierung - KEINE Solana-Execution (T3 bleibt Signal-Layer) - KEINE Backtest-getriebene Tuning-Automatik (Phase STRATEGY-GROUP-CONFIG-1e wäre dafür da, separat) --- ## 7. Risk-Budget & Caps ### 7.1 Gesamt-Bucket ```text Bot-Cash insgesamt: 100 % T1 Cash-Quote: 70 % T2 Cash-Quote: 25 % Reserve (nicht handelbar): 5 % Maximaler Drawdown pro Tag pro Profil: T1: 3 % → bot pause + Telegram-Alert T2: 6 % → bot pause + Telegram-Alert Maximaler Drawdown gesamt: Bot: 8 % → SafetyCheck.shutdown_for_today ``` ### 7.2 Per-Trade-Loss-Cap ```text T1 single-trade max-loss: 1.5 % der T1-Quote (= 1.05 % des Gesamtkapitals) T2 single-trade max-loss: 2.0 % der T2-Quote (= 0.50 % des Gesamtkapitals) ``` ### 7.3 Tagesziel (aspirational, nicht hart) ```text T1 target_daily_pnl: +0.5 % (winrate-getrieben, 6-12 Trades) T2 target_daily_pnl: +1.5 % (high R:R, 2-5 Trades, viele -1.5 % Stops) ``` --- ## 8. Konflikt-Resolution: T1 + T2 sehen dasselbe Symbol Szenario: SOL/USDT zeigt sowohl einen `trend_follow`-Score (→ T1) als auch einen `breakout`-Signal (→ T2). **Regel**: das Profil, das **als erstes** ein Signal generiert, bekommt den Symbol-Lock. Das andere überspringt. Das gilt pro-Tick. Wenn die Position später geschlossen wird, ist das Symbol wieder frei für beide Profile. Heute schon implementiert: `execute_buy(allow_add=False)` verhindert Doppel-Käufe — was fehlt: explizite Symbol-Lock-Map zwischen den Pipelines, damit T1 nicht im selben Cycle blockiert, wenn T2 erst nach T1 entscheidet. --- ## 9. Roll-Out-Plan (Phasen) | Phase | Aufgabe | Dauer | Vorbedingung | |---|---|---|---| | **STRATEGY-GROUP-CONTRACT-1** | strategy_id → strategy_group Mapping (Architektur-Review-Fix) | ~30 min Code + Test + Cutover | — | | **STRATEGY-PROFILE-1a** | Plan-Review dieses Dokuments mit Operator | 1 Diskussion | Contract-1 done | | **STRATEGY-PROFILE-1b** | Config-Schema-Datei `strategy_profiles.json` + Loader im Bot | ~50 LoC | 1a abgenommen | | **STRATEGY-PROFILE-1c** | T1/T2-Pfad-Trennung in main.py + multi_strategy_runner.py (Symbol-Lock, Cash-Quote-Split) | ~100 LoC | 1b | | **STRATEGY-PROFILE-1d** | Risk-Engine-Adaption (SL/TP/Time-Stop pro Profil) | ~80 LoC | 1c | | **STRATEGY-PROFILE-1e** | GUI Read-only Profile-Ansicht (zusätzlich zu KPI-Cards) | ~120 LoC PHP | 1c | | **STRATEGY-PROFILE-1f** | GUI Edit + Audit (apply_profile_testnet erweitern) | ~150 LoC | 1e | | **STRATEGY-PROFILE-1g** | Kontrolliertes Testnet-Rollout (24-72h passive Beobachtung) | 3 Tage | 1d | | **STRATEGY-PROFILE-1h** | Backtest pro Profil (braucht OHLCV-CACHE) | separat | 1g + OHLCV-CACHE | ### Hard-Gates (durable) - `MULTI_STRATEGY_DRY_RUN=false` bleibt **NO-GO** bis 1d done und verifiziert - Mainnet bleibt **NO-GO** bis 1g done und 30 Tage stabil - Jede Phase einzeln getestet, einzelnes Operator-GO --- ## 10. Verifikations-Tests | Test | Was | Pass-Kriterium | |---|---|---| | `test_profile_schema_loads` | strategy_profiles.json wird ohne Fehler geladen | pass | | `test_t1_only_runs_t1_strategies` | MS-Runner aktiviert nur `trend_follow`/`mean_rev`/`vwap` wenn Profil-Filter T1 setzt | pass | | `test_t2_only_runs_t2_strategies` | dito für `breakout`/`volatility_sweep` | pass | | `test_symbol_lock_prevents_doublebuy` | T1 hält BTC → T2-Signal auf BTC wird skipped | pass | | `test_cash_quote_split_respected` | Bot hat 1000 USDT cash, T1 Buy-Limit 700, T2 Buy-Limit 250 | pass | | `test_t1_sl_is_2x_atr` | T1-Position SL gemessen ist 2 × ATR | pass | | `test_t2_sl_is_1_5x_atr` | T2-Position SL ist 1.5 × ATR | pass | | `test_t2_no_dca` | T2-Symbol unter SL → execute_sell (kein Nachkauf) | pass | | `test_t2_time_stop_6h` | T2-Position offen seit 6h → forced exit | pass | | `test_daily_dd_pause_t1` | T1 Drawdown 3 % → t1-buy blocked, alerts | pass | --- ## 11. Risiken | Risiko | Schwere | Mitigation | |---|---|---| | Cash-Quote-Split aushungert ein Profil | mittel | Reserve-Bucket + monatliche Operator-Review der Quoten | | Symbol-Lock-Race | niedrig | atomic claim in shared state | | Profile-Config-Edit ohne Audit | mittel | apply_profile_testnet via CommandBus erzwingt Audit | | Backtest fehlt → Parameter-Drift | mittel | STRATEGY-PROFILE-1h vor jeder Param-Änderung | | T2 verbrennt Cash schneller als T1 erholt sich | hoch | Daily-Drawdown-Pause-Gate (6 % T2 → freeze) | | Operator versteht 2 Profile nicht | mittel | GUI muss Profile klar trennen + Tooltips | --- ## 12. Out of Scope - Echte Solana-Execution (separate Phase) - Mainnet (Boundary) - Auto-Tuning / ML-driven config (Phase 1h, eigenständig) - T3 als echte Strategy-Group (heute nur reserved value, T3-Subsystem forwarded an T2) - Multi-Exchange (heute nur Binance Spot) --- ## 13. STOP Plan-Dokument. Keine Implementation. Operator-Decisions vor Phase 1a: 1. Bestätigt das Mapping `trend_follow/mean_rev/vwap → T1`, `breakout/volatility_sweep → T2`? 2. Bestätigt die Cash-Quote 70/25/5? 3. Bestätigt die Risk-Differenzierung (T1 SL 2×ATR, T2 SL 1.5×ATR, T2 kein DCA, T2 time_stop_h=6)? 4. Bestätigt Hot-Reload via `apply_profile_testnet`-Command (statt Bot-Restart pro Config-Change)? 5. Bestätigt Reihenfolge der Phasen 1a-1h? Boundaries: 0× Code, 0× DB, 0× Container, 0× Mainnet, 0× MS-Live-Aktivierung.