"""
IHyperOptLoss interface
This module defines the interface for the loss-function for hyperopt
"""

from abc import ABC, abstractmethod
from datetime import datetime
from typing import Any, Dict

from pandas import DataFrame

from freqtrade.constants import Config


class IHyperOptLoss(ABC):
    """
    Interface for freqtrade hyperopt Loss functions.
    Defines the custom loss function (`hyperopt_loss_function()` which is evaluated every epoch.)
    """
    timeframe: str

    @staticmethod
    @abstractmethod
    def hyperopt_loss_function(*, results: DataFrame, trade_count: int,
                               min_date: datetime, max_date: datetime,
                               config: Config, processed: Dict[str, DataFrame],
                               backtest_stats: Dict[str, Any],
                               **kwargs) -> float:
        """
        Objective function, returns smaller number for better results
        """