2024-07-07 13:29:58 +00:00
|
|
|
import sys
|
|
|
|
from typing import List, Optional, Union
|
|
|
|
|
|
|
|
from rich.console import Console
|
|
|
|
from rich.table import Table
|
|
|
|
from rich.text import Text
|
|
|
|
|
|
|
|
from freqtrade.constants import Config
|
|
|
|
from freqtrade.optimize.optimize_reports import generate_wins_draws_losses
|
|
|
|
from freqtrade.util import fmt_coin
|
|
|
|
|
|
|
|
|
|
|
|
class HyperoptOutput:
|
|
|
|
def __init__(self):
|
2024-07-07 14:15:09 +00:00
|
|
|
self.table = Table(
|
2024-07-07 13:29:58 +00:00
|
|
|
title="Hyperopt results",
|
|
|
|
)
|
|
|
|
# Headers
|
2024-07-07 14:15:09 +00:00
|
|
|
self.table.add_column("Best", justify="left")
|
|
|
|
self.table.add_column("Epoch", justify="right")
|
|
|
|
self.table.add_column("Trades", justify="right")
|
|
|
|
self.table.add_column("Win Draw Loss Win%", justify="right")
|
|
|
|
self.table.add_column("Avg profit", justify="right")
|
|
|
|
self.table.add_column("Profit", justify="right")
|
|
|
|
self.table.add_column("Avg duration", justify="right")
|
|
|
|
self.table.add_column("Objective", justify="right")
|
|
|
|
self.table.add_column("Max Drawdown (Acct)", justify="right")
|
2024-07-07 13:29:58 +00:00
|
|
|
|
|
|
|
def _add_row(self, data: List[Union[str, Text]]):
|
|
|
|
"""Add single row"""
|
|
|
|
row_to_add: List[Union[str, Text]] = [r if isinstance(r, Text) else str(r) for r in data]
|
|
|
|
|
2024-07-07 14:15:09 +00:00
|
|
|
self.table.add_row(*row_to_add)
|
2024-07-07 13:29:58 +00:00
|
|
|
|
|
|
|
def _add_rows(self, data: List[List[Union[str, Text]]]):
|
|
|
|
"""add multiple rows"""
|
|
|
|
for row in data:
|
|
|
|
self._add_row(row)
|
|
|
|
|
|
|
|
def print(self, console: Optional[Console] = None, *, print_colorized=True):
|
|
|
|
if not console:
|
|
|
|
console = Console(
|
|
|
|
color_system="auto" if print_colorized else None,
|
|
|
|
width=200 if "pytest" in sys.modules else None,
|
|
|
|
)
|
|
|
|
|
2024-07-07 14:15:09 +00:00
|
|
|
console.print(self.table)
|
2024-07-07 13:29:58 +00:00
|
|
|
|
|
|
|
def add_data(
|
|
|
|
self,
|
|
|
|
config: Config,
|
|
|
|
results: list,
|
|
|
|
total_epochs: int,
|
|
|
|
highlight_best: bool,
|
2024-07-07 14:15:09 +00:00
|
|
|
) -> None:
|
2024-07-07 13:29:58 +00:00
|
|
|
"""Format one or multiple rows and add them"""
|
|
|
|
stake_currency = config["stake_currency"]
|
|
|
|
|
2024-07-07 14:28:02 +00:00
|
|
|
for r in results:
|
|
|
|
self.table.add_row(
|
|
|
|
*[
|
|
|
|
# "Best":
|
|
|
|
(
|
|
|
|
("*" if r["is_initial_point"] or r["is_random"] else "")
|
|
|
|
+ (" Best" if r["is_best"] else "")
|
|
|
|
).lstrip(),
|
|
|
|
# "Epoch":
|
|
|
|
f"{r['current_epoch']}/{total_epochs}",
|
|
|
|
# "Trades":
|
|
|
|
str(r["results_metrics"]["total_trades"]),
|
|
|
|
# "Win Draw Loss Win%":
|
|
|
|
generate_wins_draws_losses(
|
|
|
|
r["results_metrics"]["wins"],
|
|
|
|
r["results_metrics"]["draws"],
|
|
|
|
r["results_metrics"]["losses"],
|
2024-07-07 13:29:58 +00:00
|
|
|
),
|
2024-07-07 14:28:02 +00:00
|
|
|
# "Avg profit":
|
|
|
|
f"{r['results_metrics']['profit_mean']:.2%}",
|
|
|
|
# "Profit":
|
|
|
|
Text(
|
|
|
|
"{} {}".format(
|
|
|
|
fmt_coin(
|
|
|
|
r["results_metrics"]["profit_total_abs"],
|
|
|
|
stake_currency,
|
|
|
|
keep_trailing_zeros=True,
|
|
|
|
),
|
|
|
|
f"({r['results_metrics']['profit_total']:,.2%})".rjust(10, " "),
|
|
|
|
)
|
|
|
|
if r["results_metrics"]["profit_total_abs"] != 0.0
|
|
|
|
else "--",
|
|
|
|
style="green" if r["results_metrics"]["profit_total_abs"] > 0 else "red",
|
2024-07-07 13:29:58 +00:00
|
|
|
),
|
2024-07-07 14:28:02 +00:00
|
|
|
# "Avg duration":
|
|
|
|
r["results_metrics"]["holding_avg"],
|
|
|
|
# "Objective":
|
|
|
|
f"{r["loss"]:,.5f}" if r["loss"] != 100000 else "N/A",
|
|
|
|
# "Max Drawdown (Acct)":
|
|
|
|
"{} {}".format(
|
|
|
|
fmt_coin(
|
|
|
|
r["results_metrics"]["max_drawdown_abs"],
|
|
|
|
stake_currency,
|
|
|
|
keep_trailing_zeros=True,
|
|
|
|
),
|
|
|
|
(f"({r["results_metrics"]['max_drawdown_account']:,.2%})").rjust(10, " "),
|
|
|
|
)
|
|
|
|
if r["results_metrics"]["max_drawdown_account"] != 0.0
|
|
|
|
else "--",
|
|
|
|
],
|
|
|
|
style=" ".join(
|
|
|
|
[
|
|
|
|
"bold " if r["is_best"] and highlight_best else "",
|
|
|
|
"italic " if r["is_initial_point"] else "",
|
|
|
|
]
|
|
|
|
),
|
|
|
|
)
|