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