# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/ema_9_18.py
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta

class Github_remiotore_freqtrade__ema_9_18__20260111_210550(IStrategy):
    # Strategy interface version
    INTERFACE_VERSION = 3
    
    # Enable shorting for futures trading
    can_short = True
    
    # Timeframe for the strategy
    timeframe = '4h'
    
    # Risk management parameters
    stoploss = -0.035  # Initial stop loss at 3.5%
    trailing_stop = True
    trailing_stop_positive = 0.035  # Trail price by 3.5%
    trailing_only_offset_is_reached = False  # Trailing stop activates immediately
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Define the technical indicators used in the strategy.
        """
        dataframe['ema9'] = ta.EMA(dataframe['close'], timeperiod=9)
        dataframe['ema18'] = ta.EMA(dataframe['close'], timeperiod=18)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Define entry signals for long and short positions.
        """
        # Long entry: EMA9 crosses above EMA18
        dataframe.loc[
            (dataframe['ema9'] > dataframe['ema18']) &
            (dataframe['ema9'].shift(1) <= dataframe['ema18'].shift(1)),
            'enter_long'] = 1

        # Short entry: EMA9 crosses below EMA18
        dataframe.loc[
            (dataframe['ema9'] < dataframe['ema18']) &
            (dataframe['ema9'].shift(1) >= dataframe['ema18'].shift(1)),
            'enter_short'] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Define exit signals for long and short positions.
        """
        # Exit long: EMA9 crosses below EMA18
        dataframe.loc[
            (dataframe['ema9'] < dataframe['ema18']) &
            (dataframe['ema9'].shift(1) >= dataframe['ema18'].shift(1)),
            'exit_long'] = 1

        # Exit short: EMA9 crosses above EMA18
        dataframe.loc[
            (dataframe['ema9'] > dataframe['ema18']) &
            (dataframe['ema9'].shift(1) <= dataframe['ema18'].shift(1)),
            'exit_short'] = 1

        return dataframe
