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("市场雷达") self.radar_monitor = RadarMonitor(self.radar_engine) self.signal_monitor = SignalMonitor(self.radar_engine) self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) self.name_line = QtWidgets.QLineEdit() self.formula_line = QtWidgets.QLineEdit() self.a_line = QtWidgets.QLineEdit() self.b_line = QtWidgets.QLineEdit() self.c_line = QtWidgets.QLineEdit() self.d_line = QtWidgets.QLineEdit() self.e_line = QtWidgets.QLineEdit() self.ndigits_spin = QtWidgets.QSpinBox() self.ndigits_spin.setMinimum(0) self.ndigits_spin.setValue(2) add_button = QtWidgets.QPushButton("添加") add_button.clicked.connect(self.add_rule) add_button.setFixedHeight(add_button.sizeHint().height() * 2) edit_button = QtWidgets.QPushButton("修改") edit_button.clicked.connect(self.edit_rule) edit_button.setFixedHeight(edit_button.sizeHint().height() * 2) load_button = QtWidgets.QPushButton("导入CSV") load_button.clicked.connect(self.load_csv) form = QtWidgets.QFormLayout() form.addRow("名称", self.name_line) form.addRow("公式", self.formula_line) form.addRow("A", self.a_line) form.addRow("B", self.b_line) form.addRow("C", self.c_line) form.addRow("D", self.d_line) form.addRow("E", self.e_line) form.addRow("小数", self.ndigits_spin) form.addRow(add_button) form.addRow(edit_button) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(form) vbox.addStretch() vbox.addWidget(load_button) left_widget = QtWidgets.QWidget() left_widget.setLayout(vbox) left_widget.setFixedWidth(300) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(left_widget) hbox.addWidget(self.signal_monitor) hbox.addWidget(self.log_monitor) vbox2 = QtWidgets.QVBoxLayout() vbox2.addWidget(self.radar_monitor) vbox2.addLayout(hbox) self.setLayout(vbox2)
def init_ui(self) -> None: """""" self.setWindowTitle(f"{self.portfolio_name}组合配置") portfolio_setting = self.option_engine.get_portfolio_setting( self.portfolio_name) form = QtWidgets.QFormLayout() # Model Combo self.model_name_combo = QtWidgets.QComboBox() self.model_name_combo.addItems(list(PRICING_MODELS.keys())) model_name = portfolio_setting.get("model_name", "") if model_name: self.model_name_combo.setCurrentIndex( self.model_name_combo.findText(model_name)) form.addRow("定价模型", self.model_name_combo) # Interest rate spin self.interest_rate_spin = QtWidgets.QDoubleSpinBox() self.interest_rate_spin.setMinimum(0) self.interest_rate_spin.setMaximum(20) self.interest_rate_spin.setDecimals(1) self.interest_rate_spin.setSuffix("%") interest_rate = portfolio_setting.get("interest_rate", 0.02) self.interest_rate_spin.setValue(interest_rate * 100) form.addRow("年化利率", self.interest_rate_spin) # Inverse combo self.inverse_combo = QtWidgets.QComboBox() self.inverse_combo.addItems(["正向", "反向"]) inverse = portfolio_setting.get("inverse", False) if inverse: self.inverse_combo.setCurrentIndex(1) else: self.inverse_combo.setCurrentIndex(0) form.addRow("合约模式", self.inverse_combo) # Greeks decimals precision self.precision_spin = QtWidgets.QSpinBox() self.precision_spin.setMinimum(0) self.precision_spin.setMaximum(10) precision = portfolio_setting.get("precision", 0) self.precision_spin.setValue(precision) form.addRow("Greeks小数位", self.precision_spin) # Underlying for each chain self.combos: Dict[str, QtWidgets.QComboBox] = {} portfolio = self.option_engine.get_portfolio(self.portfolio_name) underlying_symbols = self.option_engine.get_underlying_symbols( self.portfolio_name) chain_symbols = list(portfolio._chains.keys()) chain_symbols.sort() chain_underlying_map = portfolio_setting.get("chain_underlying_map", {}) for chain_symbol in chain_symbols: combo = QtWidgets.QComboBox() combo.addItem("") combo.addItems(underlying_symbols) underlying_symbol = chain_underlying_map.get(chain_symbol, "") if underlying_symbol: combo.setCurrentIndex(combo.findText(underlying_symbol)) form.addRow(chain_symbol, combo) self.combos[chain_symbol] = combo # Set layout button = QtWidgets.QPushButton("确定") button.clicked.connect(self.update_portfolio_setting) form.addRow(button) self.setLayout(form)
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_ui(self): """""" self.setWindowTitle("行情记录") self.resize(1000, 600) # Create widgets self.symbol_line = QtWidgets.QLineEdit() self.interval_spin = QtWidgets.QSpinBox() self.interval_spin.setMinimum(1) self.interval_spin.setMaximum(60) self.interval_spin.setValue(self.recorder_engine.timer_interval) self.interval_spin.setSuffix("秒") self.interval_spin.valueChanged.connect(self.set_interval) 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) form = QtWidgets.QFormLayout() form.addRow("本地代码", self.symbol_line) form.addRow("写入间隔", self.interval_spin) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(form) 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)