from streamlit_elements import mui, lazy import datetime import constants from utils.file_templates import strategy_optimization_template from utils.os_utils import save_file, load_directional_strategies from .dashboard import Dashboard class OptimizationCreationCard(Dashboard.Item): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) today = datetime.datetime.now() self._optimization_version = f"{today.day:02d}-{today.month:02d}-{today.year}" self._optimization_name = None self._strategy_name = None def _set_optimization_version(self, event): self._optimization_version = event.target.value def _set_strategy_name(self, _, childs): self._strategy_name = childs.props.value def _create_optimization(self, strategy_info): strategy_code = strategy_optimization_template(strategy_info) save_file(name=f"{self._strategy_name.lower()}_v_{self._optimization_version}.py", content=strategy_code, path=constants.OPTIMIZATIONS_PATH) def __call__(self): available_strategies = load_directional_strategies(constants.DIRECTIONAL_STRATEGIES_PATH) strategy_names = list(available_strategies.keys()) with mui.Paper(key=self._key, sx={"display": "flex", "flexDirection": "column", "borderRadius": 3, "overflow": "hidden"}, elevation=1): with self.title_bar(padding="10px 15px 10px 15px", dark_switcher=False): mui.icon.NoteAdd() mui.Typography("Create a new optimization", variant="h6") with mui.Stack(direction="row", spacing=2, justifyContent="space-evenly", alignItems="center", sx={"padding": "10px"}): if len(strategy_names) == 0: mui.Alert("No strategies available, please create one to optimize it", severity="warning", sx={"width": "100%"}) return else: if self._strategy_name is None: self._strategy_name = strategy_names[0] with mui.Select(label="Select strategy", defaultValue=strategy_names[0], variant="standard", onChange=lazy(self._set_strategy_name)): for strategy in strategy_names: mui.MenuItem(strategy, value=strategy) mui.TextField(defaultValue=self._optimization_version, label="Optimization version", variant="standard", onChange=lazy(self._set_optimization_version)) mui.IconButton(mui.icon.AddCircle, sx={"color": "primary.main"}, onClick=lambda x: self._create_optimization(available_strategies[self._strategy_name]))