# source: https://raw.githubusercontent.com/gksdud6330/crytpo-auto-trading-bot/e754e3c873b4845c56f7fb752748330c48cd6369/freqtrade-bot/user_data/strategies/EMA_RSIStrategy.py
from freqtrade.strategy import IStrategy, merge_informative_pair
from pandas import DataFrame
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib

class Github_gksdud6330_crytpo_auto_trading_bot__EMA_RSIStrategy__20260118_144545(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = '5m'
    startup_candle_count = 200
    
    minimal_roi = {
        "0": 0.045,
        "60": 0.03,
        "180": 0.015,
        "360": 0
    }
    
    stoploss = -0.07
    
    trailing_stop = True
    trailing_stop_positive = 0.012
    trailing_stop_positive_offset = 0.035
    trailing_only_offset_is_reached = True
    
    def informative_pairs(self):
        whitelist = []
        if self.dp:
            whitelist = self.dp.current_whitelist()
        if not whitelist:
            whitelist = self.config.get('exchange', {}).get('pair_whitelist', [])
        return [(pair, '1h') for pair in whitelist]

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['ema_20'] = ta.EMA(dataframe, timeperiod=20)
        dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200)
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
        dataframe['volume_mean'] = dataframe['volume'].rolling(window=20).mean()

        if self.dp:
            informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='1h')
            informative['ema_50'] = ta.EMA(informative, timeperiod=50)
            informative['ema_200'] = ta.EMA(informative, timeperiod=200)
            dataframe = merge_informative_pair(dataframe, informative, self.timeframe, '1h', ffill=True)

        if 'ema_50_1h' not in dataframe:
            dataframe['ema_50_1h'] = dataframe['ema_50']
        if 'ema_200_1h' not in dataframe:
            dataframe['ema_200_1h'] = dataframe['ema_200']

        dataframe['ema_50_1h'] = dataframe['ema_50_1h'].fillna(dataframe['ema_50'])
        dataframe['ema_200_1h'] = dataframe['ema_200_1h'].fillna(dataframe['ema_200'])

        dataframe['trend_1h'] = dataframe['ema_50_1h'] >= (dataframe['ema_200_1h'] * 0.995)
        return dataframe
    
    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['trend_1h']) &
                (dataframe['ema_20'] > dataframe['ema_50']) &
                (dataframe['close'] > dataframe['ema_50']) &
                (dataframe['rsi'] > 40) &
                (dataframe['rsi'] < 70) &
                (dataframe['adx'] > 18) &
                (dataframe['volume'] > dataframe['volume_mean'] * 0.8)
            ),
            'enter_long'] = 1
        return dataframe
    
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (~dataframe['trend_1h']) |
                (dataframe['ema_20'] < dataframe['ema_50']) |
                (dataframe['rsi'] < 35) |
                (dataframe['close'] < dataframe['ema_50'])
            ) &
            (dataframe['volume'] > 0),
            'exit_long'] = 1
        return dataframe
