from freqtrade.optimize.hyperopt import IHyperOptLoss
from pandas import DataFrame
import numpy as np


class OptimizedStrategyHyperopt(IHyperOptLoss):
    """
    Prioritizes:
    1. Total profit (maximize)
    2. Win rate (bonus for >50%)
    3. Trade count (penalize <10 trades)
    4. Drawdown (penalize)
    """

    @staticmethod
    def hyperopt_loss_function(results: DataFrame, *args, **kwargs) -> float:
        total_profit = results['profit_abs'].sum()
        num_trades = len(results)

        if num_trades < 10:
            return 1e10

        wins = (results['profit_abs'] > 0).sum()
        win_rate = wins / num_trades

        avg_duration = results['trade_duration'].mean()

        profit_score = -total_profit
        win_rate_bonus = -(win_rate - 0.5) * total_profit * 0.5
        duration_penalty = (avg_duration / 1440) * 0.1

        return profit_score + win_rate_bonus + duration_penalty