def custom_colors(self, layout: QtWidgets.QLayout): for setting, name, attr in ( ('BackgroundColor', 'Chart background', 'background'), ('ForegroundColor', 'Chart foreground', 'foreground'), ('TextColor', 'Chart text', 'text'), ): cp = self.color_picker(setting, attr) layout.addRow(name, cp)
def trace_colors(self, layout: QtWidgets.QLayout): for setting, name, attr in ( ('SweepColor', 'Sweep color', 'sweep'), ('SecondarySweepColor', 'Second sweep color', 'sweep_secondary'), ('ReferenceColor', 'Reference color', 'reference'), ('SecondaryReferenceColor', 'Second reference color', 'reference_secondary'), ): cp = self.color_picker(setting, attr) layout.addRow(name, cp)
def create_loss_inputs(self, tab: QTabWidget, innerLayout: QLayout): """ Creates inputs for loss settings in GUI. :param tab: Tab to create inputs for - simulation, live, or backtest. :param innerLayout: Inner layout to place input widgets on. """ self.lossDict[tab, "lossType"] = lossTypeComboBox = QComboBox() self.lossDict[tab, "lossPercentage"] = lossPercentage = QDoubleSpinBox() self.lossDict[ tab, "smartStopLossCounter"] = smartStopLossCounter = QSpinBox() lossTypeComboBox.addItems(("Trailing", "Stop")) lossPercentage.setValue(5) innerLayout.addRow(QLabel("Loss Type"), lossTypeComboBox) innerLayout.addRow(QLabel("Loss Percentage"), lossPercentage) innerLayout.addRow(QLabel("Smart Stop Loss Counter"), smartStopLossCounter) if tab != self.backtestConfigurationTabWidget: self.lossDict[tab, "safetyTimer"] = safetyTimer = QSpinBox() safetyTimer.valueChanged.connect( lambda: self.update_loss_settings(tab)) innerLayout.addRow(QLabel("Safety Timer"), safetyTimer) lossTypeComboBox.currentIndexChanged.connect( lambda: self.update_loss_settings(tab)) lossPercentage.valueChanged.connect( lambda: self.update_loss_settings(tab)) smartStopLossCounter.valueChanged.connect( lambda: self.update_loss_settings(tab))
def create_take_profit_inputs(self, tab: QTabWidget, innerLayout: QLayout, isOptimizer: bool = False): """ Creates inputs for take profit settings in GUI. :param tab: Tab to create inputs for - simulation, live, or backtest. :param innerLayout: Inner layout to place input widgets on. :param isOptimizer: Boolean for whether optimizer method called this function. """ if isOptimizer: self.takeProfitDict['optimizerTypes'] = [] innerLayout.addRow(QLabel("Take Profit Types")) for takeProfitType in self.takeProfitTypes: checkbox = QCheckBox(f'Enable {takeProfitType} take profit?') innerLayout.addRow(checkbox) self.takeProfitDict['optimizerTypes'].append((takeProfitType, checkbox)) for optimizerType in self.takeProfitOptimizerTypes: self.takeProfitDict[optimizerType, 'start'] = start = get_default_widget(QSpinBox, 1, 0) self.takeProfitDict[optimizerType, 'end'] = end = get_default_widget(QSpinBox, 1, 0) self.takeProfitDict[optimizerType, 'step'] = step = get_default_widget(QSpinBox, 1) add_start_end_step_to_layout(innerLayout, optimizerType, start, end, step) else: self.takeProfitDict[tab, 'takeProfitType'] = takeProfitTypeComboBox = QComboBox() self.takeProfitDict[tab, 'takeProfitPercentage'] = takeProfitPercentage = QDoubleSpinBox() takeProfitTypeComboBox.addItems(self.takeProfitTypes) takeProfitTypeComboBox.currentIndexChanged.connect(lambda: self.update_take_profit_settings(tab)) takeProfitPercentage.setValue(5) takeProfitPercentage.valueChanged.connect(lambda: self.update_take_profit_settings(tab)) innerLayout.addRow(QLabel("Take Profit Type"), takeProfitTypeComboBox) innerLayout.addRow(QLabel('Take Profit Percentage'), takeProfitPercentage)
def create_strategy_inputs(parameters: List[Union[int, tuple]], strategyName: str, groupBoxLayout: QLayout) -> Tuple[list, list]: """ This function will create strategy slots and labels based on the parameters provided to the layout. :param parameters: Parameters to add to strategy GUI slots. These are fetched from get_param_types() in strategies. :param strategyName: Name of strategy. :param groupBoxLayout: Layout to add the slots to. :return: Tuple of labels and values lists. """ labels = [] values = [] for paramIndex, parameter in enumerate(parameters): if type(parameter) == tuple: label = QLabel(parameter[0]) parameter = parameter[ 1:] # Set parameter to just the last element so we can use this later. elif parameter == int: label = QLabel(f'{strategyName} input {paramIndex + 1}') parameter = [parameter] else: raise TypeError( "Please make sure your function get_param_types() only has ints or tuples." ) if parameter[0] == int: value = QSpinBox() value.setRange(1, 500) elif parameter[0] == float: value = QDoubleSpinBox() elif parameter[0] == str: value = QLineEdit() elif parameter[0] == tuple: elements = parameter[1] value = QComboBox() value.addItems(elements) else: raise TypeError("Invalid type of parameter provided.") labels.append(label) values.append(value) groupBoxLayout.addRow(label, value) line = get_h_line() labels.append(line) groupBoxLayout.addWidget(line) return values, labels
def create_take_profit_inputs(self, tab: QTabWidget, innerLayout: QLayout): """ Creates inputs for take profit settings in GUI. :param tab: Tab to create inputs for - simulation, live, or backtest. :param innerLayout: Inner layout to place input widgets on. """ self.takeProfitDict[tab, 'takeProfitType'] = takeProfitTypeComboBox = QComboBox() self.takeProfitDict[tab, 'takeProfitPercentage'] = takeProfitPercentage = QDoubleSpinBox() takeProfitTypeComboBox.addItems(('Stop',)) takeProfitPercentage.setValue(5) takeProfitTypeComboBox.currentIndexChanged.connect(lambda: self.update_take_profit_settings(tab)) takeProfitPercentage.valueChanged.connect(lambda: self.update_take_profit_settings(tab)) innerLayout.addRow(QLabel("Take Profit Type"), takeProfitTypeComboBox) innerLayout.addRow(QLabel('Take Profit Percentage'), takeProfitPercentage)
def add_start_end_step_to_layout(layout: QLayout, msg: str, start: QWidget, end: QWidget, step: QWidget): """ Adds start, end, and step rows to the layout provided. """ layout.addRow(QLabel(f"{helpers.get_label_string(msg)} Optimization")) layout.addRow("Start", start) layout.addRow("End", end) layout.addRow("Step", step) start.valueChanged.connect(lambda: (end.setValue(start.value()), end.setMinimum(start.value())))
def create_loss_inputs(self, tab: QTabWidget, innerLayout: QLayout, isOptimizer: bool = False): """ Creates inputs for loss settings in GUI. :param tab: Tab to create inputs for - simulation, live, or backtest. :param innerLayout: Inner layout to place input widgets on. :param isOptimizer: Boolean for whether optimizer method called this function. """ if isOptimizer: self.lossDict['optimizerTypes'] = [] innerLayout.addRow(QLabel("Loss Types")) for lossType in self.lossTypes: checkbox = QCheckBox(f'Enable {lossType.lower()} type of stop loss?') innerLayout.addRow(checkbox) self.lossDict['optimizerTypes'].append((lossType, checkbox)) for optimizerType in self.lossOptimizerTypes: self.lossDict[optimizerType, 'start'] = start = get_default_widget(QSpinBox, 1, 0) self.lossDict[optimizerType, 'end'] = end = get_default_widget(QSpinBox, 1, 0) self.lossDict[optimizerType, 'step'] = step = get_default_widget(QSpinBox, 1) add_start_end_step_to_layout(innerLayout, optimizerType, start, end, step) else: self.lossDict[tab, "lossType"] = lossTypeComboBox = QComboBox() self.lossDict[tab, "lossPercentage"] = lossPercentage = QDoubleSpinBox() self.lossDict[tab, "smartStopLossCounter"] = smartStopLossCounter = QSpinBox() lossTypeComboBox.addItems(self.lossTypes) lossPercentage.setValue(5) innerLayout.addRow(QLabel("Loss Type"), lossTypeComboBox) innerLayout.addRow(QLabel("Loss Percentage"), lossPercentage) innerLayout.addRow(QLabel("Smart Stop Loss Counter"), smartStopLossCounter) if tab != self.backtestConfigurationTabWidget: self.lossDict[tab, "safetyTimer"] = safetyTimer = QSpinBox() safetyTimer.valueChanged.connect(lambda: self.update_loss_settings(tab)) innerLayout.addRow(QLabel("Safety Timer"), safetyTimer) lossTypeComboBox.currentIndexChanged.connect(lambda: self.update_loss_settings(tab)) lossPercentage.valueChanged.connect(lambda: self.update_loss_settings(tab)) smartStopLossCounter.valueChanged.connect(lambda: self.update_loss_settings(tab))