#!/usr/bin/env python3
"""
Stratégie de Scalping 1 Minute - Ultra Leverage
Capture de petits mouvements avec leverage 500x-1000x
"""

import pandas as pd
import numpy as np
from typing import Optional, Dict
from dataclasses import dataclass
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


@dataclass
class ScalpingSignal:
    """Signal de scalping"""
    symbol: str
    side: str  # 'LONG' ou 'SHORT'
    entry_price: float
    stop_loss: float
    take_profit: float
    leverage: int
    confidence: float  # 0-100
    reason: str


class Scalping1MStrategy:
    """
    Stratégie de scalping haute fréquence sur 1 minute

    Principe:
    - Leverage très élevé (500x-1000x)
    - SL ultra serré (0.02%-0.05%)
    - TP petit mais régulier (0.05%-0.15%)
    - Win rate élevé nécessaire (70%+)

    Signaux:
    - EMA crossovers rapides (3/7/15)
    - Momentum fort sur dernières bougies
    - Volume spike confirmation
    - RSI extrêmes pour contre-tendance
    """

    def __init__(
        self,
        leverage: int = 1000,
        sl_pct: float = 0.03,  # 0.03% SL = 30% perte avec 1000x
        tp_pct: float = 0.10,   # 0.10% TP = 100% profit avec 1000x
        ema_fast: int = 3,
        ema_mid: int = 7,
        ema_slow: int = 15,
        rsi_period: int = 7,
        volume_spike_threshold: float = 1.5
    ):
        self.leverage = leverage
        self.sl_pct = sl_pct / 100  # Convertir en décimal
        self.tp_pct = tp_pct / 100

        # Indicateurs
        self.ema_fast = ema_fast
        self.ema_mid = ema_mid
        self.ema_slow = ema_slow
        self.rsi_period = rsi_period
        self.volume_spike_threshold = volume_spike_threshold

    def analyze(self, symbol: str, df: pd.DataFrame) -> Optional[ScalpingSignal]:
        """
        Analyse et génère signal de scalping

        Args:
            symbol: Symbole du token
            df: DataFrame avec OHLCV

        Returns:
            ScalpingSignal ou None
        """
        if len(df) < 50:
            return None

        # Calculer indicateurs
        df = self._calculate_indicators(df)

        current_price = df['close'].iloc[-1]

        # Détecter signal LONG
        long_signal = self._detect_long_signal(df)
        if long_signal:
            confidence = long_signal['confidence']

            # SL/TP ultra serrés
            sl_price = current_price * (1 - self.sl_pct)
            tp_price = current_price * (1 + self.tp_pct)

            return ScalpingSignal(
                symbol=symbol,
                side='LONG',
                entry_price=current_price,
                stop_loss=sl_price,
                take_profit=tp_price,
                leverage=self.leverage,
                confidence=confidence,
                reason=long_signal['reason']
            )

        # Détecter signal SHORT
        short_signal = self._detect_short_signal(df)
        if short_signal:
            confidence = short_signal['confidence']

            # SL/TP ultra serrés
            sl_price = current_price * (1 + self.sl_pct)
            tp_price = current_price * (1 - self.tp_pct)

            return ScalpingSignal(
                symbol=symbol,
                side='SHORT',
                entry_price=current_price,
                stop_loss=sl_price,
                take_profit=tp_price,
                leverage=self.leverage,
                confidence=confidence,
                reason=short_signal['reason']
            )

        return None

    def _calculate_indicators(self, df: pd.DataFrame) -> pd.DataFrame:
        """Calcule tous les indicateurs nécessaires"""
        df = df.copy()

        # EMAs rapides
        df['ema_fast'] = df['close'].ewm(span=self.ema_fast, adjust=False).mean()
        df['ema_mid'] = df['close'].ewm(span=self.ema_mid, adjust=False).mean()
        df['ema_slow'] = df['close'].ewm(span=self.ema_slow, adjust=False).mean()

        # RSI court
        delta = df['close'].diff()
        gain = (delta.where(delta > 0, 0)).rolling(window=self.rsi_period).mean()
        loss = (-delta.where(delta < 0, 0)).rolling(window=self.rsi_period).mean()
        rs = gain / loss
        df['rsi'] = 100 - (100 / (1 + rs))

        # Volume ratio
        df['volume_ma'] = df['volume'].rolling(window=20).mean()
        df['volume_ratio'] = df['volume'] / df['volume_ma']

        # Momentum (changement de prix sur 3 bougies)
        df['momentum_3'] = (df['close'] / df['close'].shift(3) - 1) * 100

        return df

    def _detect_long_signal(self, df: pd.DataFrame) -> Optional[Dict]:
        """Détecte signal LONG scalping"""
        last = df.iloc[-1]
        prev = df.iloc[-2]

        confidence = 0
        reasons = []

        # 1. EMA Fast crossover Mid (haussier)
        if last['ema_fast'] > last['ema_mid'] and prev['ema_fast'] <= prev['ema_mid']:
            confidence += 30
            reasons.append("EMA fast cross above mid")

        # 2. Prix au-dessus EMA slow (tendance haussière)
        if last['close'] > last['ema_slow']:
            confidence += 15
            reasons.append("Above EMA slow")

        # 3. Momentum positif
        if last['momentum_3'] > 0:
            confidence += 20
            reasons.append(f"Momentum +{last['momentum_3']:.2f}%")

        # 4. Volume spike
        if last['volume_ratio'] > self.volume_spike_threshold:
            confidence += 20
            reasons.append(f"Volume spike {last['volume_ratio']:.1f}x")

        # 5. RSI dans zone favorable (30-70)
        if 30 < last['rsi'] < 70:
            confidence += 15
            reasons.append(f"RSI {last['rsi']:.0f}")

        # Signal valide si confidence >= 60%
        if confidence >= 60:
            return {
                'confidence': confidence,
                'reason': ' | '.join(reasons)
            }

        return None

    def _detect_short_signal(self, df: pd.DataFrame) -> Optional[Dict]:
        """Détecte signal SHORT scalping"""
        last = df.iloc[-1]
        prev = df.iloc[-2]

        confidence = 0
        reasons = []

        # 1. EMA Fast crossover Mid (baissier)
        if last['ema_fast'] < last['ema_mid'] and prev['ema_fast'] >= prev['ema_mid']:
            confidence += 30
            reasons.append("EMA fast cross below mid")

        # 2. Prix en-dessous EMA slow (tendance baissière)
        if last['close'] < last['ema_slow']:
            confidence += 15
            reasons.append("Below EMA slow")

        # 3. Momentum négatif
        if last['momentum_3'] < 0:
            confidence += 20
            reasons.append(f"Momentum {last['momentum_3']:.2f}%")

        # 4. Volume spike
        if last['volume_ratio'] > self.volume_spike_threshold:
            confidence += 20
            reasons.append(f"Volume spike {last['volume_ratio']:.1f}x")

        # 5. RSI dans zone favorable (30-70)
        if 30 < last['rsi'] < 70:
            confidence += 15
            reasons.append(f"RSI {last['rsi']:.0f}")

        # Signal valide si confidence >= 60%
        if confidence >= 60:
            return {
                'confidence': confidence,
                'reason': ' | '.join(reasons)
            }

        return None

    def get_optimizable_params(self) -> Dict:
        """Retourne paramètres optimisables"""
        return {
            'leverage': (500, 1000),
            'sl_pct': (0.02, 0.05),  # 0.02%-0.05%
            'tp_pct': (0.05, 0.15),  # 0.05%-0.15%
            'ema_fast': (3, 5),
            'ema_mid': (7, 10),
            'ema_slow': (15, 21),
            'rsi_period': (5, 10),
            'volume_spike_threshold': (1.3, 2.0)
        }


if __name__ == '__main__':
    print("🎯 Stratégie de Scalping 1 Minute")
    print("=" * 80)
    print()
    print("Caractéristiques:")
    print("  • Leverage: 500x - 1000x")
    print("  • SL: 0.02% - 0.05% (ultra serré)")
    print("  • TP: 0.05% - 0.15% (petit mais régulier)")
    print("  • Win rate visé: 70%+")
    print()
    print("Indicateurs:")
    print("  • EMA 3/7/15 (crossovers rapides)")
    print("  • Momentum 3 bougies")
    print("  • Volume spike")
    print("  • RSI 7 périodes")
    print()
    print("Exemple avec leverage 1000x:")
    print("  • TP 0.10% prix = +100% capital")
    print("  • SL 0.03% prix = -30% capital")
    print("  • Ratio Risk/Reward: 3.3:1")
    print()

    strategy = Scalping1MStrategy(leverage=1000, sl_pct=0.03, tp_pct=0.10)
    print(f"Paramètres optimisables: {len(strategy.get_optimizable_params())}")
