# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/HeraclesOptimize.py















import logging

from numpy.lib import math
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame



import pandas as pd
import ta
from ta.utils import dropna
import freqtrade.vendor.qtpylib.indicators as qtpylib
from functools import reduce
import numpy as np


class Github_remiotore_freqtrade__HeraclesOptimize__20260111_210550(IStrategy):





    buy_params = {
        'buy-cross-0': 'volatility_kcw',
        'buy-indicator-0': 'volatility_dcp',
        'buy-oper-0': '<',
    }

    sell_params = {
        'sell-cross-0': 'trend_macd_signal',
        'sell-indicator-0': 'trend_ema_fast',
        'sell-oper-0': '=',
    }

    minimal_roi = {
        "0": 0.132,
        "2523": 0.093,
        "4187": 0.053,
        "16688": 0
    }

    stoploss = -0.02

    trailing_stop = True
    trailing_stop_positive = 0.255
    trailing_stop_positive_offset = 0.328
    trailing_only_offset_is_reached = False

    timeframe = '8h'

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:

        dataframe = dropna(dataframe)

        dataframe['volatility_kcw'] = ta.volatility.keltner_channel_wband(
            dataframe['high'],
            dataframe['low'],
            dataframe['close'],
            window=20,
            window_atr=10,
            fillna=False,
            original_version=True
        )
        dataframe['volatility_dcp'] = ta.volatility.donchian_channel_pband(
            dataframe['high'],
            dataframe['low'],
            dataframe['close'],
            window=10,
            offset=0,
            fillna=False
        )
        dataframe['trend_macd_signal'] = ta.trend.macd_signal(
            dataframe['close'],
            window_slow=26,
            window_fast=12,
            window_sign=9,
            fillna=False
        )

        dataframe['trend_ema_fast'] = ta.trend.EMAIndicator(
            close=dataframe['close'], window=12, fillna=False
        ).ema_indicator()

        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:

        IND = self.buy_params['buy-indicator-0']
        CRS = self.buy_params['buy-cross-0']
        DFIND = dataframe[IND]
        DFCRS = dataframe[CRS]

        dataframe.loc[
            (DFIND < DFCRS),
            'buy'] = 1

        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        IND = self.sell_params['sell-indicator-0']
        CRS = self.sell_params['sell-cross-0']

        DFIND = dataframe[IND]
        DFCRS = dataframe[CRS]

        dataframe.loc[
            (qtpylib.crossed_below(DFIND, DFCRS)),
            'sell'] = 1

        return dataframe
