86 lines
3.4 KiB
Python
86 lines
3.4 KiB
Python
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) |