# source: https://raw.githubusercontent.com/deQ8G/freqtrade_strategies/ce67468c0a7d228661dc18945b6531fa4a2deee1/basic_unicorn.py
# directory_url: https://github.com/deQ8G/freqtrade_strategies/blob/main//
# User: deQ8G
# Repository: freqtrade_strategies
# --------------------from datetime import datetime

from pandas import DataFrame
from technical import qtpylib

from freqtrade.strategy import IntParameter, IStrategy



class Github_deQ8G_freqtrade_strategies__basic_unicorn__20261003_201238(IStrategy):
    INTERFACE_VERSION = 3

    can_short = True
    timeframe = "1d"
    minimal_roi = {}
    stoploss = -1.0

    fastMA = IntParameter(low=5, high=20, default=10, space="buy",load=False)
    slowMA = IntParameter(low=20, high=40, default=30, space="buy",load=False)
    leverage_parameter = IntParameter(low=4, high=4, default=3, space="buy",load=False)

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        heikin_ashi = qtpylib.heikinashi(dataframe)
        dataframe["ha_open"] = heikin_ashi["open"]
        dataframe["ha_close"] = heikin_ashi["close"]
        dataframe["ha_positive_switch"] = (
            (dataframe["ha_close"].shift(1) < dataframe["ha_open"].shift(1))
            & (dataframe["ha_close"] > dataframe["ha_open"])
        ).astype(int)
        dataframe["ha_negative_switch"] = (
            (dataframe["ha_close"].shift(1) > dataframe["ha_open"].shift(1))
            & (dataframe["ha_close"] < dataframe["ha_open"])
        ).astype(int)

        fast_length = self.fastMA.value
        slow_length = max(self.slowMA.value, fast_length + 1)
        dataframe["fastMA"] = dataframe["ha_close"].rolling(fast_length).mean()
        dataframe["slowMA"] = dataframe["ha_close"].rolling(slow_length).mean()
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (dataframe["ha_positive_switch"] == 1)
            & (dataframe["fastMA"] > dataframe["slowMA"]),
            "enter_long",
        ] = 1
        dataframe.loc[
            (dataframe["ha_negative_switch"] == 1)
            & (dataframe["fastMA"] < dataframe["slowMA"]),
            "enter_short",
        ] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[dataframe["ha_negative_switch"] == 1, "exit_long"] = 1
        dataframe.loc[dataframe["ha_positive_switch"] == 1, "exit_short"] = 1
        return dataframe

    def custom_stake_amount(
        self,
        pair: str,
        current_time: datetime,
        current_rate: float,
        proposed_stake: float,
        min_stake: float | None,
        max_stake: float,
        leverage: float,
        entry_tag: str | None,
        side: str,
        **kwargs,
    ) -> float:
        return max_stake

    def leverage(
        self,
        pair: str,
        current_time: datetime,
        current_rate: float,
        proposed_leverage: float,
        max_leverage: float,
        entry_tag: str | None,
        side: str,
        **kwargs,
    ) -> float:
        return min(float(self.leverage_parameter.value), max_leverage)
