# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/goldenpocket_rsi.py
# freqtrade strategy
from freqtrade.strategy.interface import IStrategy
from freqtrade.strategy import IntParameter, DecimalParameter
from pandas import DataFrame
import talib.abstract as ta
import numpy as np


class Github_remiotore_freqtrade__goldenpocket_rsi__20260111_210550(IStrategy):
    # Define minimal ROI
    minimal_roi = {
        "0": 0.1,  # Take profit at 10%
    }

    # Define stop loss
    stoploss = -0.05  # 5% stoploss

    # Trailing stop is disabled
    trailing_stop = False

    # Timeframe for analysis
    timeframe = '1h'

    # Custom hyperparameters
    fib_low_factor = DecimalParameter(0.618, 0.65, default=0.618, decimals=3, space='buy', optimize=True)

    def informative_pairs(self):
        # Only trading the pair being analyzed
        return []

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # RSI Calculation
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        # Identify the highest high and lowest low within a period
        dataframe['high_rolling'] = dataframe['high'].rolling(window=100).max()
        dataframe['low_rolling'] = dataframe['low'].rolling(window=100).min()

        # Calculate Fibonacci retracement levels
        dataframe['fib_618'] = dataframe['low_rolling'] + (dataframe['high_rolling'] - dataframe['low_rolling']) * 0.618
        dataframe['fib_650'] = dataframe['low_rolling'] + (dataframe['high_rolling'] - dataframe['low_rolling']) * 0.65

        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['close'] < dataframe['fib_618']) &  # Price is below Fib 0.618
                (dataframe['close'] > dataframe['fib_650']) &  # Price is above Fib 0.65
                (dataframe['rsi'] < 30)  # RSI is below 30
            ),
            'buy'] = 1
        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['close'] > dataframe['fib_618']) &  # Price is above Fib 0.618
                (dataframe['close'] < dataframe['fib_650']) &  # Price is below Fib 0.65
                (dataframe['rsi'] > 60)  # RSI is above 60
            ),
            'sell'] = 1
        return dataframe