def init_ui(self): """""" self.name_line = QtWidgets.QLineEdit() self.symbol_line = QtWidgets.QLineEdit() self.remove_combo = QtWidgets.QComboBox() for w in [self.name_line, self.symbol_line, self.remove_combo]: w.setFixedWidth(150) add_button = QtWidgets.QPushButton("创建策略") add_button.clicked.connect(self.add_strategy) remove_button = QtWidgets.QPushButton("移除策略") remove_button.clicked.connect(self.remove_strategy) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(QtWidgets.QLabel("策略名称")) hbox.addWidget(self.name_line) hbox.addWidget(QtWidgets.QLabel("交易合约")) hbox.addWidget(self.symbol_line) hbox.addWidget(add_button) hbox.addStretch() hbox.addWidget(self.remove_combo) hbox.addWidget(remove_button) self.setLayout(hbox)
def get_setting_cells(self, setting_name: str): """""" cells = self.setting_cells.get(setting_name, None) if not cells: use_func = partial(self.use_setting, setting_name=setting_name) use_button = QtWidgets.QPushButton("使用") use_button.clicked.connect(use_func) remove_func = partial(self.remove_setting, setting_name=setting_name) remove_button = QtWidgets.QPushButton("移除") remove_button.clicked.connect(remove_func) name_cell = QtWidgets.QTableWidgetItem(setting_name) setting_cell = QtWidgets.QTableWidgetItem() self.insertRow(0) self.setCellWidget(0, 0, use_button) self.setCellWidget(0, 1, remove_button) self.setItem(0, 2, name_cell) self.setItem(0, 3, setting_cell) cells = {"name": name_cell, "setting": setting_cell} self.setting_cells[setting_name] = cells return cells
def init_ui(self): """""" self.setWindowTitle("CTA策略") # Create widgets self.class_combo = QtWidgets.QComboBox() add_button = QtWidgets.QPushButton("添加策略") add_button.clicked.connect(self.add_strategy) init_button = QtWidgets.QPushButton("全部初始化") init_button.clicked.connect(self.cta_engine.init_all_strategies) start_button = QtWidgets.QPushButton("全部启动") start_button.clicked.connect(self.cta_engine.start_all_strategies) stop_button = QtWidgets.QPushButton("全部停止") stop_button.clicked.connect(self.cta_engine.stop_all_strategies) clear_button = QtWidgets.QPushButton("清空日志") clear_button.clicked.connect(self.clear_log) self.scroll_layout = QtWidgets.QVBoxLayout() self.scroll_layout.addStretch() scroll_widget = QtWidgets.QWidget() scroll_widget.setLayout(self.scroll_layout) scroll_area = QtWidgets.QScrollArea() scroll_area.setWidgetResizable(True) scroll_area.setWidget(scroll_widget) self.log_monitor = LogMonitor(self.main_engine, self.event_engine) self.stop_order_monitor = StopOrderMonitor( self.main_engine, self.event_engine ) # Set layout hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(self.class_combo) hbox1.addWidget(add_button) hbox1.addStretch() hbox1.addWidget(init_button) hbox1.addWidget(start_button) hbox1.addWidget(stop_button) hbox1.addWidget(clear_button) grid = QtWidgets.QGridLayout() grid.addWidget(scroll_area, 0, 0, 2, 1) grid.addWidget(self.stop_order_monitor, 0, 1) grid.addWidget(self.log_monitor, 1, 1) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(grid) self.setLayout(vbox)
def init_ui(self): """""" self.name_combo = QtWidgets.QComboBox() self.direction_combo = QtWidgets.QComboBox() self.direction_combo.addItems( [Direction.LONG.value, Direction.SHORT.value]) self.offset_combo = QtWidgets.QComboBox() self.offset_combo.addItems([offset.value for offset in Offset]) double_validator = QtGui.QDoubleValidator() double_validator.setBottom(0) self.price_line = QtWidgets.QLineEdit() self.price_line.setValidator(double_validator) self.volume_line = QtWidgets.QLineEdit() self.volume_line.setValidator(double_validator) for w in [ self.name_combo, self.price_line, self.volume_line, self.direction_combo, self.offset_combo ]: w.setFixedWidth(150) send_button = QtWidgets.QPushButton("委托") send_button.clicked.connect(self.send_order) send_button.setFixedWidth(70) cancel_button = QtWidgets.QPushButton("全撤") cancel_button.clicked.connect(self.cancel_all) cancel_button.setFixedWidth(70) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(QtWidgets.QLabel("策略名称")) hbox.addWidget(self.name_combo) hbox.addWidget(QtWidgets.QLabel("方向")) hbox.addWidget(self.direction_combo) hbox.addWidget(QtWidgets.QLabel("开平")) hbox.addWidget(self.offset_combo) hbox.addWidget(QtWidgets.QLabel("价格")) hbox.addWidget(self.price_line) hbox.addWidget(QtWidgets.QLabel("数量")) hbox.addWidget(self.volume_line) hbox.addWidget(send_button) hbox.addWidget(cancel_button) hbox.addStretch() self.setLayout(hbox)
def init_ui(self): """""" self.setFixedHeight(300) self.setFrameShape(self.Box) self.setLineWidth(1) init_button = QtWidgets.QPushButton("初始化") init_button.clicked.connect(self.init_strategy) start_button = QtWidgets.QPushButton("启动") start_button.clicked.connect(self.start_strategy) stop_button = QtWidgets.QPushButton("停止") stop_button.clicked.connect(self.stop_strategy) edit_button = QtWidgets.QPushButton("编辑") edit_button.clicked.connect(self.edit_strategy) remove_button = QtWidgets.QPushButton("移除") remove_button.clicked.connect(self.remove_strategy) strategy_name = self._data["strategy_name"] spread_name = self._data["spread_name"] class_name = self._data["class_name"] author = self._data["author"] label_text = ( f"{strategy_name} - {spread_name} ({class_name} by {author})" ) label = QtWidgets.QLabel(label_text) label.setAlignment(QtCore.Qt.AlignCenter) self.parameters_monitor = StrategyDataMonitor(self._data["parameters"]) self.variables_monitor = StrategyDataMonitor(self._data["variables"]) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(init_button) hbox.addWidget(start_button) hbox.addWidget(stop_button) hbox.addWidget(edit_button) hbox.addWidget(remove_button) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(label) vbox.addLayout(hbox) vbox.addWidget(self.parameters_monitor) vbox.addWidget(self.variables_monitor) self.setLayout(vbox)
def init_ui(self): """""" self.setWindowTitle("交易风控") # Create widgets self.active_combo = QtWidgets.QComboBox() self.active_combo.addItems(["停止", "启动"]) self.flow_limit_spin = RiskManagerSpinBox() self.flow_clear_spin = RiskManagerSpinBox() self.size_limit_spin = RiskManagerSpinBox() self.trade_limit_spin = RiskManagerSpinBox() self.active_limit_spin = RiskManagerSpinBox() self.cancel_limit_spin = RiskManagerSpinBox() save_button = QtWidgets.QPushButton("保存") save_button.clicked.connect(self.save_setting) # Form layout form = QtWidgets.QFormLayout() form.addRow("风控运行状态", self.active_combo) form.addRow("委托流控上限(笔)", self.flow_limit_spin) form.addRow("委托流控清空(秒)", self.flow_clear_spin) form.addRow("单笔委托上限(数量)", self.size_limit_spin) form.addRow("总成交上限(笔)", self.trade_limit_spin) form.addRow("活动委托上限(笔)", self.active_limit_spin) form.addRow("合约撤单上限(笔)", self.cancel_limit_spin) form.addRow(save_button) self.setLayout(form) # Set Fix Size hint = self.sizeHint() self.setFixedSize(hint.width() * 1.2, hint.height())
def get_algo_cells(self, algo_name: str): """""" cells = self.algo_cells.get(algo_name, None) if not cells: stop_func = partial(self.stop_algo, algo_name=algo_name) stop_button = QtWidgets.QPushButton("停止") stop_button.clicked.connect(stop_func) name_cell = QtWidgets.QTableWidgetItem(algo_name) parameters_cell = QtWidgets.QTableWidgetItem() variables_cell = QtWidgets.QTableWidgetItem() self.insertRow(0) self.setCellWidget(0, 0, stop_button) self.setItem(0, 1, name_cell) self.setItem(0, 2, parameters_cell) self.setItem(0, 3, variables_cell) cells = { "name": name_cell, "parameters": parameters_cell, "variables": variables_cell } self.algo_cells[algo_name] = cells return cells
def init_ui(self): """""" form = QtWidgets.QFormLayout() # Add spread_name and name edit if add new strategy if self.class_name: self.setWindowTitle(f"添加策略:{self.class_name}") button_text = "添加" parameters = {"strategy_name": "", "spread_name": ""} parameters.update(self.parameters) else: self.setWindowTitle(f"参数编辑:{self.strategy_name}") button_text = "确定" parameters = self.parameters for name, value in parameters.items(): type_ = type(value) edit = QtWidgets.QLineEdit(str(value)) if type_ is int: validator = QtGui.QIntValidator() edit.setValidator(validator) elif type_ is float: validator = QtGui.QDoubleValidator() edit.setValidator(validator) form.addRow(f"{name} {type_}", edit) self.edits[name] = (edit, type_) button = QtWidgets.QPushButton(button_text) button.clicked.connect(self.accept) form.addRow(button) self.setLayout(form)
def init_ui(self): """ Initialize line edits and form layout based on setting. """ self.setMaximumWidth(400) form = QtWidgets.QFormLayout() for field_name, field_value in self.default_setting.items(): field_type = type(field_value) if field_type == list: widget = QtWidgets.QComboBox() widget.addItems(field_value) else: widget = QtWidgets.QLineEdit() display_name = NAME_DISPLAY_MAP.get(field_name, field_name) form.addRow(display_name, widget) self.widgets[field_name] = (widget, field_type) start_algo_button = QtWidgets.QPushButton("启动算法") start_algo_button.clicked.connect(self.start_algo) form.addRow(start_algo_button) load_csv_button = QtWidgets.QPushButton("CSV启动") load_csv_button.clicked.connect(self.load_csv) form.addRow(load_csv_button) form.addRow(QtWidgets.QLabel("")) form.addRow(QtWidgets.QLabel("")) form.addRow(QtWidgets.QLabel("")) self.setting_name_line = QtWidgets.QLineEdit() form.addRow("配置名称", self.setting_name_line) save_setting_button = QtWidgets.QPushButton("保存配置") save_setting_button.clicked.connect(self.save_setting) form.addRow(save_setting_button) for button in [ start_algo_button, load_csv_button, save_setting_button ]: button.setFixedHeight(button.sizeHint().height() * 2) self.setLayout(form)
def init_ui(self): """""" self.setWindowTitle("移除价差") self.setMinimumWidth(300) self.name_combo = QtWidgets.QComboBox() spreads = self.spread_engine.get_all_spreads() for spread in spreads: self.name_combo.addItem(spread.name) button_remove = QtWidgets.QPushButton("移除") button_remove.clicked.connect(self.remove_spread) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.name_combo) hbox.addWidget(button_remove) self.setLayout(hbox)
def init_ui(self): """""" self.setWindowTitle("参数优化结果") self.resize(1100, 500) # Creat table to show result table = QtWidgets.QTableWidget() table.setColumnCount(2) table.setRowCount(len(self.result_values)) table.setHorizontalHeaderLabels(["参数", self.target_display]) table.setEditTriggers(table.NoEditTriggers) table.verticalHeader().setVisible(False) table.horizontalHeader().setSectionResizeMode( 0, QtWidgets.QHeaderView.ResizeToContents) table.horizontalHeader().setSectionResizeMode( 1, QtWidgets.QHeaderView.Stretch) for n, tp in enumerate(self.result_values): setting, target_value, _ = tp setting_cell = QtWidgets.QTableWidgetItem(str(setting)) target_cell = QtWidgets.QTableWidgetItem(str(target_value)) setting_cell.setTextAlignment(QtCore.Qt.AlignCenter) target_cell.setTextAlignment(QtCore.Qt.AlignCenter) table.setItem(n, 0, setting_cell) table.setItem(n, 1, target_cell) # Create layout button = QtWidgets.QPushButton("保存") button.clicked.connect(self.save_csv) hbox = QtWidgets.QHBoxLayout() hbox.addStretch() hbox.addWidget(button) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(table) vbox.addLayout(hbox) self.setLayout(vbox)
def init_ui(self) -> None: """""" self.setWindowTitle("K线图表") self.tab: QtWidgets.QTabWidget = QtWidgets.QTabWidget() self.symbol_line: QtWidgets.QLineEdit = QtWidgets.QLineEdit() self.button = QtWidgets.QPushButton("新建图表") self.button.clicked.connect(self.new_chart) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(QtWidgets.QLabel("本地代码")) hbox.addWidget(self.symbol_line) hbox.addWidget(self.button) hbox.addStretch() vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(self.tab) self.setLayout(vbox)
def init_ui(self): """""" self.setWindowTitle("模拟交易") self.setFixedHeight(200) self.setFixedWidth(500) interval_spin = QtWidgets.QSpinBox() interval_spin.setMinimum(1) interval_spin.setValue(self.paper_engine.timer_interval) interval_spin.setSuffix(" 秒") interval_spin.valueChanged.connect( self.paper_engine.set_timer_interval) slippage_spin = QtWidgets.QSpinBox() slippage_spin.setMinimum(0) slippage_spin.setValue(self.paper_engine.trade_slippage) slippage_spin.setSuffix(" 跳") slippage_spin.valueChanged.connect( self.paper_engine.set_trade_slippage) instant_check = QtWidgets.QCheckBox() instant_check.setChecked(self.paper_engine.instant_trade) instant_check.stateChanged.connect(self.paper_engine.set_instant_trade) clear_button = QtWidgets.QPushButton("清空所有持仓") clear_button.clicked.connect(self.paper_engine.clear_position) clear_button.setFixedHeight(clear_button.sizeHint().height() * 2) form = QtWidgets.QFormLayout() form.addRow("市价委托和停止委托的成交滑点", slippage_spin) form.addRow("模拟交易持仓盈亏的计算频率", interval_spin) form.addRow("下单后立即使用当前盘口撮合", instant_check) form.addRow(clear_button) vbox = QtWidgets.QVBoxLayout() vbox.addStretch() vbox.addLayout(form) vbox.addStretch() self.setLayout(vbox)
def init_ui(self): """""" form = QtWidgets.QFormLayout() # Add vt_symbol and name edit if add new strategy self.setWindowTitle(f"策略参数配置:{self.class_name}") button_text = "确定" parameters = self.parameters for name, value in parameters.items(): type_ = type(value) edit = QtWidgets.QLineEdit(str(value)) if type_ is int: validator = QtGui.QIntValidator() edit.setValidator(validator) elif type_ is float: validator = QtGui.QDoubleValidator() edit.setValidator(validator) form.addRow(f"{name} {type_}", edit) self.edits[name] = (edit, type_) button = QtWidgets.QPushButton(button_text) button.clicked.connect(self.accept) form.addRow(button) widget = QtWidgets.QWidget() widget.setLayout(form) scroll = QtWidgets.QScrollArea() scroll.setWidgetResizable(True) scroll.setWidget(widget) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(scroll) self.setLayout(vbox)
def init_ui(self): """""" self.setWindowTitle("行情记录") self.resize(1000, 600) # Create widgets self.symbol_line = QtWidgets.QLineEdit() self.symbol_line.setFixedHeight(self.symbol_line.sizeHint().height() * 2) contracts = self.main_engine.get_all_contracts() self.vt_symbols = [contract.vt_symbol for contract in contracts] self.symbol_completer = QtWidgets.QCompleter(self.vt_symbols) self.symbol_completer.setFilterMode(QtCore.Qt.MatchContains) self.symbol_completer.setCompletionMode( self.symbol_completer.PopupCompletion) self.symbol_line.setCompleter(self.symbol_completer) add_bar_button = QtWidgets.QPushButton("添加") add_bar_button.clicked.connect(self.add_bar_recording) remove_bar_button = QtWidgets.QPushButton("移除") remove_bar_button.clicked.connect(self.remove_bar_recording) add_tick_button = QtWidgets.QPushButton("添加") add_tick_button.clicked.connect(self.add_tick_recording) remove_tick_button = QtWidgets.QPushButton("移除") remove_tick_button.clicked.connect(self.remove_tick_recording) self.bar_recording_edit = QtWidgets.QTextEdit() self.bar_recording_edit.setReadOnly(True) self.tick_recording_edit = QtWidgets.QTextEdit() self.tick_recording_edit.setReadOnly(True) self.log_edit = QtWidgets.QTextEdit() self.log_edit.setReadOnly(True) # Set layout grid = QtWidgets.QGridLayout() grid.addWidget(QtWidgets.QLabel("K线记录"), 0, 0) grid.addWidget(add_bar_button, 0, 1) grid.addWidget(remove_bar_button, 0, 2) grid.addWidget(QtWidgets.QLabel("Tick记录"), 1, 0) grid.addWidget(add_tick_button, 1, 1) grid.addWidget(remove_tick_button, 1, 2) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(QtWidgets.QLabel("本地代码")) hbox.addWidget(self.symbol_line) hbox.addWidget(QtWidgets.QLabel(" ")) hbox.addLayout(grid) hbox.addStretch() grid2 = QtWidgets.QGridLayout() grid2.addWidget(QtWidgets.QLabel("K线记录列表"), 0, 0) grid2.addWidget(QtWidgets.QLabel("Tick记录列表"), 0, 1) grid2.addWidget(self.bar_recording_edit, 1, 0) grid2.addWidget(self.tick_recording_edit, 1, 1) grid2.addWidget(self.log_edit, 2, 0, 1, 2) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) vbox.addLayout(grid2) self.setLayout(vbox)
def init_ui(self): """""" QLabel = QtWidgets.QLabel self.target_combo = QtWidgets.QComboBox() self.target_combo.addItems(list(self.DISPLAY_NAME_MAP.keys())) grid = QtWidgets.QGridLayout() grid.addWidget(QLabel("目标"), 0, 0) grid.addWidget(self.target_combo, 0, 1, 1, 3) grid.addWidget(QLabel("参数"), 1, 0) grid.addWidget(QLabel("开始"), 1, 1) grid.addWidget(QLabel("步进"), 1, 2) grid.addWidget(QLabel("结束"), 1, 3) # Add vt_symbol and name edit if add new strategy self.setWindowTitle(f"优化参数配置:{self.class_name}") validator = QtGui.QDoubleValidator() row = 2 for name, value in self.parameters.items(): type_ = type(value) if type_ not in [int, float]: continue start_edit = QtWidgets.QLineEdit(str(value)) step_edit = QtWidgets.QLineEdit(str(1)) end_edit = QtWidgets.QLineEdit(str(value)) for edit in [start_edit, step_edit, end_edit]: edit.setValidator(validator) grid.addWidget(QLabel(name), row, 0) grid.addWidget(start_edit, row, 1) grid.addWidget(step_edit, row, 2) grid.addWidget(end_edit, row, 3) self.edits[name] = { "type": type_, "start": start_edit, "step": step_edit, "end": end_edit } row += 1 parallel_button = QtWidgets.QPushButton("多进程优化") parallel_button.clicked.connect(self.generate_parallel_setting) grid.addWidget(parallel_button, row, 0, 1, 4) row += 1 ga_button = QtWidgets.QPushButton("遗传算法优化") ga_button.clicked.connect(self.generate_ga_setting) grid.addWidget(ga_button, row, 0, 1, 4) widget = QtWidgets.QWidget() widget.setLayout(grid) scroll = QtWidgets.QScrollArea() scroll.setWidgetResizable(True) scroll.setWidget(widget) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(scroll) self.setLayout(vbox)
def init_ui(self): """""" self.setWindowTitle("CTA回测") # Setting Part self.class_combo = QtWidgets.QComboBox() self.symbol_line = QtWidgets.QLineEdit("BTCUSDT.BINANCE") self.interval_combo = QtWidgets.QComboBox() for interval in Interval: if interval != Interval.TICK: self.interval_combo.addItem(interval.value) end_dt = datetime.now() start_dt = end_dt - timedelta(days=3 * 365) self.start_date_edit = QtWidgets.QDateEdit( QtCore.QDate(start_dt.year, start_dt.month, start_dt.day)) self.end_date_edit = QtWidgets.QDateEdit(QtCore.QDate.currentDate()) self.rate_line = QtWidgets.QLineEdit("0.0004") self.slippage_line = QtWidgets.QLineEdit("0.5") self.size_line = QtWidgets.QLineEdit("1") self.pricetick_line = QtWidgets.QLineEdit("0.01") self.capital_line = QtWidgets.QLineEdit("1000000") self.inverse_combo = QtWidgets.QComboBox() self.inverse_combo.addItems(["正向", "反向"]) backtesting_button = QtWidgets.QPushButton("开始回测") backtesting_button.clicked.connect(self.start_backtesting) optimization_button = QtWidgets.QPushButton("参数优化") optimization_button.clicked.connect(self.start_optimization) self.result_button = QtWidgets.QPushButton("优化结果") self.result_button.clicked.connect(self.show_optimization_result) self.result_button.setEnabled(False) downloading_button = QtWidgets.QPushButton("下载数据") downloading_button.clicked.connect(self.start_downloading) self.order_button = QtWidgets.QPushButton("委托记录") self.order_button.clicked.connect(self.show_backtesting_orders) self.order_button.setEnabled(False) self.trade_button = QtWidgets.QPushButton("成交记录") self.trade_button.clicked.connect(self.show_backtesting_trades) self.trade_button.setEnabled(False) self.daily_button = QtWidgets.QPushButton("每日盈亏") self.daily_button.clicked.connect(self.show_daily_results) self.daily_button.setEnabled(False) self.candle_button = QtWidgets.QPushButton("K线图表") self.candle_button.clicked.connect(self.show_candle_chart) self.candle_button.setEnabled(False) reload_button = QtWidgets.QPushButton("策略重载") reload_button.clicked.connect(self.reload_strategy_class) for button in [ backtesting_button, optimization_button, downloading_button, self.result_button, self.order_button, self.trade_button, self.daily_button, self.candle_button, reload_button ]: button.setFixedHeight(button.sizeHint().height() * 2) form = QtWidgets.QFormLayout() form.addRow("交易策略", self.class_combo) form.addRow("本地代码", self.symbol_line) form.addRow("K线周期", self.interval_combo) form.addRow("开始日期", self.start_date_edit) form.addRow("结束日期", self.end_date_edit) form.addRow("手续费率", self.rate_line) form.addRow("交易滑点", self.slippage_line) form.addRow("合约乘数", self.size_line) form.addRow("价格跳动", self.pricetick_line) form.addRow("回测资金", self.capital_line) form.addRow("合约模式", self.inverse_combo) result_grid = QtWidgets.QGridLayout() result_grid.addWidget(self.trade_button, 0, 0) result_grid.addWidget(self.order_button, 0, 1) result_grid.addWidget(self.daily_button, 1, 0) result_grid.addWidget(self.candle_button, 1, 1) left_vbox = QtWidgets.QVBoxLayout() left_vbox.addLayout(form) left_vbox.addWidget(backtesting_button) left_vbox.addWidget(downloading_button) left_vbox.addStretch() left_vbox.addLayout(result_grid) left_vbox.addStretch() left_vbox.addWidget(optimization_button) left_vbox.addWidget(self.result_button) left_vbox.addStretch() left_vbox.addWidget(reload_button) # Result part self.statistics_monitor = StatisticsMonitor() self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setMaximumHeight(400) self.chart = BacktesterChart() self.chart.setMinimumWidth(1000) self.trade_dialog = BacktestingResultDialog(self.main_engine, self.event_engine, "回测成交记录", BacktestingTradeMonitor) self.order_dialog = BacktestingResultDialog(self.main_engine, self.event_engine, "回测委托记录", BacktestingOrderMonitor) self.daily_dialog = BacktestingResultDialog(self.main_engine, self.event_engine, "回测每日盈亏", DailyResultMonitor) # Candle Chart self.candle_dialog = CandleChartDialog() # Layout vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.statistics_monitor) vbox.addWidget(self.log_monitor) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(left_vbox) hbox.addLayout(vbox) hbox.addWidget(self.chart) self.setLayout(hbox)
def init_ui(self): """""" self.setWindowTitle("算法交易") # Left side control widgets self.template_combo = QtWidgets.QComboBox() self.template_combo.currentIndexChanged.connect(self.show_algo_widget) form = QtWidgets.QFormLayout() form.addRow("算法", self.template_combo) widget = QtWidgets.QWidget() widget.setLayout(form) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(widget) for algo_template in self.algo_engine.algo_templates.values(): widget = AlgoWidget(self.algo_engine, algo_template) vbox.addWidget(widget) template_name = algo_template.__name__ display_name = algo_template.display_name self.algo_widgets[template_name] = widget self.template_combo.addItem(display_name, template_name) vbox.addStretch() stop_all_button = QtWidgets.QPushButton("全部停止") stop_all_button.setFixedHeight(stop_all_button.sizeHint().height() * 2) stop_all_button.clicked.connect(self.algo_engine.stop_all) vbox.addWidget(stop_all_button) # Right side monitor widgets active_algo_monitor = ActiveAlgoMonitor(self.algo_engine, self.event_engine) inactive_algo_monitor = InactiveAlgoMonitor(self.algo_engine, self.event_engine) tab1 = QtWidgets.QTabWidget() tab1.addTab(active_algo_monitor, "执行中") tab1.addTab(inactive_algo_monitor, "已结束") log_monitor = LogMonitor(self.event_engine) tab2 = QtWidgets.QTabWidget() tab2.addTab(log_monitor, "日志") setting_monitor = SettingMonitor(self.algo_engine, self.event_engine) setting_monitor.use_signal.connect(self.use_setting) tab3 = QtWidgets.QTabWidget() tab3.addTab(setting_monitor, "配置") grid = QtWidgets.QGridLayout() grid.addWidget(tab1, 0, 0, 1, 2) grid.addWidget(tab2, 1, 0) grid.addWidget(tab3, 1, 1) hbox2 = QtWidgets.QHBoxLayout() hbox2.addLayout(vbox) hbox2.addLayout(grid) self.setLayout(hbox2) self.show_algo_widget()
def init_ui(self): """""" self.setWindowTitle("创建价差") self.name_line = QtWidgets.QLineEdit() self.active_line = QtWidgets.QLineEdit() self.min_volume_combo = QtWidgets.QComboBox() self.min_volume_combo.addItems([ "1", "0.1", "0.01", "0.001", "0.0001", "0.00001", "0.000001", ]) self.grid = QtWidgets.QGridLayout() button_add = QtWidgets.QPushButton("创建价差") button_add.clicked.connect(self.add_spread) Label = QtWidgets.QLabel grid = QtWidgets.QGridLayout() grid.addWidget(Label("价差名称"), 0, 0) grid.addWidget(self.name_line, 0, 1, 1, 4) grid.addWidget(Label("主动腿代码"), 1, 0) grid.addWidget(self.active_line, 1, 1, 1, 4) grid.addWidget(Label("最小交易量"), 2, 0) grid.addWidget(self.min_volume_combo, 2, 1, 1, 4) grid.addWidget(Label(""), 3, 0) grid.addWidget(Label("本地代码"), 4, 1) grid.addWidget(Label("价格乘数"), 4, 2) grid.addWidget(Label("交易乘数"), 4, 3) grid.addWidget(Label("合约模式"), 4, 4) int_validator = QtGui.QIntValidator() leg_count = 5 for i in range(leg_count): symbol_line = QtWidgets.QLineEdit() price_line = QtWidgets.QLineEdit() price_line.setValidator(int_validator) trading_line = QtWidgets.QLineEdit() trading_line.setValidator(int_validator) inverse_combo = QtWidgets.QComboBox() inverse_combo.addItems(["正向", "反向"]) grid.addWidget(Label("腿{}".format(i + 1)), 5 + i, 0) grid.addWidget(symbol_line, 5 + i, 1) grid.addWidget(price_line, 5 + i, 2) grid.addWidget(trading_line, 5 + i, 3) grid.addWidget(inverse_combo, 5 + i, 4) d = { "symbol": symbol_line, "price": price_line, "trading": trading_line, "inverse": inverse_combo } self.leg_widgets.append(d) grid.addWidget(Label(""), 5 + leg_count, 0,) grid.addWidget(button_add, 6 + leg_count, 0, 1, 5) self.setLayout(grid)
def init_ui(self): """""" self.setWindowTitle("启动算法") self.setFrameShape(self.Box) self.setLineWidth(1) self.name_line = QtWidgets.QLineEdit() self.direction_combo = QtWidgets.QComboBox() self.direction_combo.addItems( [Direction.LONG.value, Direction.SHORT.value] ) self.offset_combo = QtWidgets.QComboBox() self.offset_combo.addItems( [Offset.NONE.value, Offset.OPEN.value, Offset.CLOSE.value] ) float_validator = QtGui.QDoubleValidator() self.price_line = QtWidgets.QLineEdit() self.price_line.setValidator(float_validator) self.volume_line = QtWidgets.QLineEdit() self.volume_line.setValidator(float_validator) int_validator = QtGui.QIntValidator() self.payup_line = QtWidgets.QLineEdit() self.payup_line.setValidator(int_validator) self.interval_line = QtWidgets.QLineEdit() self.interval_line.setValidator(int_validator) button_start = QtWidgets.QPushButton("启动") button_start.clicked.connect(self.start_algo) self.lock_combo = QtWidgets.QComboBox() self.lock_combo.addItems( ["否", "是"] ) self.class_combo = QtWidgets.QComboBox() add_button = QtWidgets.QPushButton("添加策略") add_button.clicked.connect(self.add_strategy) init_button = QtWidgets.QPushButton("全部初始化") init_button.clicked.connect(self.strategy_engine.init_all_strategies) start_button = QtWidgets.QPushButton("全部启动") start_button.clicked.connect(self.strategy_engine.start_all_strategies) stop_button = QtWidgets.QPushButton("全部停止") stop_button.clicked.connect(self.strategy_engine.stop_all_strategies) add_spread_button = QtWidgets.QPushButton("创建价差") add_spread_button.clicked.connect(self.add_spread) remove_spread_button = QtWidgets.QPushButton("移除价差") remove_spread_button.clicked.connect(self.remove_spread) form = QtWidgets.QFormLayout() form.addRow("价差", self.name_line) form.addRow("方向", self.direction_combo) form.addRow("开平", self.offset_combo) form.addRow("价格", self.price_line) form.addRow("数量", self.volume_line) form.addRow("超价", self.payup_line) form.addRow("间隔", self.interval_line) form.addRow("锁仓", self.lock_combo) form.addRow(button_start) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(form) vbox.addStretch() vbox.addWidget(self.class_combo) vbox.addWidget(add_button) vbox.addWidget(init_button) vbox.addWidget(start_button) vbox.addWidget(stop_button) vbox.addStretch() vbox.addWidget(add_spread_button) vbox.addWidget(remove_spread_button) self.setLayout(vbox)