from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta
from freqtrade.strategy import DecimalParameter, IntParameter

class FastGPT(IStrategy):
    # Parámetros de SMA
    sma_fast_period = IntParameter(5, 50, default=7, space='buy')
    sma_slow_period = IntParameter(10, 100, default=21, space='buy')

    # Parámetro de RSI
    rsi_period = IntParameter(7, 30, default=14, space='buy')
    rsi_low = IntParameter(10, 40, default=30, space='buy')
    rsi_high = IntParameter(60, 90, default=70, space='sell')

    # Parámetro de ROI (Retorno de la inversión)
    minimal_roi = {
        "0": 0.1,
    }

    # Optimal timeframe for the strategy
    timeframe = '1m'
    
    stoploss = -0.02

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Calculamos las SMA con los períodos optimizables
        dataframe['sma_fast'] = ta.SMA(dataframe, timeperiod=int(self.sma_fast_period.value))
        dataframe['sma_slow'] = ta.SMA(dataframe, timeperiod=int(self.sma_slow_period.value))

        # Calculamos el RSI con el período optimizable
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=int(self.rsi_period.value))

        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['sma_fast'] > dataframe['sma_slow']) &  # SMA fast crosses above SMA slow
                (dataframe['rsi'] > float(self.rsi_low.value)) &  # RSI is not in oversold condition
                (dataframe['rsi'] < float(self.rsi_high.value))    # RSI is not in overbought condition
            ),
            'buy'] = 1
        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['sma_fast'] < dataframe['sma_slow']) |  # SMA fast crosses below SMA slow
                (dataframe['rsi'] > float(self.rsi_high.value))    # RSI is in overbought condition
            ),
            'sell'] = 1
        return dataframe