# source: https://raw.githubusercontent.com/learn-dumboo24/adaptive-trend-strategy/7d031b1589e3c32870501c6f01c441d05a3a8071/strategies/AdaptiveTrendLeveraged.py
"""
Github_learn_dumboo24_adaptive_trend_strategy__AdaptiveTrendLeveraged__20260512_160735 — futures version with 2x leverage during confirmed trend.

Same logic as AdaptiveTrendStrategy but on Binance USDM Futures with isolated 2x.
Liquidation buffer: stop-loss at 25% means liquidation point at ~50% adverse,
which on 200d MA reclaim historically never triggered.
"""
from datetime import datetime
from functools import reduce

import pandas as pd
import talib.abstract as ta
from pandas import DataFrame

from freqtrade.persistence import Trade
from freqtrade.strategy import IStrategy, IntParameter, DecimalParameter


class Github_learn_dumboo24_adaptive_trend_strategy__AdaptiveTrendLeveraged__20260512_160735(IStrategy):
    INTERFACE_VERSION = 3

    timeframe = "1d"
    can_short = False
    process_only_new_candles = True

    # Wide stop — accounts for normal pullbacks. With 2x leverage, 25% adverse = ~50% capital loss.
    # Liquidation on isolated 2x ≈ 50% adverse, so SL of 25% gives buffer before liquidation.
    stoploss = -0.25
    minimal_roi = {"0": 100}
    trailing_stop = False

    use_exit_signal = True
    exit_profit_only = False
    startup_candle_count: int = 250

    leverage_mode = 3.0   # 3x on every confirmed trend entry

    ema_fast      = IntParameter(20, 60, default=50, space="buy")
    ema_slow      = IntParameter(150, 250, default=200, space="buy")
    adx_min       = IntParameter(15, 35, default=20, space="buy")
    rsi_max_entry = IntParameter(60, 80, default=70, space="buy")

    def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame:
        df["ema_fast"]   = ta.EMA(df, timeperiod=self.ema_fast.value)
        df["ema_slow"]   = ta.EMA(df, timeperiod=self.ema_slow.value)
        df["rsi"]        = ta.RSI(df, timeperiod=14)
        df["adx"]        = ta.ADX(df, timeperiod=14)
        df["atr"]        = ta.ATR(df, timeperiod=14)
        df["vol_sma_20"] = ta.SMA(df["volume"], timeperiod=20)
        df["vol_ratio"]  = df["volume"] / df["vol_sma_20"]
        macd = ta.MACD(df, fastperiod=12, slowperiod=26, signalperiod=9)
        df["macd"]        = macd["macd"]
        df["macd_signal"] = macd["macdsignal"]
        return df

    def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        # Same regime entry as spot version
        regime_in = (
            (df["close"] > df["ema_slow"]) &
            (df["close"].shift(1) <= df["ema_slow"].shift(1))
        )
        df.loc[regime_in, ["enter_long", "enter_tag"]] = (1, "regime_in_2x")
        return df

    def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        df.loc[
            df["close"] < df["ema_slow"],
            "exit_long"
        ] = 1
        return df

    def leverage(self, pair: str, current_time: datetime, current_rate: float,
                 proposed_leverage: float, max_leverage: float, entry_tag: str | None,
                 side: str, **kwargs) -> float:
        return min(self.leverage_mode, max_leverage)
