# source: https://raw.githubusercontent.com/markelayan/hhec-dois-bull-manager/09fa8d07121e68880686b2f9b8d4201bca0dd669/1strategies1/backtest/TestStrategy.py
"""
Basic Futures Strategy Template
"""
import talib.abstract as ta
from freqtrade.strategy import IStrategy, informative
from pandas import DataFrame


class Github_markelayan_hhec_dois_bull_manager__TestStrategy__20250810_092830(IStrategy):
    """
    Basic futures trading strategy template
    """
    
    # Strategy settings
    INTERFACE_VERSION = 3
    can_short = True
    
    # ROI table
    minimal_roi = {
        "0": 0.05,
        "30": 0.03,
        "60": 0.01,
        "120": 0
    }
    
    # Stoploss
    stoploss = -0.02
    
    # Timeframe
    timeframe = '1h'
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Populate indicators
        """
        # RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        
        # MACD
        macd = ta.MACD(dataframe)
        dataframe['macd'] = macd['macd']
        dataframe['macdsignal'] = macd['macdsignal']
        dataframe['macdhist'] = macd['macdhist']
        
        # Bollinger Bands
        bollinger = ta.BBANDS(dataframe, timeperiod=20)
        dataframe['bb_lowerband'] = bollinger['lowerband']
        dataframe['bb_middleband'] = bollinger['middleband']
        dataframe['bb_upperband'] = bollinger['upperband']
        
        return dataframe
    
    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Entry trend logic
        """
        # Long entry conditions
        dataframe.loc[
            (
                (dataframe['rsi'] < 30) &
                (dataframe['macd'] > dataframe['macdsignal']) &
                (dataframe['close'] < dataframe['bb_lowerband'])
            ),
            'enter_long'] = 1
        
        # Short entry conditions (for futures)
        dataframe.loc[
            (
                (dataframe['rsi'] > 70) &
                (dataframe['macd'] < dataframe['macdsignal']) &
                (dataframe['close'] > dataframe['bb_upperband'])
            ),
            'enter_short'] = 1
        
        return dataframe
    
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Exit trend logic
        """
        # Long exit conditions
        dataframe.loc[
            (
                (dataframe['rsi'] > 70) |
                (dataframe['macd'] < dataframe['macdsignal'])
            ),
            'exit_long'] = 1
        
        # Short exit conditions
        dataframe.loc[
            (
                (dataframe['rsi'] < 30) |
                (dataframe['macd'] > dataframe['macdsignal'])
            ),
            'exit_short'] = 1
        
        return dataframe
