def init_ui(self) -> None: """""" self.setMinimumWidth(300) self.setWindowTitle(f"添加【{self.rule_name}】雷达信号") self.type_combo = QtWidgets.QComboBox() self.type_combo.addItems([ SignalType.GREATER_THAN.value, SignalType.LESS_THAN.value, SignalType.EQUAL_TO.value, ]) self.target_line = QtWidgets.QLineEdit() self.target_line.setValidator(QtGui.QDoubleValidator()) self.sound_check = QtWidgets.QCheckBox() self.email_check = QtWidgets.QCheckBox() button = QtWidgets.QPushButton("添加") button.clicked.connect(self.add_signal) form = QtWidgets.QFormLayout() form.addRow("信号类型", self.type_combo) form.addRow("目标数值", self.target_line) form.addRow("声音通知", self.sound_check) form.addRow("邮件通知", self.email_check) form.addRow(button) self.setLayout(form)
def create_job_01_save_stock_day(self): # 🛠todo 继承QWidget , 写一个类, 里面有 进度条, checkbox ,和绑定到线程 self.qCheckBoxJob01_save_stock_day = QtWidgets.QCheckBox(self) self.qCheckBoxJob01_save_stock_day.setText("JOB01 日线数据 📊") self.qProgressJob01_save_stock_day = QtWidgets.QProgressBar(self) self.qProgressJob01_save_stock_day.setMaximum(100) # 🛠todo 应该有更加好的实现方式, 把progress bar 绑定到 任务对象中,这样写实在是太粗糙了。 # 把job 对象 绑定到界面中 , 继承 QCheckBox 把相关到对象线程 和 widget 绑定。 self.job01_save_stock_day = QA_GUI_DateFetch_SU_job01_stock_day() self.job01_save_stock_day.setLoggingUIWidget(self.logDisplay) self.job01_save_stock_day.setProgressUIWidget( self.qProgressJob01_save_stock_day) self.job01_save_stock_day.setCheckboxUIWidget( self.qCheckBoxJob01_save_stock_day) self.job01_save_stock_day.connectSignalSlot() # 🛠todo 进一步封装 hardcode 1 2 3 不是一种好的的做法 self.qCheckboxWidgetList.append(self.qCheckBoxJob01_save_stock_day) self.qProgressWidgetList.append(self.qProgressJob01_save_stock_day) self.allSubJobList.append(self.job01_save_stock_day) # 🛠todo 进一步封装 hardcode 1 2 3 不是一种好的的做法 self.taskListLayout.addWidget(self.qCheckBoxJob01_save_stock_day) self.taskListLayout.addWidget(self.qProgressJob01_save_stock_day)
def create_job_11_save_stock_transaction(self): self.qCheckBoxJob11_save_stock_transaction = QtWidgets.QCheckBox(self) self.qCheckBoxJob11_save_stock_transaction.setText( "JOB11 股票3秒的tick数据 📊") self.qProgressJob11_save_stock_transaction = QtWidgets.QProgressBar( self) self.qProgressJob11_save_stock_transaction.setMaximum( 10000) # 最小变动单位 0.01 self.job11_save_stock_transaction = QA_GUI_DateFetch_SU_job11_stock_transaction( ) self.job11_save_stock_transaction.setLoggingUIWidget(self.logDisplay) self.job11_save_stock_transaction.setProgressUIWidget( self.qProgressJob11_save_stock_transaction) self.job11_save_stock_transaction.setCheckboxUIWidget( self.qCheckBoxJob11_save_stock_transaction) self.job11_save_stock_transaction.connectSignalSlot() self.qCheckboxWidgetList.append( self.qCheckBoxJob11_save_stock_transaction) self.qProgressWidgetList.append( self.qProgressJob11_save_stock_transaction) self.allSubJobList.append(self.job11_save_stock_transaction) self.taskListLayout.addWidget( self.qCheckBoxJob11_save_stock_transaction) self.taskListLayout.addWidget( self.qProgressJob11_save_stock_transaction)
def init_ui(self): self.setWindowTitle("策略执行回顾") self.resize(1100, 600) self.datetime_from = QtWidgets.QDateTimeEdit() self.datetime_to = QtWidgets.QDateTimeEdit() today = dt.date.today() self.datetime_from.setDateTime( dt.datetime(year=today.year, month=today.month, day=today.day)) self.datetime_to.setDateTime( dt.datetime(year=today.year, month=today.month, day=today.day, hour=23, minute=59)) # self.query_btn = QtWidgets.QPushButton("查询") self.skip_checkbox = QtWidgets.QCheckBox('AutoSkip') self.skip_checkbox.setToolTip('自动过滤未平仓订单') self.skip_checkbox.clicked.connect(self.update_strategy_data) self.datetime_from.editingFinished.connect(self.update_strategy_data) self.datetime_to.editingFinished.connect(self.update_strategy_data) # self.query_btn.clicked.connect(self.update_strategy_data) self.tab = QtWidgets.QTabWidget() self.strategy_monitor = StrategyMonitor(self.main_engine, self.event_engine) self.strategy_monitor.cellDoubleClicked.connect(self.show_trade_chart) # self.strategy_monitor.cellClicked.connect(self.check_strategies) self.strategy_monitor.resize(1000, 600) self.tab.addTab(self.strategy_monitor, '策略统计') self.trade = TradeChartDialog(self.main_engine, self.event_engine) time_hbox = QtWidgets.QHBoxLayout() time_hbox.addWidget(self.datetime_from, 3) time_hbox.addWidget(self.datetime_to, 3) time_hbox.addWidget(self.skip_checkbox, 1) # time_hbox.addWidget(self.query_btn, 1) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(time_hbox) vbox.addWidget(self.tab) self.setLayout(vbox) self.update_strategy_data()
def init_ui(self) -> None: """""" self.setWindowTitle("波动率曲线") # Create checkbox for each chain hbox = QtWidgets.QHBoxLayout() portfolio = self.option_engine.get_portfolio(self.portfolio_name) chain_symbols = list(portfolio.chains.keys()) chain_symbols.sort() hbox.addStretch() for chain_symbol in chain_symbols: chain_check = QtWidgets.QCheckBox() chain_check.setText(chain_symbol.split(".")[0]) chain_check.setChecked(True) chain_check.stateChanged.connect(self.update_curve_visible) hbox.addWidget(chain_check) self.chain_checks[chain_symbol] = chain_check hbox.addStretch() # Create graphics window pg.setConfigOptions(antialias=True) graphics_window = pg.GraphicsWindow() self.impv_chart = graphics_window.addPlot(title="隐含波动率曲线") self.impv_chart.showGrid(x=True, y=True) self.impv_chart.setLabel("left", "波动率") self.impv_chart.setLabel("bottom", "行权价") self.impv_chart.addLegend() self.impv_chart.setMenuEnabled(False) self.impv_chart.setMouseEnabled(False, False) for chain_symbol in chain_symbols: self.add_impv_curve(chain_symbol) # Set Layout vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(graphics_window) self.setLayout(vbox)
def create_job_02_save_stock_xdxr(self): self.qCheckBoxJob02_save_stock_xdxr = QtWidgets.QCheckBox(self) self.qCheckBoxJob02_save_stock_xdxr.setText("JOB02 除权除息数据 📊") self.qProgressJob02_save_stock_xdxr = QtWidgets.QProgressBar(self) self.qProgressJob02_save_stock_xdxr.setMaximum(100) self.job02_save_stock_xdxr = QA_GUI_DateFetch_SU_job02_stock_xdxr() self.job02_save_stock_xdxr.setLoggingUIWidget(self.logDisplay) self.job02_save_stock_xdxr.setProgressUIWidget( self.qProgressJob02_save_stock_xdxr) self.job02_save_stock_xdxr.setCheckboxUIWidget( self.qCheckBoxJob02_save_stock_xdxr) self.job02_save_stock_xdxr.connectSignalSlot() self.qCheckboxWidgetList.append(self.qCheckBoxJob02_save_stock_xdxr) self.qProgressWidgetList.append(self.qProgressJob02_save_stock_xdxr) self.allSubJobList.append(self.job02_save_stock_xdxr) self.taskListLayout.addWidget(self.qCheckBoxJob02_save_stock_xdxr) self.taskListLayout.addWidget(self.qProgressJob02_save_stock_xdxr)
def create_job_10_save_stock_info(self): self.qCheckBoxJob10_save_stock_info = QtWidgets.QCheckBox(self) self.qCheckBoxJob10_save_stock_info.setText("JOB10 股票基本数据 📊") self.qProgressJob10_save_stock_info = QtWidgets.QProgressBar(self) self.qProgressJob10_save_stock_info.setMaximum(10000) # 最小变动单位 0.01 self.job10_save_stock_info = QA_GUI_DateFetch_SU_job10_stock_info() self.job10_save_stock_info.setLoggingUIWidget(self.logDisplay) self.job10_save_stock_info.setProgressUIWidget( self.qProgressJob10_save_stock_info) self.job10_save_stock_info.setCheckboxUIWidget( self.qCheckBoxJob10_save_stock_info) self.job10_save_stock_info.connectSignalSlot() self.qCheckboxWidgetList.append(self.qCheckBoxJob10_save_stock_info) self.qProgressWidgetList.append(self.qProgressJob10_save_stock_info) self.allSubJobList.append(self.job10_save_stock_info) self.taskListLayout.addWidget(self.qCheckBoxJob10_save_stock_info) self.taskListLayout.addWidget(self.qProgressJob10_save_stock_info)
def create_job_07_save_etf_min(self): self.qCheckBoxJob07_save_etf_min = QtWidgets.QCheckBox(self) self.qCheckBoxJob07_save_etf_min.setText("JOB07 ETF分钟数据 📊") self.qProgressJob07_save_etf_min = QtWidgets.QProgressBar(self) self.qProgressJob07_save_etf_min.setMaximum(10000) # 最小变动单位 0.01 self.job07_save_etf_min = QA_GUI_DateFetch_SU_job07_etf_min() self.job07_save_etf_min.setLoggingUIWidget(self.logDisplay) self.job07_save_etf_min.setProgressUIWidget( self.qProgressJob07_save_etf_min) self.job07_save_etf_min.setCheckboxUIWidget( self.qCheckBoxJob07_save_etf_min) self.job07_save_etf_min.connectSignalSlot() self.qCheckboxWidgetList.append(self.qCheckBoxJob07_save_etf_min) self.qProgressWidgetList.append(self.qProgressJob07_save_etf_min) self.allSubJobList.append(self.job07_save_etf_min) self.taskListLayout.addWidget(self.qCheckBoxJob07_save_etf_min) self.taskListLayout.addWidget(self.qProgressJob07_save_etf_min)
def create_job_04_save_index_day(self): self.qCheckBoxJob04_save_index_day = QtWidgets.QCheckBox(self) self.qCheckBoxJob04_save_index_day.setText("JOB04 指数日线数据 📊") self.qProgressJob04_save_index_day = QtWidgets.QProgressBar(self) self.qProgressJob04_save_index_day.setMaximum(10000) # 最小变动单位 0.01 self.job04_save_index_day = QA_GUI_DateFetch_SU_job04_index_day() self.job04_save_index_day.setLoggingUIWidget(self.logDisplay) self.job04_save_index_day.setProgressUIWidget( self.qProgressJob04_save_index_day) self.job04_save_index_day.setCheckboxUIWidget( self.qCheckBoxJob04_save_index_day) self.job04_save_index_day.connectSignalSlot() self.qCheckboxWidgetList.append(self.qCheckBoxJob04_save_index_day) self.qProgressWidgetList.append(self.qProgressJob04_save_index_day) self.allSubJobList.append(self.job04_save_index_day) self.taskListLayout.addWidget(self.qCheckBoxJob04_save_index_day) self.taskListLayout.addWidget(self.qProgressJob04_save_index_day)
def create_job01_save_stock_week(self): self.qCheckBoxJob01_save_stock_week = QtWidgets.QCheckBox(self) self.qCheckBoxJob01_save_stock_week.setText("JOB01 周线数据 📊") self.qProgressJob01_save_stock_week = QtWidgets.QProgressBar(self) self.qProgressJob01_save_stock_week.setMaximum(100) # 🛠todo 不知道为何,QThread 继承的 都不执行 __init__ self.job01_save_stock_week = QA_GUI_DateFetch_SU_job01_stock_week() self.job01_save_stock_week.setLoggingUIWidget(self.logDisplay) self.job01_save_stock_week.setProgressUIWidget( self.qProgressJob01_save_stock_week) self.job01_save_stock_week.setCheckboxUIWidget( self.qCheckBoxJob01_save_stock_week) self.job01_save_stock_week.connectSignalSlot() self.qCheckboxWidgetList.append(self.qCheckBoxJob01_save_stock_week) self.qProgressWidgetList.append(self.qProgressJob01_save_stock_week) self.allSubJobList.append(self.job01_save_stock_week) self.taskListLayout.addWidget(self.qCheckBoxJob01_save_stock_week) self.taskListLayout.addWidget(self.qProgressJob01_save_stock_week)
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) -> 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()