def init_ui(self) -> None: """""" self.setWindowTitle("组合策略") # 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.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) 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) # 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) hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(scroll_area) hbox2.addWidget(self.log_monitor) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) self.setLayout(vbox)
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 init_ui(self): """""" self.setWindowTitle("价差交易") self.algo_dialog = SpreadAlgoWidget(self.spread_engine) algo_group = self.create_group("交易", self.algo_dialog) algo_group.setMaximumWidth(300) self.data_monitor = SpreadDataMonitor(self.main_engine, self.event_engine) self.log_monitor = SpreadLogMonitor(self.main_engine, self.event_engine) self.algo_monitor = SpreadAlgoMonitor(self.spread_engine) self.strategy_monitor = SpreadStrategyMonitor(self.spread_engine) grid = QtWidgets.QGridLayout() grid.addWidget(self.create_group("价差", self.data_monitor), 0, 0) grid.addWidget(self.create_group("日志", self.log_monitor), 1, 0) grid.addWidget(self.create_group("算法", self.algo_monitor), 0, 1) grid.addWidget(self.create_group("策略", self.strategy_monitor), 1, 1) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(algo_group) hbox.addLayout(grid) self.setLayout(hbox)
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) -> None: """""" self.setWindowTitle("数据管理") self.init_tree() self.init_table() self.init_child() refresh_button = QtWidgets.QPushButton("刷新") refresh_button.clicked.connect(self.refresh_tree) import_button = QtWidgets.QPushButton("导入数据") import_button.clicked.connect(self.import_data) update_button = QtWidgets.QPushButton("更新数据") update_button.clicked.connect(self.update_data) download_button = QtWidgets.QPushButton("下载数据") download_button.clicked.connect(self.download_data) hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(refresh_button) hbox1.addStretch() hbox1.addWidget(import_button) hbox1.addWidget(update_button) hbox1.addWidget(download_button) hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(self.tree) hbox2.addWidget(self.table) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) self.setLayout(vbox)
def init_ui(self): """""" self.setFixedHeight(300) self.setFrameShape(self.Box) self.setLineWidth(1) self.init_button = QtWidgets.QPushButton("初始化") self.init_button.clicked.connect(self.init_strategy) self.start_button = QtWidgets.QPushButton("启动") self.start_button.clicked.connect(self.start_strategy) self.start_button.setEnabled(False) self.stop_button = QtWidgets.QPushButton("停止") self.stop_button.clicked.connect(self.stop_strategy) self.stop_button.setEnabled(False) self.edit_button = QtWidgets.QPushButton("编辑") self.edit_button.clicked.connect(self.edit_strategy) self.remove_button = QtWidgets.QPushButton("移除") self.remove_button.clicked.connect(self.remove_strategy) strategy_name = self._data["strategy_name"] class_name = self._data["class_name"] author = self._data["author"] label_text = (f"{strategy_name} - ({class_name} by {author})") label = QtWidgets.QLabel(label_text) label.setAlignment(QtCore.Qt.AlignCenter) self.parameters_monitor = DataMonitor(self._data["parameters"]) self.variables_monitor = DataMonitor(self._data["variables"]) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.init_button) hbox.addWidget(self.start_button) hbox.addWidget(self.stop_button) hbox.addWidget(self.edit_button) hbox.addWidget(self.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("参数优化结果") 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): """""" 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) -> 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("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("回测K线图表") self.resize(1400, 800) # Create chart widget self.chart = ChartWidget() self.chart.add_plot("candle", hide_x_axis=True) self.chart.add_plot("volume", maximum_height=200) self.chart.add_item(CandleItem, "candle", "candle") self.chart.add_item(VolumeItem, "volume", "volume") self.chart.add_cursor() # Create help widget text1 = "红色虚线 —— 盈利交易" label1 = QtWidgets.QLabel(text1) label1.setStyleSheet("color:red") text2 = "绿色虚线 —— 亏损交易" label2 = QtWidgets.QLabel(text2) label2.setStyleSheet("color:#00FF00") text3 = "黄色向上箭头 —— 买入开仓 Buy" label3 = QtWidgets.QLabel(text3) label3.setStyleSheet("color:yellow") text4 = "黄色向下箭头 —— 卖出平仓 Sell" label4 = QtWidgets.QLabel(text4) label4.setStyleSheet("color:yellow") text5 = "紫红向下箭头 —— 卖出开仓 Short" label5 = QtWidgets.QLabel(text5) label5.setStyleSheet("color:magenta") text6 = "紫红向上箭头 —— 买入平仓 Cover" label6 = QtWidgets.QLabel(text6) label6.setStyleSheet("color:magenta") hbox1 = QtWidgets.QHBoxLayout() hbox1.addStretch() hbox1.addWidget(label1) hbox1.addStretch() hbox1.addWidget(label2) hbox1.addStretch() hbox2 = QtWidgets.QHBoxLayout() hbox2.addStretch() hbox2.addWidget(label3) hbox2.addStretch() hbox2.addWidget(label4) hbox2.addStretch() hbox3 = QtWidgets.QHBoxLayout() hbox3.addStretch() hbox3.addWidget(label5) hbox3.addStretch() hbox3.addWidget(label6) hbox3.addStretch() # Set layout vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.chart) vbox.addLayout(hbox1) vbox.addLayout(hbox2) vbox.addLayout(hbox3) 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): """""" 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()