def init_ui(self): # 函数加载器 loader = FunctionLoader() # 得到并拼凑 function.xlsx 文件路径 running_path = Path(sys.argv[0]).parent function_file = running_path.joinpath("function.xlsx") # 加载函数描述文件 loader.load_excel(function_file) # 得到实际内容 self.function_dict = loader.contents self.function_names = loader.names # 实例化列表视图 # 头部标题 title = QtWidgets.QTextEdit() title.setPlainText("函数列表") title.setAlignment(QtCore.Qt.AlignCenter) title.setReadOnly(True) title_box = QtWidgets.QVBoxLayout() title_box.addWidget(title) # 初始化列表视图 list_view = QtWidgets.QListView() # 修改双击触发器为空 list_view.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) # 实例化列表模型,添加数据 list_model = QtCore.QStringListModel() # 设置模型列表视图,加载数据列表 list_model.setStringList(self.function_names) # 设置列表视图的模型 list_view.setModel(list_model) # 连接鼠标单击信号到 set_function_textarea 函数 list_view.clicked.connect(self.set_function_textarea) # 连接鼠标双击信号到具体事件 list_view.doubleClicked.connect(self.doubleClickedEvent) # 设置函数列表和函数内容窗口 func_content = QtWidgets.QHBoxLayout() func_list_box = QtWidgets.QHBoxLayout() func_list_box.addWidget(list_view) self.function_textarea = QtWidgets.QTextEdit() self.function_textarea.setReadOnly(True) # 设置启动的初始值 detail_text = self.get_function_detail(0) self.function_textarea.setPlainText(detail_text) detail_box = QtWidgets.QHBoxLayout() detail_box.addWidget(self.function_textarea) func_content.addLayout(func_list_box) func_content.addLayout(detail_box) func_content.setStretch(0, 2) func_content.setStretch(1, 5) self.addLayout(title_box) self.addLayout(func_content) self.setStretch(0, 1) self.setStretch(1, 19)
def init_ui(self): # 实例化列表视图 title = QtWidgets.QTextEdit() title.setPlainText("已存策略") title.setAlignment(QtCore.Qt.AlignCenter) title.setReadOnly(True) title_box = QtWidgets.QVBoxLayout() title_box.addWidget(title) self.strategy_list_view = ListView() # 实例化列表模型,添加数据 self.strategy_list_model = QtCore.QStringListModel() # item 单击事件 self.strategy_list_view.clicked.connect(self.set_script_textarea) # item 双击事件 self.strategy_list_view.doubleClicked.connect( self.double_clicked_event) # 取消双击触发器 self.strategy_list_view.setEditTriggers( QtWidgets.QAbstractItemView.NoEditTriggers) # 连接删除动作 self.strategy_list_view.connect_delete_action(self.delete_action) # 连接重命名动作 self.strategy_list_view.connect_rename_action(self.rename_action) # 初始化策略列表 self.update_list() # 设置列表和内容窗口 file_content = QtWidgets.QHBoxLayout() file_list_box = QtWidgets.QHBoxLayout() file_list_box.addWidget(self.strategy_list_view) self.script_textarea = QtWidgets.QTextEdit() self.script_textarea.setReadOnly(True) # 设置启动的初始值 script_content = self.get_script_content(0) self.script_textarea.setPlainText(script_content) detail_box = QtWidgets.QHBoxLayout() detail_box.addWidget(self.script_textarea) file_content.addLayout(file_list_box) file_content.addLayout(detail_box) file_content.setStretch(0, 2) file_content.setStretch(1, 5) self.addLayout(title_box) self.addLayout(file_content) self.setStretch(0, 1) self.setStretch(1, 19)
def init_ui(self) -> None: """ Init widget ui components. """ self.setWindowTitle("Excel RTD") self.resize(600, 600) module_path = Path(__file__).parent.parent client_path = module_path.joinpath("vnpy_rtd.py") self.client_line = QtWidgets.QLineEdit(str(client_path)) self.client_line.setReadOnly(True) copy_button = QtWidgets.QPushButton("复制") copy_button.clicked.connect(self.copy_client_path) self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) self.port_label = QtWidgets.QLabel( "使用Socket端口:请求回应9001、广播推送9002" ) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.client_line) hbox.addWidget(copy_button) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(self.log_monitor) vbox.addWidget(self.port_label) self.setLayout(vbox)
def init_ui(self) -> None: """""" self.setWindowTitle("移仓助手") old_symbols = [] for vt_symbol, strategies in self.cta_engine.symbol_strategy_map.items( ): if strategies: old_symbols.append(vt_symbol) self.old_symbol_combo = QtWidgets.QComboBox() self.old_symbol_combo.addItems(old_symbols) self.new_symbol_line = QtWidgets.QLineEdit() self.payup_spin = QtWidgets.QSpinBox() self.payup_spin.setMinimum(5) self.log_edit = QtWidgets.QTextEdit() self.log_edit.setReadOnly(True) self.log_edit.setMinimumWidth(500) button = QtWidgets.QPushButton("移仓") button.clicked.connect(self.roll_all) button.setFixedHeight(button.sizeHint().height() * 2) form = QtWidgets.QFormLayout() form.addRow("移仓合约", self.old_symbol_combo) form.addRow("目标合约", self.new_symbol_line) form.addRow("委托超价", self.payup_spin) form.addRow(button) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(form) hbox.addWidget(self.log_edit) self.setLayout(hbox)
def init_ui(self): """""" self.setWindowTitle("脚本策略") start_button = QtWidgets.QPushButton("启动") start_button.clicked.connect(self.start_script) stop_button = QtWidgets.QPushButton("停止") stop_button.clicked.connect(self.stop_script) select_button = QtWidgets.QPushButton("打开") select_button.clicked.connect(self.select_script) self.strategy_line = QtWidgets.QLineEdit() self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) clear_button = QtWidgets.QPushButton("清空") clear_button.clicked.connect(self.log_monitor.clear) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.strategy_line) hbox.addWidget(select_button) hbox.addWidget(start_button) hbox.addWidget(stop_button) hbox.addStretch() hbox.addWidget(clear_button) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(self.log_monitor) self.setLayout(vbox)
def init_ui(self): self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) clear_button = QtWidgets.QPushButton("清空日志") clear_button.clicked.connect(self.log_monitor.clear) self.addWidget(self.log_monitor) self.addWidget(clear_button)
def init_ui(self) -> None: """""" self.setWindowTitle("市场雷达") self.radar_monitor = RadarMonitor(self.radar_engine) self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) self.log_monitor.setMaximumHeight(300) 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) edit_button = QtWidgets.QPushButton("修改") edit_button.clicked.connect(self.edit_rule) 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.addWidget(self.log_monitor) vbox.addWidget(load_button) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(form) hbox.addStretch() hbox.addLayout(vbox) vbox2 = QtWidgets.QVBoxLayout() vbox2.addWidget(self.radar_monitor) vbox2.addLayout(hbox) self.setLayout(vbox2)
def init_ui(self) -> None: self.setWindowTitle("Delta对冲") self.setMaximumSize(1440, 800) self.hedge_monitor = HedgeMonitor(self.option_engine) self.strategy_order_monitor = StrategyOrderMonitor( self.main_engine, self.event_engine) self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) self.log_monitor.setMaximumWidth(300) start_hedge_button = QtWidgets.QPushButton("全部启动") start_hedge_button.clicked.connect(self.start_for_all) stop_hedge_button = QtWidgets.QPushButton("全部停止") stop_hedge_button.clicked.connect(self.stop_for_all) self.offset_percent = OffsetPercentSpinBox() self.hedge_percent = HedgePercentSpinBox() offset_percent_btn = QtWidgets.QPushButton("设置") offset_percent_btn.clicked.connect(self.set_offset_percent) hedge_percent_btn = QtWidgets.QPushButton("设置") hedge_percent_btn.clicked.connect(self.set_hedge_percent) QLabel = QtWidgets.QLabel grid = QtWidgets.QGridLayout() grid.addWidget(QLabel("偏移比例"), 0, 0) grid.addWidget(self.offset_percent, 0, 1) grid.addWidget(offset_percent_btn, 0, 2) grid.addWidget(QLabel("对冲比例"), 1, 0) grid.addWidget(self.hedge_percent, 1, 1) grid.addWidget(hedge_percent_btn, 1, 2) left_vbox = QtWidgets.QVBoxLayout() left_vbox.addWidget(self.hedge_monitor) left_vbox.addWidget(self.strategy_order_monitor) ctrl_btn_hbox = QtWidgets.QHBoxLayout() ctrl_btn_hbox.addWidget(start_hedge_button) ctrl_btn_hbox.addWidget(stop_hedge_button) right_vbox = QtWidgets.QVBoxLayout() right_vbox.addLayout(ctrl_btn_hbox) right_vbox.addLayout(grid) right_vbox.addWidget(self.log_monitor) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(left_vbox) hbox.addLayout(right_vbox) self.setLayout(hbox)
def init_ui(self): # 编辑器的多行文本框 # self.editor_textarea = QtWidgets.QTextEdit() self.editor_textarea = MyLangEditor() # self.editor_textarea = CodeEditor() # 设置editor背景颜色 # self.editor_textarea.setStyleSheet("background:white") self.editor_textarea.textChanged.connect(self.handle_text_changed) # self.highlighter = PythonHighlighter(self.editor_textarea.document()) editor_textarea_box = QtWidgets.QVBoxLayout() editor_textarea_box.addWidget(self.editor_textarea) save_button = QtWidgets.QPushButton("保存") save_button.clicked.connect(self.save_script) save_as_button = QtWidgets.QPushButton("另存为") save_as_button.clicked.connect(self.save_script_as) interprete_button = QtWidgets.QPushButton("编译") interprete_button.clicked.connect(self.interprete) start_button = QtWidgets.QPushButton("启动") start_button.clicked.connect(self.start_script) stop_button = QtWidgets.QPushButton("停止") stop_button.clicked.connect(self.stop_script) clear_button = QtWidgets.QPushButton("清空编辑器") clear_button.clicked.connect(self.editor_textarea.clear) button_box = QtWidgets.QHBoxLayout() button_box.addWidget(save_button) button_box.addWidget(save_as_button) button_box.addWidget(interprete_button) button_box.addWidget(start_button) button_box.addWidget(stop_button) button_box.addStretch() button_box.addWidget(clear_button) strategy_name_box = QtWidgets.QHBoxLayout() self.current_strategy_name = QtWidgets.QTextEdit() self.current_strategy_name.setReadOnly(True) self.current_strategy_name.setPlainText("策略名称:未保存策略") strategy_name_box.addWidget(self.current_strategy_name) self.addLayout(button_box) self.addLayout(strategy_name_box) self.addLayout(editor_textarea_box) self.setStretch(0, 1) self.setStretch(1, 1) self.setStretch(2, 18)
def init_ui(self): """""" self.setWindowTitle("RPC服务") self.setFixedWidth(900) self.setFixedHeight(500) self.start_button = QtWidgets.QPushButton("启动") self.start_button.clicked.connect(self.start_server) self.stop_button = QtWidgets.QPushButton("停止") self.stop_button.clicked.connect(self.stop_server) self.stop_button.setEnabled(False) for button in [self.start_button, self.stop_button]: hint = button.sizeHint() button.setFixedHeight(hint.height() * 2) button.setFixedWidth(hint.width() * 4) self.rep_line = QtWidgets.QLineEdit(self.rpc_engine.rep_address) self.rep_line.setFixedWidth(300) self.pub_line = QtWidgets.QLineEdit(self.rpc_engine.pub_address) self.pub_line.setFixedWidth(300) self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) form = QtWidgets.QFormLayout() form.addRow("请求响应地址", self.rep_line) form.addRow("事件广播地址", self.pub_line) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(form) hbox.addWidget(self.start_button) hbox.addWidget(self.stop_button) hbox.addStretch() vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(self.log_monitor) self.setLayout(vbox)
def init_ui(self): self.setWindowTitle("策略交易明细") self.resize(900, 600) self.dailyChart = DailyMonitor(self.main_engine, self.event_engine) self.tradeChart = TradeMonitor(self.main_engine, self.event_engine) self.cost_text = QtWidgets.QTextEdit() self.candleChart = CandleChartDialog(self.main_engine, self.event_engine) hsplit = QtWidgets.QSplitter(QtCore.Qt.Horizontal) vsplit = QtWidgets.QSplitter(QtCore.Qt.Vertical) vsplit.addWidget(self.tradeChart) vsplit.addWidget(self.cost_text) vsplit.addWidget(self.candleChart) vsplit.setStretchFactor(0, 3) vsplit.setStretchFactor(1, 1) vsplit.setStretchFactor(2, 6) hsplit.addWidget(self.dailyChart) hsplit.addWidget(vsplit) hsplit.setStretchFactor(0, 4) hsplit.setStretchFactor(1, 6) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(hsplit) # hbox = QtWidgets.QHBoxLayout() # vbox = QtWidgets.QVBoxLayout() # vbox.addWidget(self.tradeChart, 8) # vbox.addWidget(self.cost_text, 2) # hbox.addWidget(self.dailyChart, 3) # hbox.addLayout(vbox, 7) self.setLayout(hbox) self.dailyChart.cellDoubleClicked.connect(self.update_daily_trades) # self.tradeChart.cellDoubleClicked.connect(self.show_candle_chart) self.tradeChart.cellClicked.connect(self.check_tradeid)
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) -> None: """""" self.setWindowTitle("期权电子眼") self.algo_monitor = ElectronicEyeMonitor(self.option_engine, self.portfolio_name) self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setReadOnly(True) self.log_monitor.setMaximumWidth(400) stop_pricing_button = QtWidgets.QPushButton("停止定价") stop_pricing_button.clicked.connect(self.stop_pricing_for_all) stop_trading_button = QtWidgets.QPushButton("停止交易") stop_trading_button.clicked.connect(self.stop_trading_for_all) self.price_spread_spin = AlgoDoubleSpinBox() self.volatility_spread_spin = AlgoDoubleSpinBox() self.direction_combo = AlgoDirectionCombo() self.max_order_size_spin = AlgoPositiveSpinBox() self.target_pos_spin = AlgoSpinBox() self.max_pos_spin = AlgoPositiveSpinBox() price_spread_button = QtWidgets.QPushButton("设置") price_spread_button.clicked.connect(self.set_price_spread_for_all) volatility_spread_button = QtWidgets.QPushButton("设置") volatility_spread_button.clicked.connect( self.set_volatility_spread_for_all) direction_button = QtWidgets.QPushButton("设置") direction_button.clicked.connect(self.set_direction_for_all) max_order_size_button = QtWidgets.QPushButton("设置") max_order_size_button.clicked.connect(self.set_max_order_size_for_all) target_pos_button = QtWidgets.QPushButton("设置") target_pos_button.clicked.connect(self.set_target_pos_for_all) max_pos_button = QtWidgets.QPushButton("设置") max_pos_button.clicked.connect(self.set_max_pos_for_all) QLabel = QtWidgets.QLabel grid = QtWidgets.QGridLayout() grid.addWidget(QLabel("价格价差"), 0, 0) grid.addWidget(self.price_spread_spin, 0, 1) grid.addWidget(price_spread_button, 0, 2) grid.addWidget(QLabel("隐波价差"), 1, 0) grid.addWidget(self.volatility_spread_spin, 1, 1) grid.addWidget(volatility_spread_button, 1, 2) grid.addWidget(QLabel("持仓上限"), 2, 0) grid.addWidget(self.max_pos_spin, 2, 1) grid.addWidget(max_pos_button, 2, 2) grid.addWidget(QLabel("目标持仓"), 3, 0) grid.addWidget(self.target_pos_spin, 3, 1) grid.addWidget(target_pos_button, 3, 2) grid.addWidget(QLabel("最大委托"), 4, 0) grid.addWidget(self.max_order_size_spin, 4, 1) grid.addWidget(max_order_size_button, 4, 2) grid.addWidget(QLabel("方向"), 5, 0) grid.addWidget(self.direction_combo, 5, 1) grid.addWidget(direction_button, 5, 2) hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(stop_pricing_button) hbox1.addWidget(stop_trading_button) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(grid) vbox.addWidget(self.log_monitor) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.algo_monitor) hbox.addLayout(vbox) self.setLayout(hbox)
def init_ui(self): """""" self.setWindowTitle("Strategy Backtesting") # Setting Part self.class_combo = QtWidgets.QComboBox() self.class_combo.addItems(self.class_names) self.symbol_line = QtWidgets.QLineEdit("XBTUSD.BITMEX") self.interval_combo = QtWidgets.QComboBox() for inteval in Interval: self.interval_combo.addItem(inteval.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.0") self.slippage_line = QtWidgets.QLineEdit("0") self.size_line = QtWidgets.QLineEdit("1") self.pricetick_line = QtWidgets.QLineEdit("0.001") self.capital_line = QtWidgets.QLineEdit("1000000") backtesting_button = QtWidgets.QPushButton("Start backtest") backtesting_button.clicked.connect(self.start_backtesting) optimization_button = QtWidgets.QPushButton("Optimization") optimization_button.clicked.connect(self.start_optimization) self.result_button = QtWidgets.QPushButton("Optimization results") self.result_button.clicked.connect(self.show_optimization_result) self.result_button.setEnabled(False) downloading_button = QtWidgets.QPushButton("Download data") downloading_button.clicked.connect(self.start_downloading) self.order_button = QtWidgets.QPushButton("Orders") self.order_button.clicked.connect(self.show_backtesting_orders) self.order_button.setEnabled(False) self.trade_button = QtWidgets.QPushButton("Trades") self.trade_button.clicked.connect(self.show_backtesting_trades) self.trade_button.setEnabled(False) self.daily_button = QtWidgets.QPushButton("Daily P&L") self.daily_button.clicked.connect(self.show_daily_results) self.daily_button.setEnabled(False) self.candle_button = QtWidgets.QPushButton("Candlestick chart") self.candle_button.clicked.connect(self.show_candle_chart) self.candle_button.setEnabled(False) for button in [ backtesting_button, optimization_button, downloading_button, self.result_button, self.order_button, self.trade_button, self.daily_button, self.candle_button ]: button.setFixedHeight(button.sizeHint().height() * 2) form = QtWidgets.QFormLayout() form.addRow("Strategy", self.class_combo) form.addRow("Symbol", self.symbol_line) form.addRow("Candlestick", self.interval_combo) form.addRow("Start date", self.start_date_edit) form.addRow("End date", self.end_date_edit) form.addRow("Fee", self.rate_line) form.addRow("Slippage", self.slippage_line) form.addRow("Size", self.size_line) form.addRow("Min price tick", self.pricetick_line) form.addRow("Capital", self.capital_line) left_vbox = QtWidgets.QVBoxLayout() left_vbox.addLayout(form) left_vbox.addWidget(backtesting_button) left_vbox.addWidget(downloading_button) left_vbox.addStretch() left_vbox.addWidget(self.trade_button) left_vbox.addWidget(self.order_button) left_vbox.addWidget(self.daily_button) left_vbox.addWidget(self.candle_button) left_vbox.addStretch() left_vbox.addWidget(optimization_button) left_vbox.addWidget(self.result_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, " backtesting transaction records ", BacktestingTradeMonitor) self.order_dialog = BacktestingResultDialog( self.main_engine, self.event_engine, " backtesting commissioned record ", BacktestingOrderMonitor) self.daily_dialog = BacktestingResultDialog( self.main_engine, self.event_engine, " back-tested daily profit and loss ", 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("CTA回测") # Setting Part self.class_combo = QtWidgets.QComboBox() # self.symbol_line = QtWidgets.QLineEdit("IF88.CFFEX") self.symbol_line = "" self.symbol_label = QtWidgets.QLabel() self.data_counts_label = QtWidgets.QLabel() ############################################# # fangyang add, 根据数据库内容进行选项显示 self.dbbardata_groupby_df = self.db_instance.get_groupby_data_from_sql_db() self.exchange_combo = QtWidgets.QComboBox() self.exchange_combo.addItems(self.dbbardata_groupby_df['exchange'].drop_duplicates().to_list()) self.exchange_combo.activated[str].connect(self.onExchangeActivated) self.symbol_combo = QtWidgets.QComboBox() self.symbol_combo.currentIndexChanged.connect(self.onSymbolActivated) self.interval_combo = QtWidgets.QComboBox() self.interval_combo.currentIndexChanged.connect(self.onIntervalActivated) ########################################## end_dt = datetime.now() # start_dt = end_dt - timedelta(days=3 * 365) # debug 临时更改 start_dt = end_dt - timedelta(days=100) # debug 临时更改 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.000025") self.slippage_line = QtWidgets.QLineEdit("1") self.size_line = QtWidgets.QLineEdit("10") self.pricetick_line = QtWidgets.QLineEdit("1") self.capital_line = QtWidgets.QLineEdit("1000000") self.inverse_combo = QtWidgets.QComboBox() self.inverse_combo.addItems(["正向", "反向"]) # fangyang add self.debug_combo = QtWidgets.QComboBox() self.debug_combo.addItems(["Thread 运行回测", "Debug 运行回测"]) backtesting_button = QtWidgets.QPushButton("开始回测") backtesting_button.clicked.connect(self.start_backtesting) rl_train_button = QtWidgets.QPushButton("开始RL训练") rl_train_button.clicked.connect(self.start_rl_train) 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) self.candle_button_web = QtWidgets.QPushButton("K线图表web") self.candle_button_web.clicked.connect(self.show_candle_chart_web) # self.candle_button_web.setEnabled(False) edit_button = QtWidgets.QPushButton("代码编辑") edit_button.clicked.connect(self.edit_strategy_code) 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, # edit_button, # reload_button # ]: # button.setFixedHeight(button.sizeHint().height() * 2) form = QtWidgets.QFormLayout() form.addRow("交易策略", self.class_combo) form.addRow("交易所代码", self.exchange_combo) form.addRow("本地代码", self.symbol_combo) form.addRow("合约名称", self.symbol_label) form.addRow("K线周期", self.interval_combo) form.addRow("开始日期", self.start_date_edit) form.addRow("结束日期\n(+1天才能回测到最后这天)", self.end_date_edit) form.addRow("DB内总数据量", self.data_counts_label) 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("合约模式\n(数字货币用反向)", self.inverse_combo) form.addRow("回测模式", self.debug_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) result_grid.addWidget(self.candle_button_web, 2, 1) left_vbox = QtWidgets.QVBoxLayout() left_vbox.addLayout(form) left_vbox.addWidget(backtesting_button) left_vbox.addWidget(rl_train_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(edit_button) 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) # Code Editor self.editor = CodeEditor(self.main_engine, self.event_engine) # Load setting setting = load_json(self.setting_filename) if not setting: return self.class_combo.setCurrentIndex( self.class_combo.findText(setting["class_name"]) ) self.interval_combo.setCurrentIndex( self.interval_combo.findText(setting["interval"]) ) self.rate_line.setText(str(setting["rate"])) self.slippage_line.setText(str(setting["slippage"])) self.size_line.setText(str(setting["size"])) self.pricetick_line.setText(str(setting["pricetick"])) self.capital_line.setText(str(setting["capital"])) if not setting["inverse"]: self.inverse_combo.setCurrentIndex(0) else: self.inverse_combo.setCurrentIndex(1)
def init_ui(self): """""" self.setWindowTitle("CTA回测") # Setting Part self.class_combo = QtWidgets.QComboBox() self.class_combo.addItems(self.class_names) self.symbol_line = QtWidgets.QLineEdit("IF88.CFFEX") self.interval_combo = QtWidgets.QComboBox() for inteval in Interval: self.interval_combo.addItem(inteval.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.000025") self.slippage_line = QtWidgets.QLineEdit("0.2") self.size_line = QtWidgets.QLineEdit("300") self.pricetick_line = QtWidgets.QLineEdit("0.2") self.capital_line = QtWidgets.QLineEdit("1000000") start_button = QtWidgets.QPushButton("开始回测") start_button.clicked.connect(self.start_backtesting) 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(start_button) # Result part self.statistics_monitor = StatisticsMonitor() self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setMaximumHeight(400) self.chart = BacktesterChart() self.chart.setMinimumWidth(1000) # Layout vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.statistics_monitor) vbox.addWidget(self.log_monitor) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(form) hbox.addLayout(vbox) hbox.addWidget(self.chart) self.setLayout(hbox)
def init_ui(self): """""" self.setWindowTitle("CTA回测") # Setting Part # 创建下来列表框保存具体策略 self.class_combo = QtWidgets.QComboBox() # 输入文本框,单行文本 self.symbol_line = QtWidgets.QLineEdit("IF88.CFFEX") # 供选择的回测周期 self.interval_combo = QtWidgets.QComboBox() # 把已经存在的回测周期添加到下拉列表中 for inteval in Interval: self.interval_combo.addItem(inteval.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.000025") self.slippage_line = QtWidgets.QLineEdit("0.2") self.size_line = QtWidgets.QLineEdit("300") self.pricetick_line = QtWidgets.QLineEdit("0.2") 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) edit_button = QtWidgets.QPushButton("代码编辑") edit_button.clicked.connect(self.edit_strategy_code) 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, edit_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(edit_button) left_vbox.addWidget(reload_button) # Result part self.statistics_monitor = StatisticsMonitor() # 和QLineEdit的区别就是,line只能是单行数据 # QTextEdit显示多行文本内容,当文本内容超出控件显示范围时,可以显示水平和垂直滚动条。 self.log_monitor = QtWidgets.QTextEdit() self.log_monitor.setMaximumHeight(400) self.chart = BacktesterChart() self.chart.setMinimumWidth(600) 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) # Code Editor self.editor = CodeEditor(self.main_engine, self.event_engine) # Load setting setting = load_json(self.setting_filename) if not setting: return self.class_combo.setCurrentIndex( self.class_combo.findText(setting["class_name"]) ) self.symbol_line.setText(setting["vt_symbol"]) self.interval_combo.setCurrentIndex( self.interval_combo.findText(setting["interval"]) ) self.rate_line.setText(str(setting["rate"])) self.slippage_line.setText(str(setting["slippage"])) self.size_line.setText(str(setting["size"])) self.pricetick_line.setText(str(setting["pricetick"])) self.capital_line.setText(str(setting["capital"])) if not setting["inverse"]: self.inverse_combo.setCurrentIndex(0) else: self.inverse_combo.setCurrentIndex(1)
def init_ui(self): """""" self.setWindowTitle("CTA回测") # Setting Part self.class_combo = QtWidgets.QComboBox() self.class_combo.addItems(self.class_names) self.symbol_line = QtWidgets.QLineEdit("IF88.CFFEX") self.interval_combo = QtWidgets.QComboBox() for inteval in Interval: self.interval_combo.addItem(inteval.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.000025") self.slippage_line = QtWidgets.QLineEdit("0.2") self.size_line = QtWidgets.QLineEdit("300") self.pricetick_line = QtWidgets.QLineEdit("0.2") self.capital_line = QtWidgets.QLineEdit("1000000") 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) for button in [ backtesting_button, optimization_button, downloading_button, self.result_button, self.order_button, self.trade_button, self.daily_button, self.candle_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) left_vbox = QtWidgets.QVBoxLayout() left_vbox.addLayout(form) left_vbox.addWidget(backtesting_button) left_vbox.addWidget(downloading_button) left_vbox.addStretch() left_vbox.addWidget(self.trade_button) left_vbox.addWidget(self.order_button) left_vbox.addWidget(self.daily_button) left_vbox.addWidget(self.candle_button) left_vbox.addStretch() left_vbox.addWidget(optimization_button) left_vbox.addWidget(self.result_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("行情记录") 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)