# Umsetzungsplan: Strategie-Drift-Erkennung für Master-Trader (B-S2) > Stand: 2026-07-11 > Ziel: Verhaltens-Änderungen eines Masters erkennen, BEVOR sie sich im Copy-PnL > niederschlagen. Die bestehende Auto-Pause (Copy-PnL-basiert) ist ein nachlaufender > Indikator — bei 95-¢-Tradern sieht man den Schaden erst nach mehreren Verlusten. > Verhalten läuft dem PnL voraus: Ein Wetter-Bot, der plötzlich Politik-Longshots > kauft, hat die Strategie gewechselt, lange bevor die Verluste messbar sind. > Modul: PolyTrader.Modules.CopyTrading (baut auf vorhandenem MasterTraderAnalyticsJob auf). --- ## 1. Der Verhaltens-Fingerprint Je Master werden zwei Fenster verglichen: **Referenz** (30 Tage bzw. die von Predictalytics gelieferte Baseline) vs. **aktuell** (7 Tage). Datenquelle: die Activity-/History-Daten, die der `MasterTraderAnalyticsJob` bereits lädt (`mod_copytrading_mt_history` + Data-API-Activity; für Preisband/Größe die Activity-Items — Felder existieren in den bereits geparsten JSONs). Fingerprint-Metriken (pure Klasse `Logic/TraderFingerprint.cs`, voll unit-getestet): | Metrik | Definition | Drift-Beispiel | |---|---|---| | `TradesPerWeek` | Trade-Frequenz | Bot-Betreiber wechselt von 40 auf 400/Woche | | `CategoryMix` | Einsatz-Anteil je Kategorie (Vektor) | Wetter-Bot kauft plötzlich Politik | | `PriceBandMix` | Einsatz-Anteil je Einstiegs-Preisband (10-¢-Bänder) | Favoriten-Halter kauft Longshots | | `MedianHoldHours` | Median Haltedauer (Kauf→Close/Resolution) | Halter wird Day-Trader | | `SellRatio` | Anteil aktiv verkaufter Positionen | „Stur-Halter" beginnt zu verkaufen | | `SizeP90Rel` | 90. Perzentil Positionsgröße relativ zur Referenz | Martingale-/Tilt-Muster | ### Drift-Score Pro Metrik eine normierte Abweichung (für Anteils-Vektoren: L1-Distanz / 2 → 0..1; für Skalare: `|akt − ref| / max(ref, ε)` gekappt auf 1). Gesamt: ``` DriftScore = gewichtete Summe (Default-Gewichte: CategoryMix 0.3, PriceBandMix 0.25, SellRatio 0.2, TradesPerWeek 0.1, MedianHoldHours 0.1, SizeP90Rel 0.05) ``` Schwellen (global in `CopyTradingState`, per PropertyGrid änderbar, mit [Description]): `DriftWarnScore` (Default 0.25) und `DriftPauseScore` (Default 0.5). **Mindeststichprobe:** unter 10 Trades im 7-Tage-Fenster keine Bewertung (Rauschen). ## 2. Aktionen bei Drift | Stufe | Bedingung | Aktion | |---|---|---| | Beobachten | Score < Warn | nichts; Score in UI-Spalte sichtbar | | **Warnen** | Warn ≤ Score < Pause | Threema-Meldung mit den 2 größten Abweichungen („Kategorie-Mix: Wetter 90→40 %, Politik 0→45 %"); Master in UI gelb | | **Neu-Trades pausieren** | Score ≥ Pause UND `AutoPauseEnabled` | NEUE BUYs dieses Masters aussetzen (`DriftPaused`-Flag auf TrackedTrader, Engine-Check im BUY-Pfad analog ExitPending); offene Positionen + SELL-Handling laufen normal weiter; Threema; Reaktivierung manuell | Bewusst: Drift pausiert nur **Neu-Käufe** — es verkauft nichts. Bestehende Positionen sind Sache der normalen Exit-Mechanik (Halter: Resolution). ## 3. Umsetzung ### Slice D-1: Pure Logik + Persistenz - `Logic/TraderFingerprint.cs`: `Compute(IEnumerable)` → Fingerprint; `Drift(reference, current)` → Score + Top-Abweichungen. Unit-Tests (Vektor-Distanzen, Mindeststichprobe, Rand: leere Referenz). - `TrackedTrader`: Felder `FingerprintBaselineJson` (Referenz, von Predictalytics importierbar ODER selbst aus 30 Tagen berechnet), `DriftScore`, `DriftPaused`, `DriftDetail` (Kurztext) + Migration. - `MasterTraderHistoryRecord` erweitern um die dafür nötigen Felder (EntryPrice-Band, Kategorie, Size, Haltedauer), sofern noch nicht vorhanden — beim History-Download mit befüllen (Daten sind in den API-Antworten enthalten). ### Slice D-2: Job-Integration - Im `MasterTraderAnalyticsJob` nach dem History-Download: Fingerprint aktuell (7 T) vs. Referenz (30 T bzw. BaselineJson) → Score, Aktionen gemäß Tabelle. - **Frequenz:** Der Job läuft 12-stündlich — für Drift zu träge. Leichten Stunden-Tick ergänzen (nur Fingerprint-Neuberechnung aus bereits geladenen History-Daten, KEINE zusätzlichen API-Calls; die 12-h-Läufe aktualisieren die Rohdaten). - Referenz-Handhabung: Baseline wird NICHT automatisch nachgezogen, solange eine Warnung/Pause aktiv ist (sonst „lernt" die Referenz die Drift). Nach manueller Entwarnung: Baseline auf aktuelles 30-T-Fenster zurücksetzen (Button in UI). ### Slice D-3: Engine + UI - Engine-BUY-Pfad: `DriftPaused`-Check (analog `IsActive`), TradeReasoning-Log. - `MastersTradersView`: Spalten DriftScore (mit Ampelfarbe) + DriftDetail; Kontextmenü „Drift entwarnen + Baseline zurücksetzen". ## 4. Akzeptanzkriterien 1. Unit-Tests: konstruierte Drift-Szenarien (Kategorie-Wechsel, Frequenz-Explosion, Longshot-Umstieg) erzeugen erwartete Scores; stabile Master bleiben < Warn. 2. Simulierter Kategorie-Wechsel in Testdaten führt zu `DriftPaused` + Engine verweigert Neu-BUY mit nachvollziehbarem Log. 3. Kein zusätzlicher Data-API-Traffic durch den Stunden-Tick (nur DB/RAM). 4. Threema-Meldungen enthalten die konkreten Top-Abweichungen, nicht nur den Score. ## 5. Abgrenzung - Ersetzt NICHT die PnL-Auto-Pause (Phase 3.3, bleibt) — Drift ist das Frühwarnsystem, PnL-Pause das Sicherheitsnetz. - Sniper-Metriken (Plan Phase 3.2, Median-Haltezeit via Activity-Pagination) sind ein Spezialfall dieses Fingerprints — bei Umsetzung zusammenlegen statt doppelt bauen.