Coverage for src / monte_neo / cli / menu / metrics.py: 0%

22 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-28 16:27 +0200

1"""Metrics configuration workflow.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING 

6 

7import questionary 

8from rich.console import Console 

9 

10from monte_neo.cli.styles import CUSTOM_STYLE 

11 

12if TYPE_CHECKING: 

13 from monte_neo.cli.menu.main import InteractiveMenu 

14 

15console = Console() 

16 

17 

18def set_metrics_workflow(menu: InteractiveMenu) -> None: 

19 """Set target metrics workflow.""" 

20 console.print("\n[bold cyan]🎯 Set Target Metrics[/]\n") 

21 

22 metrics_choices = [ 

23 {"name": "📈 Profit Factor (> 2.0)", "value": "profit_factor", "checked": "profit_factor" in menu._target_metrics}, 

24 {"name": "📊 Sharpe Ratio (> 1.0)", "value": "sharpe_ratio", "checked": "sharpe_ratio" in menu._target_metrics}, 

25 {"name": "📉 Max Drawdown (< 20%)", "value": "max_drawdown", "checked": "max_drawdown" in menu._target_metrics}, 

26 {"name": "🎯 Winrate (> 45%)", "value": "winrate", "checked": "winrate" in menu._target_metrics}, 

27 {"name": "💹 Sortino Ratio (> 1.5)", "value": "sortino_ratio", "checked": "sortino_ratio" in menu._target_metrics}, 

28 {"name": "🔄 Recovery Factor (> 2.0)", "value": "recovery_factor", "checked": "recovery_factor" in menu._target_metrics}, 

29 {"name": "📆 Calmar Ratio (> 0.5)", "value": "calmar_ratio", "checked": "calmar_ratio" in menu._target_metrics}, 

30 ] 

31 

32 selected = questionary.checkbox( 

33 "Select metrics to target:", 

34 choices=metrics_choices, 

35 style=CUSTOM_STYLE, 

36 ).ask() 

37 

38 if not selected: 

39 return 

40 

41 # Get values for selected metrics 

42 menu._target_metrics = {} 

43 defaults = { 

44 "profit_factor": 2.0, "sharpe_ratio": 1.0, "max_drawdown": 0.20, 

45 "winrate": 0.45, "sortino_ratio": 1.5, "recovery_factor": 2.0, 

46 "calmar_ratio": 0.5, 

47 } 

48 

49 for metric in selected: 

50 value = questionary.text( 

51 f"{metric}:", 

52 default=str(defaults.get(metric, 1.0)), 

53 style=CUSTOM_STYLE, 

54 ).ask() 

55 

56 if value: 

57 menu._target_metrics[metric] = float(value) 

58 

59 # Show summary 

60 console.print("\n[green]✓ Target metrics set:[/]") 

61 for k, v in menu._target_metrics.items(): 

62 console.print(f" • {k}: {v}") 

63 console.print()