# source: https://raw.githubusercontent.com/plcacs/Harmonizing_ml_results/7c866e63ef59a5355e43f9333c4b0811a37bb9dc/ManyTypes4py_benchmarks/HiTyper_1st_run/strategy_test_v3_251abc.py
from datetime import datetime
import talib.abstract as ta
from pandas import DataFrame
import freqtrade.vendor.qtpylib.indicators as qtpylib
from freqtrade.persistence import Trade
from freqtrade.strategy import BooleanParameter, DecimalParameter, IntParameter, IStrategy, RealParameter

class Github_plcacs_Harmonizing_ml_results__strategy_test_v3_251abc__20250811_003639(IStrategy):
    """
    Strategy used by tests freqtrade bot.
    Please do not modify this strategy, it's  intended for internal use only.
    Please look at the SampleStrategy in the user_data/strategy directory
    or strategy repository https://github.com/freqtrade/freqtrade-strategies
    for samples and inspiration.
    """
    INTERFACE_VERSION = 3
    minimal_roi = {'40': 0.0, '30': 0.01, '20': 0.02, '0': 0.04}
    max_open_trades = -1
    stoploss = -0.1
    timeframe = '5m'
    order_types = {'entry': 'limit', 'exit': 'limit', 'stoploss': 'limit', 'stoploss_on_exchange': False}
    startup_candle_count = 20
    order_time_in_force = {'entry': 'gtc', 'exit': 'gtc'}
    buy_params = {'buy_rsi': 35}
    sell_params = {'sell_rsi': 74, 'sell_minusdi': 0.4}
    buy_rsi = IntParameter([0, 50], default=30, space='buy')
    buy_plusdi = RealParameter(low=0, high=1, default=0.5, space='buy')
    sell_rsi = IntParameter(low=50, high=100, default=70, space='sell')
    sell_minusdi = DecimalParameter(low=0, high=1, default=0.5001, decimals=3, space='sell', load=False)
    protection_enabled = BooleanParameter(default=True)
    protection_cooldown_lookback = IntParameter([0, 50], default=30)

    @property
    def protections(self) -> Union[list, str, int]:
        prot = []
        if self.protection_enabled.value:
            prot = self.config.get('_strategy_protections', {})
        return prot
    bot_started = False

    def bot_start(self) -> None:
        self.bot_started = True

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

    def populate_indicators(self, dataframe: pandas.DataFrame, metadata: Union[dict, pandas.DataFrame]) -> pandas.DataFrame:
        dataframe['adx'] = ta.ADX(dataframe)
        macd = ta.MACD(dataframe)
        dataframe['macd'] = macd['macd']
        dataframe['macdsignal'] = macd['macdsignal']
        dataframe['macdhist'] = macd['macdhist']
        dataframe['minus_di'] = ta.MINUS_DI(dataframe)
        dataframe['plus_di'] = ta.PLUS_DI(dataframe)
        dataframe['rsi'] = ta.RSI(dataframe)
        stoch_fast = ta.STOCHF(dataframe)
        dataframe['fastd'] = stoch_fast['fastd']
        dataframe['fastk'] = stoch_fast['fastk']
        bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2)
        dataframe['bb_lowerband'] = bollinger['lower']
        dataframe['bb_middleband'] = bollinger['mid']
        dataframe['bb_upperband'] = bollinger['upper']
        dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10)
        return dataframe

    def populate_entry_trend(self, dataframe: Union[pandas.DataFrame, dict], metadata: Union[dict, pandas.DataFrame]) -> Union[pandas.DataFrame, dict]:
        dataframe.loc[(dataframe['rsi'] < self.buy_rsi.value) & (dataframe['fastd'] < 35) & (dataframe['adx'] > 30) & (dataframe['plus_di'] > self.buy_plusdi.value) | (dataframe['adx'] > 65) & (dataframe['plus_di'] > self.buy_plusdi.value), 'enter_long'] = 1
        dataframe.loc[qtpylib.crossed_below(dataframe['rsi'], self.sell_rsi.value), ('enter_short', 'enter_tag')] = (1, 'short_Tag')
        return dataframe

    def populate_exit_trend(self, dataframe: Union[pandas.DataFrame, dict], metadata: Union[dict, pandas.DataFrame]) -> Union[pandas.DataFrame, dict]:
        dataframe.loc[(qtpylib.crossed_above(dataframe['rsi'], self.sell_rsi.value) | qtpylib.crossed_above(dataframe['fastd'], 70)) & (dataframe['adx'] > 10) & (dataframe['minus_di'] > 0) | (dataframe['adx'] > 70) & (dataframe['minus_di'] > self.sell_minusdi.value), 'exit_long'] = 1
        dataframe.loc[qtpylib.crossed_above(dataframe['rsi'], self.buy_rsi.value), ('exit_short', 'exit_tag')] = (1, 'short_Tag')
        return dataframe

    def leverage(self, pair: Union[str, int, float], current_time: Union[str, int, float], current_rate: Union[str, int, float], proposed_leverage: Union[str, int, float], max_leverage: Union[str, int, float], entry_tag: Union[str, int, float], side: Union[str, int, float], **kwargs) -> float:
        return 3.0

    def adjust_trade_position(self, trade: Union[pandas.DataFrame, keno.strategy.Strategy, float], current_time: Union[float, datetime.datetime.datetime, int], current_rate: Union[float, datetime.datetime.datetime, int], current_profit: Union[float, datetime.datetime.datetime, int], min_stake: Union[float, datetime.datetime.datetime, int], max_stake: Union[float, datetime.datetime.datetime, int], current_entry_rate: Union[float, datetime.datetime.datetime, int], current_exit_rate: Union[float, datetime.datetime.datetime, int], current_entry_profit: Union[float, datetime.datetime.datetime, int], current_exit_profit: Union[float, datetime.datetime.datetime, int], **kwargs) -> Union[float, None]:
        if current_profit < -0.0075:
            orders = trade.select_filled_orders(trade.entry_side)
            return round(orders[0].stake_amount, 0)
        return None

class Github_plcacs_Harmonizing_ml_results__strategy_test_v3_251abc__20250811_003639Futures(Github_plcacs_Harmonizing_ml_results__strategy_test_v3_251abc__20250811_003639):
    can_short = True