import freqtrade.vendor.qtpylib.indicators as qtpylib
import talib.abstract as ta
from functools import reduce
from freqtrade.strategy import IStrategy
from freqtrade.strategy import (BooleanParameter, CategoricalParameter, DecimalParameter, RealParameter, IntParameter)
from pandas import DataFrame

class MomentumStrategy(IStrategy):
    INTERFACE_VERSION = 2

    # Configuración para Hyperopt
    minimal_roi = {"0": 0.10}
    stoploss = -0.03
    timeframe = '1m'
    
    
    macd_fast = IntParameter(12, 26, default=12, space='buy', optimize=True)
    macd_slow = IntParameter(26, 52, default=26, space='buy', optimize=True)
    macd_signal = IntParameter(9, 18, default=9, space='buy', optimize=True)
    rsi_buy = IntParameter(40, 60, default=50, space='buy', optimize=True)
    rsi_sell = IntParameter(40, 60, default=50, space='sell', optimize=True)


    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Asegurarse de que los parámetros de hyperopt se utilicen para los indicadores
        macd_fast = self.macd_fast.value
        macd_slow = self.macd_slow.value
        macd_signal = self.macd_signal.value
        
        # MACD
        macd = ta.MACD(dataframe,
                       fastperiod=macd_fast,
                       slowperiod=macd_slow,
                       signalperiod=macd_signal)
        dataframe['macd'] = macd['macd']
        dataframe['macdsignal'] = macd['macdsignal']
        dataframe['macdhist'] = macd['macdhist']
        
        # RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        
        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        conditions = []
        rsi_buy = self.rsi_buy.value
        
        # Buy when MACD crosses above signal line and RSI is above rsi_buy
        conditions.append(dataframe['macd'] > dataframe['macdsignal'])
        conditions.append(dataframe['rsi'] > rsi_buy)
        
        dataframe.loc[
            reduce(lambda x, y: x & y, conditions),
            'buy'] = 1
        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        conditions = []
        rsi_sell = self.rsi_sell.value
        
        # Sell when MACD crosses below signal line and RSI is below rsi_sell
        conditions.append(dataframe['macd'] < dataframe['macdsignal'])
        conditions.append(dataframe['rsi'] < rsi_sell)
        
        dataframe.loc[
            reduce(lambda x, y: x & y, conditions),
            'sell'] = 1
        return dataframe