def __init__(self, start: datetime, end: datetime, parent=None): """""" super().__init__(parent) self.setWindowTitle("选择数据区间") self.start_edit = QtWidgets.QDateEdit( QtCore.QDate( start.year, start.month, start.day ) ) self.end_edit = QtWidgets.QDateEdit( QtCore.QDate( end.year, end.month, end.day ) ) button = QtWidgets.QPushButton("确定") button.clicked.connect(self.accept) form = QtWidgets.QFormLayout() form.addRow("开始时间", self.start_edit) form.addRow("结束时间", self.end_edit) form.addRow(button) self.setLayout(form)
def onIntervalActivated(self): current_symbol = self.symbol_combo.currentText() current_exchange = self.exchange_combo.currentText() current_interval = self.interval_combo.currentText() count_series = self.dbbardata_groupby_df[ (self.dbbardata_groupby_df['symbol'] == current_symbol) & (self.dbbardata_groupby_df['exchange'] == current_exchange) & (self.dbbardata_groupby_df['interval'] == current_interval)]['count(1)'] if count_series.empty: self.data_counts_label.setText("0") else: self.data_counts_label.setText(f'''{count_series.values[0]}''') if current_exchange and current_symbol and current_interval: symbol_de_L8_str = current_symbol[:-2] if symbol_de_L8_str in self.pytdx_contracts_dict: self.symbol_label.setText( f"{self.pytdx_contracts_dict[symbol_de_L8_str]['name']}") self.size_line.setText( f"{self.pytdx_contracts_dict[symbol_de_L8_str]['size']}") self.pricetick_line.setText( f"{self.pytdx_contracts_dict[symbol_de_L8_str]['pricetick']}" ) elif current_exchange.lower( ) in self.pyccxt_exchange.exchange_list: self.symbol_label.setText(f"{current_symbol}") cur_exchange_market_info_dict = self.pyccxt_exchange.read_local_market_info_json_file( current_exchange.lower()) if cur_exchange_market_info_dict \ and (current_symbol.replace("_", "/").upper() in cur_exchange_market_info_dict): market_info = cur_exchange_market_info_dict[ current_symbol.replace("_", "/").upper()] self.pricetick_line.setText( f"{market_info['limits']['price']['min']}") else: self.pricetick_line.setText(f"999") self.size_line.setText(f"{1}") # TODO 增加重置日期后统计数据数目 # 重置日期 db_end_dt = self.db_instance.get_end_date_from_db( symbol=current_symbol, exchange=current_exchange, interval=current_interval) db_end_dt = datetime.strptime(db_end_dt, '%Y-%m-%d %H:%M:%S') db_start_dt = self.db_instance.get_start_date_from_db( symbol=current_symbol, exchange=current_exchange, interval=current_interval) db_start_dt = datetime.strptime(db_start_dt, '%Y-%m-%d %H:%M:%S') self.start_date_edit.setDate( QtCore.QDate(db_start_dt.year, db_start_dt.month, db_start_dt.day)) self.end_date_edit.setDate( QtCore.QDate(db_end_dt.year, db_end_dt.month, db_end_dt.day))
def interval_combo_changed(self): interval = InvestmentInterval(self.interval_combo.currentText()) today = QtCore.QDate.currentDate() yesterday = today.addDays(-1) current_month_first_day = QtCore.QDate(today.year(), today.month(), 1) last_month_day = today.addMonths(-1) last_month_first_day = QtCore.QDate(last_month_day.year(), last_month_day.month(), 1) last_month_last_day = current_month_first_day.addDays(-1) interval_date = { InvestmentInterval.NearlyMonth: (today.addMonths(-1), today), InvestmentInterval.NearlyWeek: (today.addDays(-7), today), InvestmentInterval.CurrentMonth: (current_month_first_day, today), InvestmentInterval.PreMonth: (last_month_first_day, last_month_last_day), InvestmentInterval.Today: (today, today), InvestmentInterval.Yesterday: (yesterday, yesterday) } start_date, end_date = interval_date.get(interval) self.start_date_edit.setDate(start_date) self.end_date_edit.setDate(end_date)
def __init__(self, engine: ManagerEngine, parent=None): """""" super().__init__() self.engine = engine self.setWindowTitle("下载历史数据") self.setFixedWidth(300) self.setWindowFlags( (self.windowFlags() | QtCore.Qt.CustomizeWindowHint) & ~QtCore.Qt.WindowMaximizeButtonHint) 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: self.interval_combo.addItem(str(i.name), i) 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 ) ) button = QtWidgets.QPushButton("下载") button.clicked.connect(self.download) form = QtWidgets.QFormLayout() form.addRow("代码", self.symbol_edit) form.addRow("交易所", self.exchange_combo) form.addRow("周期", self.interval_combo) form.addRow("开始日期", self.start_date_edit) form.addRow(button) self.setLayout(form)
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("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("投资管理") # 设置UI组件 self.interval_combo = QtWidgets.QComboBox() for inteval in InvestmentInterval: self.interval_combo.addItem(inteval.value) end_dt = datetime.now() start_dt = end_dt - timedelta(days=3 * 10) 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.capital_line = QtWidgets.QLineEdit("30000") self.strategy_edit = QtWidgets.QLineEdit("") self.symbol_edit = QtWidgets.QLineEdit("") analyze_button = QtWidgets.QPushButton("开始统计") analyze_button.clicked.connect(self.start_analyzing) candle_button = QtWidgets.QPushButton("K线图表") candle_button.clicked.connect(self.show_candle_chart) product_manage_button = QtWidgets.QPushButton("品种维护") product_manage_button.clicked.connect(self.start_optimization) clean_backtester_button = QtWidgets.QPushButton("清空回测") clean_backtester_button.clicked.connect(self.start_optimization) for button in [ analyze_button, product_manage_button, candle_button, clean_backtester_button ]: button.setFixedHeight(button.sizeHint().height() * 2) form = QtWidgets.QFormLayout() form.addRow("投资周期", self.interval_combo) form.addRow("投资策略", self.strategy_edit) form.addRow("投资品种", self.symbol_edit) form.addRow("投资金额", self.capital_line) form.addRow("开始日期", self.start_date_edit) form.addRow("结束日期", self.end_date_edit) left_vbox = QtWidgets.QVBoxLayout() left_vbox.addLayout(form) left_vbox.addWidget(analyze_button) left_vbox.addWidget(candle_button) left_vbox.addStretch() left_vbox.addWidget(product_manage_button) left_vbox.addWidget(clean_backtester_button) left_vbox.addStretch() # Result part self.statistics_monitor = StatisticsMonitor() self.statistics_monitor.setMaximumHeight(310) self.investment_table = InvestmentTableMonitor(self.main_engine, self.event_engine) self.investment_table.setMinimumWidth(1550) # self.log_monitor.setMaximumHeight(900) self.chart = InvestmentChart() self.chart.setMinimumWidth(1200) self.chart.setMaximumHeight(310) # Layout center_top_hbox = QtWidgets.QHBoxLayout() center_top_hbox.addWidget(self.statistics_monitor) center_top_hbox.addWidget(self.chart) center_vbox = QtWidgets.QVBoxLayout() center_vbox.addLayout(center_top_hbox) center_vbox.addWidget(self.investment_table) hbox = QtWidgets.QHBoxLayout() hbox.addLayout(left_vbox) hbox.addLayout(center_vbox) 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") 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)