# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/Fengzi_v1.py
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import numpy as np
from freqtrade.persistence import Trade
from datetime import datetime
import freqtrade.vendor.qtpylib.indicators as qtpylib
import talib.abstract as ta

class Github_remiotore_freqtrade__Fengzi_v1__20260111_210550(IStrategy):
    stoploss = -0.99
    can_short = True

    trailing_stop = True
    trailing_only_offset_is_reached = True
    trailing_stop_positive = 0.05
    trailing_stop_positive_offset = 0.5  # Disabled / not configured

    timeframe = "5m"

    minimal_roi = {
        "0": 0.5,
        "30": 0.45,
        "60": 0.4,
        "120": 0.3,
        "240": 0.25,
        "480": 0.05
    }

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

    startup_candle_count: int = 50

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        length = 25
        dataframe['rsi_3'] = ta.RSI(dataframe, timeperiod=2)
        dataframe['rsi_6'] = ta.RSI(dataframe, timeperiod=4)

        dataframe['pivot_high'] = dataframe['high'][::-1].rolling(window=length, min_periods=1).max()[::-1]
        dataframe['pivot_high'] = dataframe['pivot_high'].where(dataframe['high'] == dataframe['pivot_high'], np.nan)

        dataframe['pivot_low'] = dataframe['low'][::-1].rolling(window=length, min_periods=1).min()[::-1]
        dataframe['pivot_low'] = dataframe['pivot_low'].where(dataframe['low'] == dataframe['pivot_low'], np.nan)

        dataframe['high_swing'] = dataframe['pivot_high'].shift(length // 2)
        dataframe['low_swing'] = dataframe['pivot_low'].shift(length // 2)




        dataframe['high_swing'] = dataframe['high_swing'].fillna(0)
        dataframe['low_swing'] = dataframe['low_swing'].fillna(0)


        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:

        dataframe['enter_long'] = 0
        dataframe['enter_short'] = 0

        dataframe.loc[
            (qtpylib.crossed_above(dataframe['rsi_3'], dataframe['rsi_6'])) &
            (dataframe['low_swing'] != 0) & 
            (dataframe['close'] > dataframe['low_swing'].shift(1)) &
            (dataframe['enter_long'].shift().fillna(0) == 0) &  # Перевірка на відсутність попередніх сигналів
            (dataframe['enter_short'].shift().fillna(0) == 0),  # Перевірка на відсутність попередніх сигналів
            'enter_long'
        ] = 1

        dataframe.loc[
            (qtpylib.crossed_below(dataframe['rsi_3'], dataframe['rsi_6'])) &
            (dataframe['high_swing'] != 0) & 
            (dataframe['close'] < dataframe['high_swing'].shift(1)) &
            (dataframe['enter_long'].shift().fillna(0) == 0) &  # Перевірка на відсутність попередніх сигналів
            (dataframe['enter_short'].shift().fillna(0) == 0),  # Перевірка на відсутність попередніх сигналів
            'enter_short'
        ] = 1

        return dataframe

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

        dataframe['exit_long'] = 0
        dataframe['exit_short'] = 0

        dataframe.loc[
            (qtpylib.crossed_above(dataframe['rsi_3'], dataframe['rsi_6'])) &
            (dataframe['low_swing'] != 0) & 
            (dataframe['close'] > dataframe['low_swing'].shift(1)) &
            (dataframe['enter_long'].shift().fillna(0) == 0) &  # Перевірка на відсутність попередніх сигналів
            (dataframe['enter_short'].shift().fillna(0) == 0),  # Перевірка на відсутність попередніх сигналів
            'exit_short'
        ] = 1

        dataframe.loc[
            (qtpylib.crossed_below(dataframe['rsi_3'], dataframe['rsi_6'])) &
            (dataframe['high_swing'] != 0) & 
            (dataframe['close'] < dataframe['high_swing'].shift(1)) &
            (dataframe['enter_long'].shift().fillna(0) == 0) &  # Перевірка на відсутність попередніх сигналів
            (dataframe['enter_short'].shift().fillna(0) == 0),  # Перевірка на відсутність попередніх сигналів
            'exit_long'
        ] = 1

        return dataframe
        
    def leverage(self, pair: str, current_time: datetime, current_rate: float,
                 proposed_leverage: float, max_leverage: float, side: str,
                 **kwargs) -> float:

        return 5    
