# source: https://raw.githubusercontent.com/Hans1361/MyTrade56/1f9d73651bc407cf69ebaff3a89179a5841fd54c/user_data/strategies/NostalgiaForInfinityX5_Aggressive.py
from freqtrade.strategy import IStrategy, IntParameter, RealParameter
from pandas import DataFrame
import talib.abstract as ta
import pandas as pd

class Github_Hans1361_MyTrade56__NostalgiaForInfinityX5_Aggressive__20250619_202852(IStrategy):
    INTERFACE_VERSION = 3
    minimal_roi = {
        "0": 0.05,
        "10": 0.03,
        "20": 0.02,
        "30": 0.01
    }
    stoploss = -0.03
    timeframe = '5m'
    
    # More aggressive hyperopt parameters
    buy_rsi = IntParameter(20, 80, default=50, space="buy")
    sell_rsi = IntParameter(60, 90, default=75, space="sell")
    ema_short = IntParameter(3, 15, default=8, space="buy")
    ema_long = IntParameter(10, 50, default=21, space="buy")
    volume_threshold = RealParameter(0.8, 1.5, default=1.0, space="buy")
    adx_threshold = IntParameter(15, 35, default=20, space="buy")

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        dataframe['ema_short'] = ta.EMA(dataframe, timeperiod=self.ema_short.value)
        dataframe['ema_long'] = ta.EMA(dataframe, timeperiod=self.ema_long.value)
        dataframe['volume_sma'] = ta.SMA(dataframe['volume'], timeperiod=20)
        dataframe['volume_ratio'] = dataframe['volume'] / dataframe['volume_sma']
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
        
        # Bollinger Bands
        bollinger = ta.BBANDS(dataframe, timeperiod=20, nbdevup=2.0, nbdevdn=2.0)
        dataframe['bb_upper'] = bollinger['upperband']
        dataframe['bb_lower'] = bollinger['lowerband']
        dataframe['bb_middle'] = bollinger['middleband']
        
        # MACD
        macd = ta.MACD(dataframe)
        dataframe['macd'] = macd['macd']
        dataframe['macdsignal'] = macd['macdsignal']
        dataframe['macdhist'] = macd['macdhist']
        
        # Additional indicators for more signals
        dataframe['sma_20'] = ta.SMA(dataframe, timeperiod=20)
        dataframe['sma_50'] = ta.SMA(dataframe, timeperiod=50)
        
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                # More relaxed RSI condition
                (dataframe['rsi'] < self.buy_rsi.value) &
                
                # Price above short EMA (uptrend)
                (dataframe['close'] > dataframe['ema_short']) &
                
                # Short EMA above long EMA (trend confirmation)
                (dataframe['ema_short'] > dataframe['ema_long']) &
                
                # More relaxed volume condition
                (dataframe['volume_ratio'] > self.volume_threshold.value) &
                
                # More relaxed ADX condition
                (dataframe['adx'] > self.adx_threshold.value) &
                
                # Price not at extreme upper Bollinger Band
                (dataframe['close'] < dataframe['bb_upper'] * 0.99) &
                
                # MACD histogram positive or improving
                ((dataframe['macdhist'] > 0) | (dataframe['macdhist'] > dataframe['macdhist'].shift(1))) &
                
                # Additional trend confirmation
                (dataframe['close'] > dataframe['sma_20']) &
                (dataframe['sma_20'] > dataframe['sma_50'])
            ),
            'enter_long'
        ] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                # RSI overbought
                (dataframe['rsi'] > self.sell_rsi.value) |
                
                # Price below short EMA
                (dataframe['close'] < dataframe['ema_short']) |
                
                # Price at upper Bollinger Band
                (dataframe['close'] > dataframe['bb_upper'] * 0.98) |
                
                # MACD histogram negative
                (dataframe['macdhist'] < 0) |
                
                # Price below SMA 20
                (dataframe['close'] < dataframe['sma_20'])
            ),
            'exit_long'
        ] = 1
        return dataframe 