# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/Discord_CDCActionZone.py
from datetime import datetime
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import freqtrade.vendor.qtpylib.indicators as ta
from typing import Optional


class Github_remiotore_freqtrade__Discord_CDCActionZone__20260111_210550(IStrategy):

    INTERFACE_VERSION = 3

    timeframe = '1h'

    minimal_roi = {
        "0": 0.05,
        "60": 0.03,
        "120": 0.02,
        "240": 0.01,
    }

    stoploss = -0.03

    trailing_stop = True
    trailing_stop_positive = 0.01
    trailing_stop_positive_offset = 0.02
    trailing_only_offset_is_reached = True
    can_short = True

    startup_candle_count = 30

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['FastMA'] = ta.ema(dataframe['close'], 12)
        dataframe['SlowMA'] = ta.ema(dataframe['close'], 26)
        dataframe['Bull'] = (dataframe['FastMA'] > dataframe['SlowMA']).astype(int)
        dataframe['Bear'] = (dataframe['FastMA'] < dataframe['SlowMA']).astype(int)
        dataframe['Green'] = ((dataframe['Bull'] == 1) & (dataframe['close'] > dataframe['FastMA'])).astype(int)
        dataframe['Blue'] = ((dataframe['Bear'] == 1) & (dataframe['close'] > dataframe['FastMA']) & (dataframe['close'] > dataframe['SlowMA'])).astype(int)
        dataframe['LBlue'] = ((dataframe['Bear'] == 1) & (dataframe['close'] > dataframe['FastMA']) & (dataframe['close'] < dataframe['SlowMA'])).astype(int)
        dataframe['Red'] = ((dataframe['Bear'] == 1) & (dataframe['close'] < dataframe['FastMA'])).astype(int)
        dataframe['Orange'] = ((dataframe['Bull'] == 1) & (dataframe['close'] < dataframe['FastMA']) & (dataframe['close'] < dataframe['SlowMA'])).astype(int)
        dataframe['Yellow'] = ((dataframe['Bull'] == 1) & (dataframe['close'] < dataframe['FastMA']) & (dataframe['close'] > dataframe['SlowMA'])).astype(int)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['Green'] == 1) |
                (dataframe['LBlue'] == 1) |
                (dataframe['Orange'] == 1)
            ),
            'entry_trend'
        ] = 'enter_long'

        dataframe.loc[
            (
                (dataframe['Blue'] == 1) |
                (dataframe['Red'] == 1) |
                (dataframe['Yellow'] == 1)
            ),
            'entry_trend'
        ] = 'enter_short'

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['Green'] == 1) |
                (dataframe['LBlue'] == 1) |
                (dataframe['Orange'] == 1)
            ),
            'exit_trend'
        ] = 'exit_long'

        dataframe.loc[
            (
                (dataframe['Blue'] == 1) |
                (dataframe['Red'] == 1) |
                (dataframe['Yellow'] == 1)
            ),
            'exit_trend'
        ] = 'exit_short'

        return dataframe

    def leverage(self, pair: str, current_time: datetime, current_rate: float,
                  proposed_leverage: float, max_leverage: float, side: str,
                  **kwargs) -> float:
         """
         Customize leverage for each new trade. This method is only called in futures mode.

         :param pair: Pair that's currently analyzed
         :param current_time: datetime object, containing the current datetime
         :param current_rate: Rate, calculated based on pricing settings in exit_pricing.
         :param proposed_leverage: A leverage proposed by the bot.
         :param max_leverage: Max leverage allowed on this pair
         :param entry_tag: Optional entry_tag (buy_tag) if provided with the buy signal.
         :param side: 'long' or 'short' - indicating the direction of the proposed trade
         :return: A leverage amount, which is between 1.0 and max_leverage.
         """
         return 10.0