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

from freqtrade.strategy import IStrategy
from pandas import DataFrame
from freqtrade.persistence import Trade
from datetime import datetime, timedelta

import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib


class Github_remiotore_freqtrade__Do__20260111_210550(IStrategy):
    """
    author@: Generated by ChatGPT
    """

    INTERFACE_VERSION: int = 3
    can_short: bool = True
    timeframe = '5m'
    startup_candle_count: int = 24 * 12  # 24 hours of data with 5m timeframe

    stoploss = -0.10  # Example stoploss
    minimal_roi = {
        "0": 0.05  # Example ROI
    }

    def get_usdt_balance(self):

        return self.wallets.get_total("USDT")

    def informative_pairs(self):
        pairs = self.dp.current_whitelist()
        return [(pair, '1h') for pair in pairs]

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

        dataframe['24h_change'] = (dataframe['close'] / dataframe['close'].shift(24*12) - 1) * 100

        dataframe['hammer'] = ta.CDLHAMMER(dataframe)
        dataframe['inverted_hammer'] = ta.CDLINVERTEDHAMMER(dataframe)

        return dataframe

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

        dataframe['enter_long'] = 0
        dataframe['enter_short'] = 0

        dataframe.loc[
            (dataframe['24h_change'] <= -15) &
            (dataframe['hammer'] != 0),
            'enter_long'] = 1

        dataframe.loc[
            (dataframe['24h_change'] >= 15) &
            (dataframe['inverted_hammer'] != 0),
            'enter_short'] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['exit_long'] = 0
        dataframe['exit_short'] = 0

        return dataframe

    def custom_entry(self, pair: str, current_time: datetime, proposed_rate: float, entry_side: str, **kwargs):
        usdt_balance = self.get_usdt_balance()
        position_size = usdt_balance * 0.10  # Use 10% of the total USDT balance

        if entry_side == 'long':

            self.buy(pair=pair, amount=position_size / proposed_rate, rate=proposed_rate)
        elif entry_side == 'short':

            self.sell(pair=pair, amount=position_size / proposed_rate, rate=proposed_rate)

    def custom_exit(self, pair: str, trade: Trade, current_time: datetime, **kwargs):

        pass

    def check_trade_conditions(self, dataframe: DataFrame, metadata: dict):
        """
        Monitor open positions and manage them according to specified conditions.
        """

        open_trades = self.dp.current_trades

        for trade in open_trades:

            pair = trade.pair
            current_rate = self.dp.get_pair_dataframe(pair=pair, timeframe=self.timeframe).iloc[-1]['close']
            trade_duration = (datetime.utcnow() - trade.open_date_utc).total_seconds() / 3600  # Convert to hours

            if trade_duration > 24 or trade.calc_profit_ratio(current_rate) >= self.minimal_roi["0"]:
                self.close_trade(trade, current_rate, "Exit condition met")

    def should_exit_trade(self, trade: Trade, current_time: datetime, current_rate: float, **kwargs):
        """
        Custom exit logic to be implemented here if needed.
        """
        return False

    def execute_trade_exit(self, trade: Trade, current_time: datetime, current_rate: float, **kwargs):
        """
        Execute trade exit based on conditions.
        """
        if self.should_exit_trade(trade, current_time, current_rate, **kwargs):
            self.close_trade(trade, current_rate, "Custom exit condition met")

    def on_trade_open(self, trade: Trade, order: 'Order', pair: str, **kwargs):
        """
        Perform actions after a trade is opened.
        """
        pass

    def on_trade_close(self, trade: Trade, order: 'Order', pair: str, **kwargs):
        """
        Perform actions after a trade is closed.
        """
        pass

