# source: https://raw.githubusercontent.com/Chris6622/class-AdvancedFuturesSwingStrategy-IStrategy-/786cfa2c323feab11c072706b06cb9e4243af820/user_data/strategies/BreakoutVolumeStrategy.py
from freqtrade.strategy import IStrategy, IntParameter, DecimalParameter
import pandas as pd

class Github_Chris6622_class_AdvancedFuturesSwingStrategy_IStrategy___BreakoutVolumeStrategy__20260208_084829(IStrategy):
    breakout_lookback = IntParameter(10, 50, default=20, space="buy", optimize=True)
    volume_multiplier = DecimalParameter(1.1, 3.0, decimals=2, default=1.5, space="buy", optimize=True)
    stoploss_param = DecimalParameter(-0.10, -0.01, decimals=3, default=-0.02, space="sell", optimize=True)
    roi_param = DecimalParameter(0.02, 0.10, decimals=3, default=0.04, space="sell", optimize=True)

    timeframe = '4h'
    startup_candle_count: int = 50
    stoploss = -0.02
    minimal_roi = {"0": 0.04}
    can_short = True

    def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
        length = int(self.breakout_lookback.value)
        dataframe['highest_high'] = dataframe['high'].rolling(window=length, min_periods=1).max().shift(1)
        dataframe['lowest_low'] = dataframe['low'].rolling(window=length, min_periods=1).min().shift(1)
        dataframe['avg_volume'] = dataframe['volume'].rolling(window=length, min_periods=1).mean().shift(1)
        dataframe['volume_spike'] = dataframe['volume'] > (self.volume_multiplier.value * dataframe['avg_volume'])
        dataframe['is_breakout'] = dataframe['close'] > dataframe['highest_high']
        dataframe['is_breakdown'] = dataframe['close'] < dataframe['lowest_low']
        dataframe['long_condition'] = dataframe['is_breakout'] & dataframe['volume_spike']
        dataframe['short_condition'] = dataframe['is_breakdown'] & dataframe['volume_spike']
        return dataframe

    def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
        dataframe.loc[dataframe['long_condition'], 'enter_long'] = 1
        dataframe.loc[dataframe['short_condition'], 'enter_short'] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
        return dataframe

    def custom_stoploss(self, pair: str, trade, current_time, current_rate, current_profit, **kwargs):
        return float(self.stoploss_param.value)

    def custom_exit(self, pair: str, trade, current_time, current_rate, current_profit, **kwargs):
        roi = float(self.roi_param.value)
        if trade.is_short:
            if current_profit <= -roi:
                return "take_profit"
        else:
            if current_profit >= roi:
                return "take_profit"
        return None