# source: https://raw.githubusercontent.com/huckhuck12/freqtrade-futures-lab/e0b7618794b70357e7f569439bd403d59bf92973/user_data/strategies/FutureBuyHoldV2.py
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import pandas as pd
from datetime import datetime


class Github_huckhuck12_freqtrade_futures_lab__FutureBuyHoldV2__20260116_080309(IStrategy):
    timeframe = '1m'
    max_open_trades = 3
    stake_amount = 100
    startup_candle_count = 100

    minimal_roi = {
        "0": 0.025,
        "60": 0.018,
        "180": 0.012,
        "360": 0.008,
        "720": 0.005
    }

    stoploss = -0.05
    trailing_stop = True
    trailing_stop_positive = 0.02
    trailing_stop_positive_offset = 0.028
    trailing_only_offset_is_reached = True

    order_types = {
        'entry': 'market',
        'exit': 'market',
        'stoploss': 'market',
        'stoploss_on_exchange': False
    }

    unfilledtimeout = {
        'entry': 30,
        'exit': 30,
        'unit': 'seconds'
    }

    leverage_config = {
        'BTC/USDT:USDT': 5.0,
        'ETH/USDT:USDT': 5.0,
        'SOL/USDT:USDT': 5.0,
        'XRP/USDT:USDT': 3.0,
        'DOGE/USDT:USDT': 3.0
    }

    def informative_pairs(self) -> list:
        return []

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        df = dataframe.copy()

        close = df['close'].values

        df['ema_20'] = pd.Series(close).ewm(span=20, adjust=False).mean().values
        df['ema_50'] = pd.Series(close).ewm(span=50, adjust=False).mean().values

        df['atr'] = self._calculate_atr(df, 14)

        return df

    def _calculate_atr(self, df: DataFrame, period: int) -> list:
        high = df['high'].values
        low = df['low'].values
        close = df['close'].values

        tr = []
        for i in range(len(close)):
            if i == 0:
                tr.append(high[i] - low[i])
            else:
                hl = high[i] - low[i]
                hc = abs(high[i] - close[i-1])
                lc = abs(low[i] - close[i-1])
                tr.append(max(hl, hc, lc))

        atr = pd.Series(tr).rolling(period).mean().values
        return atr

    def leverage(self, pair: str, current_time: datetime, current_rate: float,
                 current_profit: float, min_stops: float, max_stops: float,
                 current_time_rows: DataFrame, **kwargs) -> float:
        leverage = self.leverage_config.get(pair, 3.0)

        if current_profit < -0.03:
            leverage = leverage * 0.5
        elif current_profit < -0.02:
            leverage = leverage * 0.75

        return min(leverage, 5.0)

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        df = dataframe.copy()
        df['enter_long'] = 0

        if len(df) < self.startup_candle_count:
            return df

        uptrend = df['close'] > df['ema_50']

        df.loc[uptrend, 'enter_long'] = 1

        return df

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        df = dataframe.copy()
        df['exit'] = 0

        strong_down = df['close'] < df['ema_20']

        df.loc[strong_down, 'exit'] = 1

        return df

    def custom_stoploss(self, pair: str, current_time: datetime, current_rate: float,
                        current_profit: float, min_stops: float, max_stops: float,
                        current_time_rows: DataFrame, **kwargs) -> float:
        if current_profit > 0.02:
            return 0
        if current_profit > 0.01:
            return -0.02
        return -0.05
