def init_ui(self): """""" self.setWindowTitle(f"{self.daily_trade_result.name}交易明细") self.resize(1100, 500) table = QtWidgets.QTableWidget() fields = self.trade_values[0].__dataclass_fields__ table.setColumnCount(len(fields)) table.setRowCount(len(self.trade_values)) table.setHorizontalHeaderLabels(fields.keys()) table.verticalHeader().setVisible(False) for r, tradeData in enumerate(self.trade_values): for c, k in enumerate(fields.keys()): v = getattr(tradeData, k) if isinstance(v, Enum): v = v.value cell = QtWidgets.QTableWidgetItem(str(v)) cell.setFlags(QtCore.Qt.ItemIsEnabled) cell.setTextAlignment(QtCore.Qt.AlignCenter) table.setItem(r, c, cell) table.doubleClicked.connect(self.visulize) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(table) self.setLayout(vbox)
def init_ui(self): """""" self.setWindowTitle("参数优化结果") self.resize(1100, 500) 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) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(table) self.setLayout(vbox)
def init_ui(self): """""" self.setWindowTitle("回测每日明细") self.resize(1300, 800) table = QtWidgets.QTableWidget() table.setColumnCount(18) table.setRowCount(len(self.daily_df)) table.setHorizontalHeaderLabels(self.daily_df.columns) table.setVerticalHeaderLabels(str(i) for i in self.daily_df.index) table.verticalHeader().setVisible(True) for r, (d, s) in enumerate(self.daily_df.iterrows()): for c, (t, v) in enumerate(s.items()): if t == 'trades': cell = QtWidgets.QTableWidgetItem("交易明细") cell.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) else: cell = QtWidgets.QTableWidgetItem(str(v)) cell.setFlags(QtCore.Qt.ItemIsEnabled) cell.setTextAlignment(QtCore.Qt.AlignCenter) table.setItem(r, c, cell) table.itemDoubleClicked.connect(self.show_trade_data) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(table) self.setLayout(vbox)
def init_table(self) -> None: """""" labels = ["时间", "开盘价", "最高价", "最低价", "收盘价", "成交量", "持仓量"] self.table = QtWidgets.QTableWidget() self.table.setColumnCount(len(labels)) self.table.setHorizontalHeaderLabels(labels) self.table.verticalHeader().setVisible(False) self.table.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.ResizeToContents)
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(f"{target_value:.2f}") 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("波动率管理") tab = QtWidgets.QTabWidget() vbox = QtWidgets.QVBoxLayout() vbox.addWidget(tab) self.setLayout(vbox) self.chain_symbols = list(self.portfolio.chains.keys()) self.chain_symbols.sort() for chain_symbol in self.chain_symbols: chain = self.portfolio.get_chain(chain_symbol) table = QtWidgets.QTableWidget() table.setEditTriggers(table.NoEditTriggers) table.verticalHeader().setVisible(False) table.setColumnCount(4) table.setRowCount(len(chain.indexes)) table.setHorizontalHeaderLabels(["行权价", "中值隐波", "定价隐波", "执行拟合"]) table.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.Stretch) for row, index in enumerate(chain.indexes): index_cell = IndexCell(index) mid_impv_cell = MonitorCell("") set_func = partial(self.set_pricing_impv, chain_symbol=chain_symbol, index=index) pricing_impv_spin = VolatilityDoubleSpinBox() pricing_impv_spin.setAlignment(QtCore.Qt.AlignCenter) pricing_impv_spin.valueChanged.connect(set_func) check = QtWidgets.QCheckBox() check_hbox = QtWidgets.QHBoxLayout() check_hbox.setAlignment(QtCore.Qt.AlignCenter) check_hbox.addWidget(check) check_widget = QtWidgets.QWidget() check_widget.setLayout(check_hbox) table.setItem(row, 0, index_cell) table.setItem(row, 1, mid_impv_cell) table.setCellWidget(row, 2, pricing_impv_spin) table.setCellWidget(row, 3, check_widget) cells = { "mid_impv": mid_impv_cell, "pricing_impv": pricing_impv_spin, "check": check } self.cells[(chain_symbol, index)] = cells reset_func = partial(self.reset_pricing_impv, chain_symbol=chain_symbol) button_reset = QtWidgets.QPushButton("重置") button_reset.clicked.connect(reset_func) fit_func = partial(self.fit_pricing_impv, chain_symbol=chain_symbol) button_fit = QtWidgets.QPushButton("拟合") button_fit.clicked.connect(fit_func) increase_func = partial(self.increase_pricing_impv, chain_symbol=chain_symbol) button_increase = QtWidgets.QPushButton("+0.1%") button_increase.clicked.connect(increase_func) decrease_func = partial(self.decrease_pricing_impv, chain_symbol=chain_symbol) button_decrease = QtWidgets.QPushButton("-0.1%") button_decrease.clicked.connect(decrease_func) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(button_reset) hbox.addWidget(button_fit) hbox.addWidget(button_increase) hbox.addWidget(button_decrease) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(table) chain_widget = QtWidgets.QWidget() chain_widget.setLayout(vbox) tab.addTab(chain_widget, chain_symbol) self.update_pricing_impv(chain_symbol) self.default_foreground = mid_impv_cell.foreground() self.default_background = mid_impv_cell.background() table.resizeRowsToContents()
def initUI(self): ''' |--------------|------------| | | | | | | |task list1 | log display| |task list1 | | |task list1 | | |task list1 | | |------------- |------------| | button | |---------------------------| :return: ''' self.setWindowIconText("获取数据任务列表") self.setObjectName("data_maintenance") QtCore.QMetaObject.connectSlotsByName(self) # 下面将输出重定向到textEdit中 sys.stdout = EmittingStream(textWritten=self.outputWritten) sys.stderr = EmittingStream(textWritten=self.outputWritten) # 🛠todo 日志显示,用table view list 加入搜索的功能, 行号等, 彩色显示, self.logDisplay = QtWidgets.QTableWidget(self) self.logDisplay.setObjectName("tableForLog") self.logDisplay.setColumnCount(2) self.logDisplay.setHorizontalHeaderLabels(['日志内容', '来源']) self.logDisplay.setColumnWidth(0, 700) self.logDisplay.setColumnWidth(1, 100) self.gridLayut = QtWidgets.QGridLayout() self.taskListLayout = QtWidgets.QVBoxLayout() self.logListLayout = QtWidgets.QVBoxLayout() self.buttonListLayout = QtWidgets.QHBoxLayout() self.gridLayut.addLayout(self.taskListLayout, 0, 0, 1, 1) self.gridLayut.addLayout(self.logListLayout, 0, 1, 1, 1) self.gridLayut.setColumnMinimumWidth(1, 1400) ''' void QGridLayout::addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment()) This is an overloaded function. This version adds the layout layout to the cell grid, spanning multiple rows/columns. The cell will start at row, column spanning rowSpan rows and columnSpan columns. If rowSpan and/or columnSpan is -1, then the layout will extend to the bottom and/or right edge, respectively. ''' self.gridLayut.addLayout(self.buttonListLayout, 1, 0, 1, 3) #🛠todo QT 报错 QWidget::setLayout: Attempting to set QLayout "" on QWidget "", which already has a layout self.setLayout(self.gridLayut) self.qCheckboxWidgetList = [] self.qProgressWidgetList = [] self.allSubJobList = [] # 🛠todo this is really stupid 01 02 03 04,... should use template ? does python have some template feature like c++ ####################################################################### self.create_job_08_save_stock_list() ####################################################################### self.create_job_09_save_stock_block() ####################################################################### self.create_job_10_save_stock_info() ####################################################################### self.create_job_01_save_stock_day() ####################################################################### self.create_job_02_save_stock_xdxr() ####################################################################### self.create_job_03_save_stock_min() ####################################################################### self.create_job_04_save_index_day() ####################################################################### self.create_job_05_save_index_min() ####################################################################### self.create_job_06_save_etf_day() ####################################################################### self.create_job_07_save_etf_min() ####################################################################### self.create_job_11_save_stock_transaction() ####################################################################### self.selectedSubTask = QA_GUI_Selected_TaskQueue(self.logDisplay) self.selectedSubTask.trigger_all_task_start.connect( self.uiAllTaskStart) self.selectedSubTask.trigger_all_task_done.connect(self.uiAllTaskDone) ####################################################################### self.logListLayout.addWidget(self.logDisplay) self.bntExecute = QtWidgets.QPushButton(self) self.bntExecute.setText("执行选中的任务 🐌") self.buttonListLayout.addWidget(self.bntExecute) # 🛠todo 没有实现! self.bntStopTack = QtWidgets.QPushButton(self) self.bntStopTack.setText("停止执行任务 🚫") self.buttonListLayout.addWidget(self.bntStopTack) self.bntClearLog = QtWidgets.QPushButton(self) self.bntClearLog.setText("清除日志 🗑") self.buttonListLayout.addWidget(self.bntClearLog) self.bntExecute.clicked.connect(self.doSelectedTask) self.bntStopTack.clicked.connect(self.doStopTask) layout = QtWidgets.QFormLayout() layout.setLabelAlignment(QtCore.Qt.AlignLeft) layout.addRow("保存日线数据 ", QtWidgets.QProgressBar(self)) layout.addRow("保存日除权出息数据 ", QtWidgets.QProgressBar(self)) layout.addRow("保存分钟线数据", QtWidgets.QProgressBar(self)) layout.addRow("保存指数数据", QtWidgets.QProgressBar(self)) layout.addRow("保存指数线数据 ", QtWidgets.QProgressBar(self)) layout.addRow("保存ETF日线数据 ", QtWidgets.QProgressBar(self)) layout.addRow("保存ET分钟数据", QtWidgets.QProgressBar(self)) layout.addRow("保存股票列表", QtWidgets.QProgressBar(self)) layout.addRow("保存板块", QtWidgets.QProgressBar(self)) layout.addRow("保存tushare数据接口获取的股票列表", QtWidgets.QProgressBar(self)) layout.addRow("保存高级财务数据(自1996年开始)", QtWidgets.QProgressBar(self)) layout.addRow("保存50ETF期权日线数据(不包括已经摘牌的数据)", QtWidgets.QProgressBar(self)) qPushBnt = QtWidgets.QPushButton(self) qPushBnt.setText("开始执行") layout.addRow("选中需要执行的任务", qPushBnt)