from PySide6.QtWidgets import QWidget, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox from PySide6.QtCore import Qt, Signal class StrategyPanel(QWidget): strategy_selected = Signal(str) start_strategy_requested = Signal(str) stop_strategy_requested = Signal(str) def __init__(self): super().__init__() self.init_ui() def init_ui(self): layout = QVBoxLayout(self) # Title title_label = QLabel("Strategies") title_label.setAlignment(Qt.AlignCenter) title_label.setStyleSheet("font-size: 24px; font-weight: bold; margin-bottom: 20px;") layout.addWidget(title_label) # Strategy selection and control strategy_control_layout = QHBoxLayout() strategy_control_layout.addWidget(QLabel("Select Strategy:")) self.strategy_selector = QComboBox() self.strategy_selector.addItem("None") self.strategy_selector.addItem("simple_crossover") # Placeholder strategy self.strategy_selector.addItem("intraday_fno") # Placeholder strategy self.strategy_selector.currentIndexChanged.connect(self._on_strategy_selected) strategy_control_layout.addWidget(self.strategy_selector) self.start_button = QPushButton("Start Strategy") self.start_button.clicked.connect(self._on_start_button_clicked) self.start_button.setEnabled(False) # Initially disabled strategy_control_layout.addWidget(self.start_button) self.stop_button = QPushButton("Stop Strategy") self.stop_button.clicked.connect(self._on_stop_button_clicked) self.stop_button.setEnabled(False) # Initially disabled strategy_control_layout.addWidget(self.stop_button) layout.addLayout(strategy_control_layout) # Strategy status status_layout = QHBoxLayout() status_layout.addWidget(QLabel("Status:")) self.strategy_status_label = QLabel("Idle") status_layout.addWidget(self.strategy_status_label) status_layout.addStretch(1) layout.addLayout(status_layout) layout.addStretch(1) # Pushes content to the top self.setLayout(layout) def _on_strategy_selected(self, index): strategy_name = self.strategy_selector.currentText() self.strategy_selected.emit(strategy_name) self.start_button.setEnabled(strategy_name != "None") self.stop_button.setEnabled(False) self.update_status("Loaded" if strategy_name != "None" else "Idle") def _on_start_button_clicked(self): strategy_name = self.strategy_selector.currentText() if strategy_name != "None": self.start_strategy_requested.emit(strategy_name) self.start_button.setEnabled(False) self.stop_button.setEnabled(True) self.update_status("Starting...") def _on_stop_button_clicked(self): strategy_name = self.strategy_selector.currentText() if strategy_name != "None": self.stop_strategy_requested.emit(strategy_name) self.start_button.setEnabled(True) self.stop_button.setEnabled(False) self.update_status("Stopping...") def update_status(self, status: str): self.strategy_status_label.setText(status) def set_available_strategies(self, strategies: list[str]): self.strategy_selector.clear() self.strategy_selector.addItem("None") for strategy in strategies: self.strategy_selector.addItem(strategy)