# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/SlopeV1.py
import datetime
import numpy as np
import freqtrade.vendor.qtpylib.indicators as qtpylib
from pandas import DataFrame
from datetime import datetime
from freqtrade.strategy import (BooleanParameter, CategoricalParameter, DecimalParameter, IntParameter, IStrategy)
from scipy.stats import linregress

class Github_remiotore_freqtrade__SlopeV1__20260111_210550(IStrategy):
    INTERFACE_VERSION = 3
    
    can_short = True
    timeframe = '30m'
    use_exit_signal = True
    exit_profit_only = True

    buy_params = {
        "window": 12,
    }

    sell_params = { }

    minimal_roi = {
        "0": 0.374,
        "180": 0.122,
        "274": 0.028,
        "847": 0
    }

    stoploss = -0.133

    trailing_stop = False

    max_open_trades = -1

    window = IntParameter(1, 30, space='buy', default=buy_params['window'])
    
    @property
    def plot_config(self):
        plot_config = {
            'main_plot' : {
            },
            'subplots' : {
                 '%' : {
                    'open_pct' : { 'color' : 'blue' },
                    'close_pct' : { 'color' : 'green' },
                    'volume_pct' : { 'color' : 'red' },
                    'slope' : { 'color' : 'orange' },
                }
            }
        }

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

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['open_pct']   = dataframe['open'].pct_change(self.window.value) * 100
        dataframe['close_pct']  = dataframe['close'].pct_change(self.window.value) * 100
        dataframe['volume_pct'] = dataframe['volume'].pct_change(self.window.value)
        dataframe['slope']      = dataframe['close'].rolling(window=self.window.value).apply(lambda x: linregress(range(len(x)), x).slope, raw=False)
        
        return dataframe

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


                (dataframe['slope']          > 0) &
                (dataframe['slope'].shift(1) < 0) &
                (dataframe['volume']         > 0)
            ),
        'enter_long'] = 1

        dataframe.loc[
            (


                (dataframe['slope']          < 0) &
                (dataframe['slope'].shift(1) > 0) &
                (dataframe['volume']         > 0)
            ),
        'enter_short'] = 1

        return dataframe

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


                (dataframe['slope']          < 0) &
                (dataframe['slope'].shift(1) > 0) &
                (dataframe['volume']         > 0)
            ),
        'exit_long'] = 1

        dataframe.loc[
            (


                (dataframe['slope']          > 0) &
                (dataframe['slope'].shift(1) < 0) &
                (dataframe['volume']         > 0)
            ),
        'exit_short'] = 1

        return dataframe