# source: https://raw.githubusercontent.com/AndreyDXB/freqtrade-bot/878cb1a3b4d9feb27088f1f5755838e178146bf5/strategies/SmartStrategy.py
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib


class Github_AndreyDXB_freqtrade_bot__SmartStrategy__20260426_090458(IStrategy):
    INTERFACE_VERSION: int = 3

    minimal_roi = {
        "0": 0.008,
        "10": 0.005,
        "30": 0.003,
        "60": 0.001,
    }

    stoploss = -0.02
    timeframe = '5m'
    trailing_stop = False
    can_short = True
    use_exit_signal = True
    exit_profit_only = False
    ignore_roi_if_entry_signal = False
    max_open_trades = 6

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:

        dataframe['ema200'] = ta.EMA(dataframe, timeperiod=200)
        dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2)
        dataframe['bb_lower'] = bollinger['lower']
        dataframe['bb_middle'] = bollinger['mid']
        dataframe['bb_upper'] = bollinger['upper']

        dataframe['volume_mean'] = dataframe['volume'].rolling(window=20).mean()

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:

        dataframe.loc[
            (
                (dataframe['close'] > dataframe['ema200']) &
                (dataframe['rsi'] < 40) &
                (dataframe['close'] < dataframe['bb_lower']) &
                (dataframe['volume'] > dataframe['volume_mean'] * 0.5)
            ),
            'enter_long'
        ] = 1

        dataframe.loc[
            (
                (dataframe['close'] < dataframe['ema200']) &
                (dataframe['rsi'] > 60) &
                (dataframe['close'] > dataframe['bb_upper']) &
                (dataframe['volume'] > dataframe['volume_mean'] * 0.5)
            ),
            'enter_short'
        ] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:

        dataframe.loc[
            (
                (dataframe['close'] > dataframe['bb_middle']) |
                (dataframe['rsi'] > 70)
            ),
            'exit_long'
        ] = 1

        dataframe.loc[
            (
                (dataframe['close'] < dataframe['bb_middle']) |
                (dataframe['rsi'] < 30)
            ),
            'exit_short'
        ] = 1

        return dataframe
