# source: https://raw.githubusercontent.com/sicney/freqtrade/b59d6b5beea016cb5462a590ce9588db3f5d7a44/user_data/strategies/TrendVolatilityStrategy.py
# user_data/strategies/Github_sicney_freqtrade__TrendVolatilityStrategy__20250708_175405.py

from freqtrade.strategy import IStrategy
import ta  # Pure Python-Package, keine Systemlibs nötig

class Github_sicney_freqtrade__TrendVolatilityStrategy__20250708_175405(IStrategy):
    """
    Trendfolge-Strategie: EMA50/EMA200 Cross, Einstieg nur bei überdurchschnittlicher Volatilität (ATR).
    Kompatibel mit purem Python-Package 'ta'.
    """
    timeframe = '5m'
    minimal_roi = {
        "0": 0.02  # 2% Take Profit
    }
    stoploss = -0.03   # 3% Stoploss
    trailing_stop = True
    trailing_stop_positive = 0.01
    trailing_stop_positive_offset = 0.02
    trailing_only_offset_is_reached = True
    use_exit_signal = True
    exit_profit_only = False
    ignore_roi_if_entry_signal = False

    def populate_indicators(self, dataframe, metadata):
        # EMA Indikatoren
        dataframe['ema50'] = ta.trend.ema_indicator(close=dataframe['close'], window=50)
        dataframe['ema200'] = ta.trend.ema_indicator(close=dataframe['close'], window=200)
        # ATR + ATR-Mittelwert
        dataframe['atr'] = ta.volatility.average_true_range(
            high=dataframe['high'], low=dataframe['low'], close=dataframe['close'], window=14)
        dataframe['atr_mean'] = dataframe['atr'].rolling(window=100).mean()
        return dataframe

    def populate_buy_trend(self, dataframe, metadata):
        dataframe.loc[
            (
                (dataframe['ema50'] > dataframe['ema200']) &
                (dataframe['ema50'].shift(1) <= dataframe['ema200'].shift(1)) &
                (dataframe['atr'] > dataframe['atr_mean'])
            ),
            'buy'] = 1
        return dataframe

    def populate_sell_trend(self, dataframe, metadata):
        dataframe.loc[
            (
                (dataframe['ema50'] < dataframe['ema200']) |
                (dataframe['close'] > dataframe['close'].shift(1) * 1.02)
            ),
            'sell'] = 1
        return dataframe
