# source: https://raw.githubusercontent.com/GoLukeEnviro/trading-hub/a20e8f66de687fa112152e48369055dd9fc806d6/freqtrade/bots/rsi/user_data/strategies/aggressive_scalp_futures_v1.py
"""
Github_GoLukeEnviro_trading_hub__aggressive_scalp_futures_v1__20260603_010621 — Aggressive RSI + BB Scalp, 15m Futures
Breitere Entries, kein Volume-Filter, enger SL, hohe Frequenz.
"""

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


class Github_GoLukeEnviro_trading_hub__aggressive_scalp_futures_v1__20260603_010621(IStrategy):

    INTERFACE_VERSION = 3
    timeframe = "15m"
    can_short = True

    # Hard stoploss -0.7%
    stoploss = -0.007

    # Aggressive ROI
    minimal_roi = {
        "0": 0.012,
        "20": 0.009,
        "40": 0.006,
        "90": 0.003,
    }

    # No trailing
    trailing_stop = False

    # Hyperopt params
    buy_rsi = IntParameter(30, 50, default=42, space="buy", optimize=True)
    sell_rsi = IntParameter(50, 75, default=65, space="sell", optimize=True)
    short_rsi = IntParameter(50, 70, default=58, space="buy", optimize=True)
    cover_rsi = IntParameter(25, 45, default=35, space="sell", optimize=True)
    bb_tolerance = DecimalParameter(0.995, 1.005, default=1.000, decimals=3, space="buy", optimize=True)

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)

        bb = ta.BBANDS(dataframe, timeperiod=20, nbdevup=2.0, nbdevdn=2.0)
        dataframe["bb_upper"] = bb["upperband"]
        dataframe["bb_lower"] = bb["lowerband"]

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        tol = float(self.bb_tolerance.value)

        # Long: RSI < 42 AND Close <= BB_lower (kein Volume-Filter)
        dataframe.loc[
            (dataframe["rsi"] < self.buy_rsi.value)
            & (dataframe["close"] <= dataframe["bb_lower"] * tol),
            ["enter_long", "enter_tag"],
        ] = (1, "rsi_bb_long")

        # Short: RSI > 58 AND Close >= BB_upper (kein Volume-Filter)
        dataframe.loc[
            (dataframe["rsi"] > self.short_rsi.value)
            & (dataframe["close"] >= dataframe["bb_upper"] * tol),
            ["enter_short", "enter_tag"],
        ] = (1, "rsi_bb_short")

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Long exit: RSI > sell_rsi
        dataframe.loc[
            (dataframe["rsi"] > self.sell_rsi.value),
            ["exit_long", "exit_tag"],
        ] = (1, "rsi_exit_long")

        # Short exit: RSI < cover_rsi
        dataframe.loc[
            (dataframe["rsi"] < self.cover_rsi.value),
            ["exit_short", "exit_tag"],
        ] = (1, "rsi_exit_short")

        return dataframe

    def leverage(self, pair, current_time, current_rate, proposed_leverage,
                 max_leverage, entry_tag, side, **kwargs) -> float:
        return 4.0
