---
name: signal-pipeline
description: >
  Technische Implementierung der Signal-Erkennung und Telegram-Zustellung.
  Nutze diesen Skill wenn du den Signal-Scanner einrichten, konfigurieren,
  starten oder debuggen willst. Auch wenn du neue Indikatoren hinzufügen
  oder das Signal-Format ändern willst.
---

# Signal-Pipeline — Technische Umsetzung

## Voraussetzungen

```bash
pip install ccxt pandas pandas-ta python-telegram-bot apscheduler pyyaml sqlalchemy
```

## Schritt-für-Schritt Setup

### 1. Konfiguration erstellen

Datei: `config/regeln.yaml` — Hier definierst du ALLE deine Trading-Regeln.
Das System liest diese Datei bei jedem Scan-Zyklus neu ein, damit Änderungen
sofort wirksam werden (wichtig für den Optimierungs-Loop).

### 2. Signal-Scanner starten

```bash
cd 01-signal-pipeline
python scripts/signal_scanner.py
```

Der Scanner läuft als Daemon und scannt basierend auf den Intervallen in der Config.

### 3. Ablauf im Code

```
signal_scanner.py
    │
    ├── Lädt regeln.yaml
    ├── Holt Marktdaten via ccxt/yfinance
    ├── Berechnet Indikatoren via pandas-ta
    ├── Prüft jede Regel gegen jedes Asset
    │
    ├── Bei Match:
    │   ├── Ruft risk_calculator.py auf
    │   │   ├── Berechnet ATR-basiertes Stop-Loss
    │   │   ├── Berechnet Take-Profit (basierend auf RRR-Ziel)
    │   │   ├── Berechnet Positionsgröße (% vom Portfolio)
    │   │   └── Empfiehlt Hebel (basierend auf Volatilität)
    │   │
    │   ├── Formatiert Signal-Nachricht
    │   ├── Sendet via telegram_bot.py
    │   └── Loggt Signal in Datenbank via signal_tracker.py
    │
    └── Wartet bis zum nächsten Scan-Intervall
```

### 4. Indikator-Berechnung

Alle Indikatoren werden mit pandas-ta berechnet. Referenz: `references/indikatoren.md`

```python
import pandas_ta as ta

# Beispiel: EMA-Kreuzung + RSI + Volumen
df.ta.ema(length=20, append=True)
df.ta.ema(length=50, append=True)
df.ta.rsi(length=14, append=True)
df.ta.atr(length=14, append=True)  # Für SL-Berechnung
```

### 5. Regel-Engine

Die Regel-Engine ist dynamisch: Sie liest `regeln.yaml` und baut daraus
Bedingungen zusammen. Neue Indikatoren können hinzugefügt werden ohne Code-Änderung.

```python
# Pseudo-Code der Regel-Engine
def check_rules(df, rules):
    signals = []
    for rule_set in rules:
        conditions_met = all(
            evaluate_condition(df, condition)
            for condition in rule_set['conditions']
        )
        if conditions_met:
            signals.append(build_signal(df, rule_set))
    return signals
```

### 6. Telegram-Integration

```python
# telegram_bot.py sendet formatierte Nachrichten
# Nur an autorisierte Chat-ID (Sicherheit!)
async def send_signal(signal: dict):
    message = format_signal_message(signal)
    await bot.send_message(chat_id=AUTHORIZED_CHAT_ID, text=message)
```

### 7. Signal-Tracking (für Backtest-Pipeline)

Jedes gesendete Signal wird mit folgenden Daten gespeichert:
- Signal-ID (eindeutig)
- Asset, Richtung, Einstiegspreis
- SL, TP1, TP2
- Empfohlener Hebel, Positionsgröße
- Zeitstempel
- Regeln die getriggert haben
- Status: `OFFEN` → `TP_HIT` | `SL_HIT` | `EXPIRED`

### 8. Hotreload der Regeln

Der Scanner prüft bei jedem Zyklus ob sich `regeln.yaml` geändert hat.
Wenn die Backtest-Pipeline neue optimierte Regeln schreibt, werden diese
automatisch beim nächsten Scan aktiv.

## Debugging

- Logs werden nach `logs/signal_scanner.log` geschrieben
- `--dry-run` Flag: Scanner läuft, sendet aber keine Telegram-Nachrichten
- `--backfill` Flag: Testet Regeln gegen historische Daten

## Konfigurierbare Parameter

| Parameter              | Wo                  | Default        |
|------------------------|---------------------|----------------|
| Scan-Intervall         | regeln.yaml         | 300s (5min)    |
| Assets                 | regeln.yaml         | BTC, ETH       |
| Indikator-Parameter    | regeln.yaml         | Je nach Regel  |
| Telegram Chat-ID       | shared/config/.env  | Pflichtfeld    |
| Telegram Bot-Token     | shared/config/.env  | Pflichtfeld    |
| Exchange               | regeln.yaml         | binance        |
| Portfolio-Größe        | shared/config/.env  | Pflichtfeld    |
