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

class SimpleScalper1M(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = "1m"
    startup_candle_count: int = 50

    minimal_roi = {"0": 0.01}
    stoploss = -0.02
    trailing_stop = True
    trailing_stop_positive = 0.005
    trailing_stop_positive_offset = 0.01
    trailing_only_offset_is_reached = True

    use_exit_signal = True
    exit_profit_only = False
    ignore_roi_if_entry_signal = True

    # Hiperparámetros optimizables
    rsi_period = IntParameter(5, 20, default=14, space="buy")
    ema_period = IntParameter(10, 50, default=20, space="buy")
    bbands_period = IntParameter(10, 30, default=20, space="buy")
    bbands_dev = DecimalParameter(1.0, 3.0, default=2.0, space="buy")

    def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame:
        df['rsi'] = ta.RSI(df, timeperiod=self.rsi_period.value)
        df['ema'] = ta.EMA(df, timeperiod=self.ema_period.value)
        bb_upper, bb_middle, bb_lower = ta.BBANDS(
            df['close'],
            timeperiod=self.bbands_period.value,
            nbdevup=self.bbands_dev.value,
            nbdevdn=self.bbands_dev.value,
            matype=0
        )
        df['bb_upper'] = bb_upper
        df['bb_middle'] = bb_middle
        df['bb_lower'] = bb_lower

        return df

    def populate_buy_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        df.loc[
            (
                (df['rsi'] < 30) &
                (df['close'] < df['bb_lower']) &
                (df['close'] > df['ema'])
            ),
            'buy'
        ] = 1
        return df

    def populate_sell_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        df.loc[
            (
                (df['rsi'] > 70) |
                (df['close'] > df['bb_upper']) |
                (df['close'] < df['ema'])
            ),
            'sell'
        ] = 1
        return df
