# source: https://raw.githubusercontent.com/AndreyDXB/freqtrade-bot/26fc08fd5bcd9740f555c81d0e5e96d6ba2d233b/strategies/SmartStrategy.py
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta

class Github_AndreyDXB_freqtrade_bot__SmartStrategy__20260422_180211(IStrategy):
    
    INTERFACE_VERSION = 3
    timeframe = '5m'
    
    minimal_roi = {
        "0": 0.025,
        "60": 0.015,
        "120": 0.01,
        "180": 0.005
    }
    
    stoploss = -0.02
    
    trailing_stop = True
    trailing_stop_positive = 0.015
    trailing_stop_positive_offset = 0.02
    trailing_only_offset_is_reached = True
    
    can_short = True
    
    startup_candle_count = 50
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        
        macd = ta.MACD(dataframe)
        dataframe['macd'] = macd['macd']
        dataframe['macdsignal'] = macd['macdsignal']
        dataframe['macdhist'] = macd['macdhist']
        
        bollinger = ta.BBANDS(dataframe, timeperiod=20)
        dataframe['bb_upper'] = bollinger['upperband']
        dataframe['bb_lower'] = bollinger['lowerband']
        dataframe['bb_mid'] = bollinger['middleband']
        
        dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20)
        dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['atr'] = ta.ATR(dataframe, timeperiod=14)
        
        return dataframe
    
    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # ЛОНГ — явно бычий сигнал
        dataframe.loc[
            (
                (dataframe['rsi'] < 45) &
                (dataframe['macd'] > dataframe['macdsignal']) &
                (dataframe['close'] < dataframe['bb_mid']) &
                (dataframe['ema20'] > dataframe['ema50']) &
                (dataframe['volume'] > 0)
            ),
            'enter_long'
        ] = 1
        
        # ШОРТ — явно медвежий сигнал
        dataframe.loc[
            (
                (dataframe['rsi'] > 55) &
                (dataframe['macd'] < dataframe['macdsignal']) &
                (dataframe['close'] > dataframe['bb_mid']) &
                (dataframe['ema20'] < dataframe['ema50']) &
                (dataframe['volume'] > 0)
            ),
            'enter_short'
        ] = 1
        
        return dataframe
    
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Выход из лонга
        dataframe.loc[
            (
                (dataframe['rsi'] > 65) |
                (dataframe['close'] > dataframe['bb_upper']) |
                (dataframe['macd'] < dataframe['macdsignal'])
            ),
            'exit_long'
        ] = 1
        
        # Выход из шорта
        dataframe.loc[
            (
                (dataframe['rsi'] < 35) |
                (dataframe['close'] < dataframe['bb_lower']) |
                (dataframe['macd'] > dataframe['macdsignal'])
            ),
            'exit_short'
        ] = 1
        
        return dataframe
