# source: https://raw.githubusercontent.com/syuraj/freq-test/12243c6e3ebf9a245cca012b5d5e35b9e49aae91/user_data/strategies/Alligator.py
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta
from freqtrade.persistence import Trade
from freqtrade.strategy import (BooleanParameter, CategoricalParameter, stoploss_from_open, DecimalParameter,
                                IntParameter, IStrategy, informative, merge_informative_pair)

class Github_syuraj_freq_test__Alligator__20240129_002406(IStrategy):
    INTERFACE_VERSION: int = 3

    # Define strategy parameters
    minimal_roi = {"0": 0.01}
    stoploss = -0.10
    timeframe = '5m'
    startup_candle_count: int = 30

    can_short = True
    use_entry_signal = True
    use_exit_signal = True
    exit_profit_only = False
    ignore_roi_if_entry_signal = False

    protect_optimize = True

    slowma = IntParameter(11, 15, default=13, space="buy")
    mediumma = IntParameter(6, 10, default=8, space="buy")
    fastma = IntParameter(3, 7, default=5, space="buy")
    adxPeriod = IntParameter(12, 16, default=14, space="buy")
    adxfilter = IntParameter(15, 30, default=20, space="buy")

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['ma_slow'] = dataframe['close'].rolling(window=self.slowma.value).mean()
        dataframe['ma_medium'] = dataframe['close'].rolling(window=self.mediumma.value).mean()
        dataframe['ma_fast'] = dataframe['close'].rolling(window=self.fastma.value).mean()
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=self.adxPeriod.value)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Generate buy signal when ma_fast crosses above ma_slow
        dataframe.loc[
            (dataframe['close'] > dataframe['ma_fast']) &
            (dataframe['ma_fast'] > dataframe['ma_medium']) &
            (dataframe['ma_medium'] > dataframe['ma_slow']) &
            (dataframe['adx'] > self.adxfilter.value),
            'enter_long'
        ] = 1

        # Generate sell signal when ma_fast crosses below ma_slow
        dataframe.loc[
            (dataframe['close'] < dataframe['ma_fast']) &
            (dataframe['ma_fast'] < dataframe['ma_medium']) &
            (dataframe['ma_medium'] < dataframe['ma_slow']) &
            (dataframe['adx'] > self.adxfilter.value),
            'enter_short'
        ] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Generate exit long when price closes below ma_medium
        dataframe.loc[
            (dataframe['close'] < dataframe['ma_medium']),
            'exit_long'
        ] = 1

        # Generate exit short when price above ma_medium
        dataframe.loc[
            (dataframe['close'] > dataframe['ma_medium']),
            'exit_short'
        ] = 1

        return dataframe
