# source: https://raw.githubusercontent.com/gauthci/fretrade-farm/0acbeafcd0f41d23a45ea59f8bf9799108da60e6/bot2/user_data/AggressiveRSIStrategy.py
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta

class Github_gauthci_fretrade_farm__AggressiveRSIStrategy__20250515_133553(IStrategy):
    timeframe = '5m'

    minimal_roi = {
        "0": 0.04,
        "30": 0.02,
        "60": 0
    }

    stoploss = -0.05
    trailing_stop = True
    trailing_stop_positive = 0.02
    trailing_stop_positive_offset = 0.03
    trailing_only_offset_is_reached = True

    use_custom_stoploss = False
    process_only_new_candles = True
    use_exit_signal = True
    exit_profit_only = False
    ignore_roi_if_entry_signal = False

    minimal_volume = 1000

    # Hyperoptable parameters
    rsi_buy = 30
    rsi_sell = 70

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200)
        boll = ta.BBANDS(dataframe['close'], timeperiod=20)
        dataframe['bb_upperband'] = boll['upperband']
        dataframe['bb_middleband'] = boll['middleband']
        dataframe['bb_lowerband'] = boll['lowerband']
        dataframe['atr'] = ta.ATR(dataframe, timeperiod=14)
        dataframe['volatility'] = (dataframe['high'] - dataframe['low']) / dataframe['close']
        dataframe['sma_volume'] = dataframe['volume'].rolling(window=20).mean()
        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (dataframe['rsi'] < self.rsi_buy) &
            (dataframe['close'] < dataframe['bb_lowerband']) &
            (dataframe['ema_50'] > dataframe['ema_200']) &
            (dataframe['volume'] > self.minimal_volume) &
            (dataframe['volatility'] > 0.005),
            'buy'] = 1
        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['rsi'] > self.rsi_sell) |
                (dataframe['close'] > dataframe['bb_upperband']) |
                (dataframe['close'] < dataframe['ema_200'])
            ) &
            (dataframe['volume'] > self.minimal_volume),
            'sell'] = 1
        return dataframe

