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.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"] vt_symbol = self._data["vt_symbol"] class_name = self._data["class_name"] author = self._data["author"] label_text = ( f"{strategy_name} - {vt_symbol} ({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) -> 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.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("回测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) -> None: """""" self.setWindowTitle("投资组合") labels = [ "组合名称", "本地代码", "开盘仓位", "当前仓位", "交易盈亏", "持仓盈亏", "总盈亏", "多头成交", "空头成交" ] self.column_count = len(labels) self.tree = QtWidgets.QTreeWidget() self.tree.setColumnCount(self.column_count) self.tree.setHeaderLabels(labels) self.tree.header().setDefaultAlignment(QtCore.Qt.AlignCenter) self.tree.header().setStretchLastSection(False) delegate = TreeDelegate() self.tree.setItemDelegate(delegate) self.monitor = PortfolioTradeMonitor() expand_button = QtWidgets.QPushButton("全部展开") expand_button.clicked.connect(self.tree.expandAll) collapse_button = QtWidgets.QPushButton("全部折叠") collapse_button.clicked.connect(self.tree.collapseAll) resize_button = QtWidgets.QPushButton("调整列宽") resize_button.clicked.connect(self.resize_columns) interval_spin = QtWidgets.QSpinBox() interval_spin.setMinimum(1) interval_spin.setMaximum(60) interval_spin.setSuffix("秒") interval_spin.setValue(self.portfolio_engine.get_timer_interval()) interval_spin.valueChanged.connect( self.portfolio_engine.set_timer_interval) self.reference_combo = QtWidgets.QComboBox() self.reference_combo.setMinimumWidth(200) self.reference_combo.addItem("") self.reference_combo.currentIndexChanged.connect( self.set_reference_filter) hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(expand_button) hbox1.addWidget(collapse_button) hbox1.addWidget(resize_button) hbox1.addStretch() hbox1.addWidget(QtWidgets.QLabel("刷新频率")) hbox1.addWidget(interval_spin) hbox1.addStretch() hbox1.addWidget(QtWidgets.QLabel("组合成交")) hbox1.addWidget(self.reference_combo) hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(self.tree) hbox2.addWidget(self.monitor) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) self.setLayout(vbox)
def __init__(self, parent=None): """""" super().__init__() self.setWindowTitle("从CSV文件导入数据") self.setFixedWidth(300) self.setWindowFlags( (self.windowFlags() | QtCore.Qt.CustomizeWindowHint) & ~QtCore.Qt.WindowMaximizeButtonHint) file_button = QtWidgets.QPushButton("选择文件") file_button.clicked.connect(self.select_file) load_button = QtWidgets.QPushButton("确定") load_button.clicked.connect(self.accept) self.file_edit = QtWidgets.QLineEdit() self.symbol_edit = QtWidgets.QLineEdit() self.exchange_combo = QtWidgets.QComboBox() for i in Exchange: self.exchange_combo.addItem(str(i.name), i) self.interval_combo = QtWidgets.QComboBox() for i in Interval: if i != Interval.TICK: self.interval_combo.addItem(str(i.name), i) self.datetime_edit = QtWidgets.QLineEdit("datetime") self.open_edit = QtWidgets.QLineEdit("open") self.high_edit = QtWidgets.QLineEdit("high") self.low_edit = QtWidgets.QLineEdit("low") self.close_edit = QtWidgets.QLineEdit("close") self.volume_edit = QtWidgets.QLineEdit("volume") self.open_interest_edit = QtWidgets.QLineEdit("open_interest") self.format_edit = QtWidgets.QLineEdit("%Y-%m-%d %H:%M:%S") info_label = QtWidgets.QLabel("合约信息") info_label.setAlignment(QtCore.Qt.AlignCenter) head_label = QtWidgets.QLabel("表头信息") head_label.setAlignment(QtCore.Qt.AlignCenter) format_label = QtWidgets.QLabel("格式信息") format_label.setAlignment(QtCore.Qt.AlignCenter) form = QtWidgets.QFormLayout() form.addRow(file_button, self.file_edit) form.addRow(QtWidgets.QLabel()) form.addRow(info_label) form.addRow("代码", self.symbol_edit) form.addRow("交易所", self.exchange_combo) form.addRow("周期", self.interval_combo) form.addRow(QtWidgets.QLabel()) form.addRow(head_label) form.addRow("时间戳", self.datetime_edit) form.addRow("开盘价", self.open_edit) form.addRow("最高价", self.high_edit) form.addRow("最低价", self.low_edit) form.addRow("收盘价", self.close_edit) form.addRow("成交量", self.volume_edit) form.addRow("持仓量", self.open_interest_edit) form.addRow(QtWidgets.QLabel()) form.addRow(format_label) form.addRow("时间格式", self.format_edit) form.addRow(QtWidgets.QLabel()) form.addRow(load_button) self.setLayout(form)