# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/PivotsBBEMAStrategy.py
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta
import numpy as np

class Github_remiotore_freqtrade__PivotsBBEMAStrategy__20260111_210550(IStrategy):
    """
    Strategie mit Pivot Points, Bollinger Bands und EMAs, einschließlich Erweiterungen.
    """
    # ROI und Stoploss
    minimal_roi = {"0": 0.10}
    stoploss = -0.10
    timeframe = '1h'

    # Parameter für Indikatoren
    pivot_lookback = 15  # Anzahl der Pivot-Punkte
    bb_length = 20  # Länge der Bollinger-Bänder
    bb_stddev = 2.0  # Standardabweichung für BB
    ema_lengths = [20, 50, 100, 200]  # EMA-Zeiträume
    ema_fast = 20  # Schnelle EMA für Crossovers
    ema_slow = 50  # Langsame EMA für Crossovers

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Berechnet Pivot Points, Bollinger Bands, EMAs und Fibonacci-Pivot-Levels.
        """
        # Pivot Points (lokale Hochs und Tiefs)
        dataframe['pivot_high'] = dataframe['high'].rolling(window=self.pivot_lookback).max()
        dataframe['pivot_low'] = dataframe['low'].rolling(window=self.pivot_lookback).min()

        # Fibonacci Pivot Points
        dataframe['fib_r1'] = dataframe['pivot_high'] + (dataframe['pivot_high'] - dataframe['pivot_low']) * 0.382
        dataframe['fib_s1'] = dataframe['pivot_low'] - (dataframe['pivot_high'] - dataframe['pivot_low']) * 0.382

        # Bollinger Bands
        dataframe['bb_middle'] = ta.SMA(dataframe['close'], timeperiod=self.bb_length)
        dataframe['bb_upper'] = dataframe['bb_middle'] + (ta.STDDEV(dataframe['close'], timeperiod=self.bb_length) * self.bb_stddev)
        dataframe['bb_lower'] = dataframe['bb_middle'] - (ta.STDDEV(dataframe['close'], timeperiod=self.bb_length) * self.bb_stddev)

        # EMAs
        for length in self.ema_lengths:
            dataframe[f'ema_{length}'] = ta.EMA(dataframe['close'], timeperiod=length)

        # EMA Crossovers
        dataframe['ema_fast'] = ta.EMA(dataframe['close'], timeperiod=self.ema_fast)
        dataframe['ema_slow'] = ta.EMA(dataframe['close'], timeperiod=self.ema_slow)
        dataframe['ema_crossover'] = np.where(dataframe['ema_fast'] > dataframe['ema_slow'], 1, -1)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Generiert Kauf-Signale basierend auf erweiterten Indikatoren.
        """
        dataframe.loc[
            (dataframe['close'] > dataframe['pivot_high']) &  # Breakout über Pivot High
            (dataframe['close'] > dataframe['bb_upper']) &  # Bollinger Band Breakout
            (dataframe['ema_crossover'] > 0) &  # EMA-Trend bullisch (Crossover)
            (dataframe['close'] > dataframe['ema_20']) &  # Kurs oberhalb EMA 20
            (dataframe['close'] > dataframe['fib_r1']),  # Kurs über Fibonacci R1
            'enter_long'
        ] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Generiert Verkaufs-Signale basierend auf erweiterten Indikatoren.
        """
        dataframe.loc[
            (dataframe['close'] < dataframe['pivot_low']) &  # Breakout unter Pivot Low
            (dataframe['close'] < dataframe['bb_lower']) &  # Bollinger Band Breakout
            (dataframe['ema_crossover'] < 0) &  # EMA-Trend bärisch (Crossover)
            (dataframe['close'] < dataframe['ema_20']) &  # Kurs unterhalb EMA 20
            (dataframe['close'] < dataframe['fib_s1']),  # Kurs unter Fibonacci S1
            'exit_long'
        ] = 1

        return dataframe
