""" AdaptiveTrendLeveraged — 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 AdaptiveTrendLeveraged(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)