# source: https://raw.githubusercontent.com/NatoG93/pochteca_public/dd3887eb7a252edc12446937cbab928e4bcce565/user_data/strategies/HyperOptTeamplate.py
"""
HyperOptTemplate.py
=================
Dentro de la carpeta user_data/strategies

docker compose run --rm freqtrade hyperopt --strategy Pochteca_Hyper --hyperopt-loss SharpeHyperOptLoss --timerange 20251001- --timeframe 15m -e 50 --spaces buy

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

class Github_NatoG93_pochteca_public__HyperOptTeamplate__20260120_214241(IStrategy):
    # 1. Definir el Timeframe
    timeframe = '15m'

    # 2. DEFINIR LAS "PERILLAS" (Parámetros)
    # IntParameter(mínimo, máximo, default, space)
    buy_ema_fast = IntParameter(5, 15, default=9, space='buy')
    buy_ema_slow = IntParameter(20, 45, default=21, space='buy')
    
    # DecimalParameter(mínimo, máximo, default, space)
    buy_rsi_low = IntParameter(20, 40, default=30, space='buy')
    
    # CategoricalParameter: Elige entre opciones específicas
    buy_trigger = CategoricalParameter(['rsi', 'ema', 'both'], default='ema', space='buy')

    # Parámetros de Salida (Opcional optimizarlos también)
    sell_rsi_high = IntParameter(70, 90, default=80, space='sell')

    # Configuración base
    minimal_roi = {"0": 0.10}
    stoploss = -0.10
    trailing_stop = True

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # AQUÍ CALCULAMOS TODO LO QUE LOS PARÁMETROS PODRÍAN NECESITAR
        # Si vas a optimizar periodos de EMA, calculamos un rango o los valores base
        dataframe['ema_fast'] = ta.EMA(dataframe, timeperiod=self.buy_ema_fast.value)
        dataframe['ema_slow'] = ta.EMA(dataframe, timeperiod=self.buy_ema_slow.value)
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200)
        
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # USAMOS .value PARA QUE FREQTRADE SEPA QUÉ PROBAR
        dataframe.loc[
            (
                (dataframe['ema_fast'] > dataframe['ema_slow']) &
                (dataframe['rsi'] > self.buy_rsi_low.value) &
                (dataframe['close'] > dataframe['ema_200'])
            ),
            'enter_long'] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['rsi'] > self.sell_rsi_high.value)
            ),
            'exit_long'] = 1
        return dataframe
