Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
    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))
Esempio n. 4
0
    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)
Esempio n. 5
0
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
Esempio n. 6
0
    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)
Esempio n. 7
0
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())))
Esempio n. 8
0
    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))