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 _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" # Create objects candle_picture = QtGui.QPicture() painter = QtGui.QPainter(candle_picture) # Set painter color if bar.close_price >= bar.open_price: painter.setPen(self._up_pen) painter.setBrush(self._up_brush) else: painter.setPen(self._down_pen) painter.setBrush(self._down_brush) # Draw candle shadow painter.drawLine(QtCore.QPointF(ix, bar.high_price), QtCore.QPointF(ix, bar.low_price)) # Draw candle body if bar.open_price == bar.close_price: painter.drawLine( QtCore.QPointF(ix - BAR_WIDTH, bar.open_price), QtCore.QPointF(ix + BAR_WIDTH, bar.open_price), ) else: rect = QtCore.QRectF(ix - BAR_WIDTH, bar.open_price, BAR_WIDTH * 2, bar.close_price - bar.open_price) painter.drawRect(rect) # Finish painter.end() return candle_picture
def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" value = self.values[ix] last_value = self.values[ix - 1] # Create objects picture = QtGui.QPicture() painter = QtGui.QPainter(picture) # Set painter color painter.setPen(self.yellow_pen) # painter.setBrush(self.yellow_brush) # Draw Line if np.isnan(last_value) or np.isnan(value): # print(ix - 1, last_value,ix, value,) pass else: start_point = QtCore.QPointF(ix - 1, last_value) end_point = QtCore.QPointF(ix, value) painter.drawLine(start_point, end_point) # Draw Circle # painter.drawEllipse(QtCore.QPointF(ix, self.values[ix]), 2, 2) # Finish painter.end() return picture
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))
class QA_GUI_Selected_TaskQueue(QtCore.QThread): # QThread 继承的不执行__init__ # def __int__(self, logDisplay): # 奇怪的问题, 不执行 __init__ # 初始化函数,默认 # super().__init__() # sfassda #print("run here") # exit(0) #self.logDisplay = logDisplay # sys.stderr.textWritten.connect(self.outputWrittenStderr) # 下面将print 系统输出重定向到textEdit中 #sys.stdout = EmittingStream() #sys.stderr = EmittingStream() # 接收信号str的信号槽 ''' def outputWrittenStdout(self, text): cursor = self.logDisplay.textCursor() cursor.movePosition(QtGui.QTextCursor.End) cursor.insertText(text) self.logDisplay.setTextCursor(cursor) self.logDisplay.ensureCursorVisible() def outputWrittenStderr(self, text): cursor = self.logDisplay.textCursor() cursor.movePosition(QtGui.QTextCursor.End) cursor.insertText(text) self.logDisplay.setTextCursor(cursor) self.logDisplay.ensureCursorVisible() ''' # 定义一个信号, trigger_all_task_start = QtCore.pyqtSignal(str) trigger_all_task_done = QtCore.pyqtSignal(str) # 定义任务(每个是一个线程) QA_GUI_Task_List = [] def run(self): self.trigger_all_task_start.emit('all_task_start') for iSubTask in self.QA_GUI_Task_List: iSubTask.start() # wait finish iSubTask while (iSubTask.isRunning()): time.sleep(1) self.trigger_all_task_done.emit('all_task_done') def putTask(self, subTask): self.QA_GUI_Task_List.append(subTask) def clearTask(self): self.QA_GUI_Task_List.clear()
class SpreadStrategyMonitor(QtWidgets.QWidget): """""" signal_strategy = QtCore.pyqtSignal(Event) def __init__(self, spread_engine: SpreadEngine): super().__init__() self.strategy_engine = spread_engine.strategy_engine self.main_engine = spread_engine.main_engine self.event_engine = spread_engine.event_engine self.managers = {} self.init_ui() self.register_event() def init_ui(self): """""" self.scroll_layout = QtWidgets.QVBoxLayout() self.scroll_layout.addStretch() scroll_widget = QtWidgets.QWidget() scroll_widget.setLayout(self.scroll_layout) scroll_area = QtWidgets.QScrollArea() scroll_area.setWidgetResizable(True) scroll_area.setWidget(scroll_widget) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(scroll_area) self.setLayout(vbox) def register_event(self): """""" self.signal_strategy.connect(self.process_strategy_event) self.event_engine.register( EVENT_SPREAD_STRATEGY, self.signal_strategy.emit ) def process_strategy_event(self, event): """ Update strategy status onto its monitor. """ data = event.data strategy_name = data["strategy_name"] if strategy_name in self.managers: manager = self.managers[strategy_name] manager.update_data(data) else: manager = SpreadStrategyWidget(self, self.strategy_engine, data) self.scroll_layout.insertWidget(0, manager) self.managers[strategy_name] = manager def remove_strategy(self, strategy_name): """""" manager = self.managers.pop(strategy_name) manager.deleteLater()
class LogMonitorBox(QtWidgets.QVBoxLayout): signal_log = QtCore.pyqtSignal(Event) def __init__(self, editor_manager): super().__init__() self.event_engine = editor_manager.event_engine self.log_monitor = None self.register_event() self.init_ui() 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 register_event(self): """""" self.signal_log.connect(self.process_log_event) self.event_engine.register(EVENT_EDITOR_LOG, self.signal_log.emit) def process_log_event(self, event: Event): """""" log = event.data msg = f"{log.time}\t{log.msg}" self.log_monitor.append(msg)
def resizeEvent(self, event): super().resizeEvent(event) cr = self.contentsRect() self.lineNumberArea.setGeometry( QtCore.QRect(cr.left(), cr.top(), self.lineNumberAreaWidth(), cr.height()))
def boundingRect(self) -> QtCore.QRectF: """""" min_volume, max_volume = self._manager.get_volume_range() rect: QtCore.QRectF = QtCore.QRectF(0, min_volume, len(self._bar_picutures), max_volume - min_volume) return rect
def _update_label(self) -> None: """""" bottom_plot = list(self._plots.values())[-1] axis_width = bottom_plot.getAxis("right").width() axis_height = bottom_plot.getAxis("bottom").height() axis_offset = QtCore.QPointF(axis_width, axis_height) bottom_view = list(self._views.values())[-1] bottom_right = bottom_view.mapSceneToView( bottom_view.sceneBoundingRect().bottomRight() - axis_offset ) # LWH 2019-10-30 bottom_left = bottom_view.mapSceneToView( bottom_view.sceneBoundingRect().bottomLeft() + 3 * axis_offset ) for plot_name, label in self._y_labels.items(): if plot_name == self._plot_name: label.setText(str(self._y)) label.show() label.setPos(bottom_right.x(), self._y) else: label.hide() dt = self._manager.get_datetime(self._x) if dt: self._x_label.setText(dt.strftime("%Y-%m-%d %H:%M:%S")) self._x_label.show() #self._x_label.setPos(self._x, bottom_right.y()) self._x_label.setPos(bottom_left.x(), bottom_right.y()) self._x_label.setAnchor((0, 0))
class SpreadLogMonitor(QtWidgets.QTextEdit): """ Monitor for log data. """ signal = QtCore.pyqtSignal(Event) def __init__(self, main_engine: MainEngine, event_engine: EventEngine): """""" super().__init__() self.main_engine = main_engine self.event_engine = event_engine self.init_ui() self.register_event() def init_ui(self): """""" self.setReadOnly(True) def register_event(self): """""" self.signal.connect(self.process_log_event) self.event_engine.register(EVENT_SPREAD_LOG, self.signal.emit) def process_log_event(self, event: Event): """""" log = event.data msg = f"{log.time.strftime('%H:%M:%S')}\t{log.msg}" self.append(msg)
def _update_label(self) -> None: """""" bottom_plot = list(self._plots.values())[-1] axis_width = bottom_plot.getAxis("right").width() axis_height = bottom_plot.getAxis("bottom").height() axis_offset = QtCore.QPointF(axis_width + 150, axis_height + 100) bottom_view = list(self._views.values())[-1] bottom_right = bottom_view.mapSceneToView( bottom_view.sceneBoundingRect().bottomRight() - axis_offset ) if self._x < self._manager.get_count(): current_data_series = self._manager.get_df().iloc[self._x] label_text = "".join([f'{key} : {value}\n\n' for key, value in current_data_series.items()]) for plot_name, label in self._y_labels.items(): if plot_name == self._plot_name: # label.setText(str(self._y)) label.setText(label_text) label.show() label.setPos(bottom_right.x(), self._y) else: label.hide() dt = self._manager.get_datetime(self._x) if dt: self._x_label.setText(dt.strftime("%Y-%m-%d %H:%M:%S")) self._x_label.show() self._x_label.setPos(self._x, bottom_right.y()) self._x_label.setAnchor((0, 0))
def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" # Create objects volume_picture = QtGui.QPicture() painter = QtGui.QPainter(volume_picture) # Set painter color if bar.close_price >= bar.open_price: painter.setPen(self._up_pen) painter.setBrush(self._up_brush) else: painter.setPen(self._down_pen) painter.setBrush(self._down_brush) # Draw volume body rect = QtCore.QRectF( ix - BAR_WIDTH, 0, BAR_WIDTH * 2, bar.volume ) painter.drawRect(rect) # Finish painter.end() return volume_picture
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 boundingRect(self) -> QtCore.QRectF: """""" min_price, max_price = self._manager.get_price_range() rect = QtCore.QRectF( 0, min_price, len(self._bar_picutures), max_price - min_price ) return rect
def boundingRect(self) -> QtCore.QRectF: """""" min_y, max_y = self.get_y_range() rect = QtCore.QRectF( 0, min_y, len(self._bar_picutures), max_y ) return rect
def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" macd_value = self.get_macd_value(ix) last_macd_value = self.get_macd_value(ix - 1) # # Create objects picture = QtGui.QPicture() painter = QtGui.QPainter(picture) # # Draw macd lines if np.isnan(macd_value[0]) or np.isnan(last_macd_value[0]): # print("略过macd lines0") pass else: end_point0 = QtCore.QPointF(ix, macd_value[0]) start_point0 = QtCore.QPointF(ix - 1, last_macd_value[0]) painter.setPen(self.white_pen) painter.drawLine(start_point0, end_point0) if np.isnan(macd_value[1]) or np.isnan(last_macd_value[1]): # print("略过macd lines1") pass else: end_point1 = QtCore.QPointF(ix, macd_value[1]) start_point1 = QtCore.QPointF(ix - 1, last_macd_value[1]) painter.setPen(self.yellow_pen) painter.drawLine(start_point1, end_point1) if not np.isnan(macd_value[2]): if (macd_value[2] > 0): painter.setPen(self.red_pen) painter.setBrush(pg.mkBrush(255, 0, 0)) else: painter.setPen(self.green_pen) painter.setBrush(pg.mkBrush(0, 255, 0)) painter.drawRect(QtCore.QRectF(ix - 0.3, 0, 0.6, macd_value[2])) else: # print("略过macd lines2") pass painter.end() return picture
def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" sma_value = self.get_sma_value(ix) last_sma_value = self.get_sma_value(ix - 1) # Create objects picture = QtGui.QPicture() painter = QtGui.QPainter(picture) # Set painter color painter.setPen(self.blue_pen) # Draw Line start_point = QtCore.QPointF(ix-1, last_sma_value) end_point = QtCore.QPointF(ix, sma_value) painter.drawLine(start_point, end_point) # Finish painter.end() return picture
def generatePicture(self): self.picture = QtGui.QPicture() p = QtGui.QPainter(self.picture) # 白色 p.setPen(pg.mkPen('w')) prema5 = 0 prema10 = 0 prema20 = 0 for m in self.data: if prema5 != 0 and self.period == 5: # 白色 p.setPen(pg.mkPen('w')) p.setBrush(pg.mkBrush('w')) p.drawLine(QtCore.QPointF(m.t - 1, prema5), QtCore.QPointF(m.t, m.ma)) prema5 = m.ma if prema10 != 0 and self.period == 10: # 青色 p.setPen(pg.mkPen('c')) p.setBrush(pg.mkBrush('c')) p.drawLine(QtCore.QPointF(m.t - 1, prema10), QtCore.QPointF(m.t, m.ma)) prema10 = m.ma if prema20 != 0 and self.period == 20: # 品色 p.setPen(pg.mkPen('m')) p.setBrush(pg.mkBrush('m')) p.drawLine(QtCore.QPointF(m.t - 1, prema20), QtCore.QPointF(m.t, m.ma)) prema20 = m.ma p.end()
def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" rsi_value = self.get_rsi_value(ix) last_rsi_value = self.get_rsi_value(ix - 1) # Create objects picture = QtGui.QPicture() painter = QtGui.QPainter(picture) # Draw RSI line painter.setPen(self.yellow_pen) end_point = QtCore.QPointF(ix, rsi_value) start_point = QtCore.QPointF(ix - 1, last_rsi_value) painter.drawLine(start_point, end_point) # Draw oversold/overbought line painter.setPen(self.white_pen) painter.drawLine( QtCore.QPointF(ix, 70), QtCore.QPointF(ix - 1, 70), ) painter.drawLine( QtCore.QPointF(ix, 30), QtCore.QPointF(ix - 1, 30), ) # Finish painter.end() return picture
class LogMonitor(QtWidgets.QTableWidget): """""" signal = QtCore.pyqtSignal(Event) def __init__(self, event_engine: EventEngine): """""" super().__init__() self.event_engine = event_engine self.init_ui() self.register_event() def init_ui(self): """""" labels = [ "时间", "信息" ] self.setColumnCount(len(labels)) self.setHorizontalHeaderLabels(labels) self.verticalHeader().setVisible(False) self.setEditTriggers(self.NoEditTriggers) self.verticalHeader().setSectionResizeMode( QtWidgets.QHeaderView.ResizeToContents ) self.horizontalHeader().setSectionResizeMode( 1, QtWidgets.QHeaderView.Stretch ) self.setWordWrap(True) def register_event(self): """""" self.signal.connect(self.process_log_event) self.event_engine.register(EVENT_ALGO_LOG, self.signal.emit) def process_log_event(self, event): """""" msg = event.data timestamp = datetime.now().strftime("%H:%M:%S") timestamp_cell = QtWidgets.QTableWidgetItem(timestamp) msg_cell = QtWidgets.QTableWidgetItem(msg) self.insertRow(0) self.setItem(0, 0, timestamp_cell) self.setItem(0, 1, msg_cell)
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 _mouse_moved(self, evt: tuple) -> None: """ Callback function when mouse is moved. """ if not self._manager.get_count(): return # First get current mouse point pos = evt for plot_name, view in self._views.items(): rect = view.sceneBoundingRect() if rect.contains(pos): mouse_point = view.mapSceneToView(pos) self._x = to_int(mouse_point.x()) self._y = mouse_point.y() self._plot_name = plot_name break # Then update cursor component self._update_line() self._update_label() self.update_info() if self.dt_ix: #print(self.dt_ix) for plot_name, plot in self._plots.items(): #info = self._infos[plot_name] # print(plot_info_text) try: text = "" for k,v in self.dt_ix.items(): text += k+":"+str(v[int(self._x)])+"\n" self.inf.setText(text) #self.inf.setText("bkhigh:"+self.dt_ix[int(self._x)]) self.inf.show() #print(plot_name) view = self._views[plot_name] coodinate = QtCore.QPointF(100,0) #view = self._views["candle"] top_left = view.mapSceneToView(view.sceneBoundingRect().topLeft()+coodinate) # print(view.sceneBoundingRect()) # print(view.sceneBoundingRect().topLeft()) # print(top_left) #print(self._x) self.inf.setPos(top_left) except: print("该K线无数据")
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 _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" last_bar = self._manager.get_bar(ix - 1) # Create objects picture = QtGui.QPicture() painter = QtGui.QPainter(picture) # Set painter color painter.setPen(self.white_pen) # Draw Line end_point = QtCore.QPointF(ix, bar.close_price) if last_bar: start_point = QtCore.QPointF(ix - 1, last_bar.close_price) else: start_point = end_point painter.drawLine(start_point, end_point) # Finish painter.end() return picture
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 _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" boll_value = self.get_boll_value(ix) last_boll_value = self.get_boll_value(ix - 1) # Create objects picture = QtGui.QPicture() painter = QtGui.QPainter(picture) # Set painter color painter.setPen(self.blue_pen) if last_boll_value==0: # Draw Line start_point = QtCore.QPointF(0, 0) end_point = QtCore.QPointF(0, 0) painter.drawLine(start_point, end_point) else: # Draw Line start_point = QtCore.QPointF(ix-1, last_boll_value["upper"]) end_point = QtCore.QPointF(ix, boll_value["upper"]) painter.drawLine(start_point, end_point) start_point = QtCore.QPointF(ix-1, last_boll_value["lower"]) end_point = QtCore.QPointF(ix, boll_value["lower"]) painter.drawLine(start_point, end_point) start_point = QtCore.QPointF(ix-1, last_boll_value["middle"]) end_point = QtCore.QPointF(ix, boll_value["middle"]) painter.setPen(self.white_pen) painter.drawLine(start_point, end_point) # Finish painter.end() return picture
def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture: """""" rsi_value = self.values[ix] last_rsi_value = self.values[ix - 1] # Create objects picture = QtGui.QPicture() painter = QtGui.QPainter(picture) # Draw RSI line painter.setPen(self.yellow_pen) if np.isnan(last_rsi_value) or np.isnan(rsi_value): # print(ix - 1, last_rsi_value,ix, rsi_value,) pass else: end_point = QtCore.QPointF(ix, rsi_value) start_point = QtCore.QPointF(ix - 1, last_rsi_value) painter.drawLine(start_point, end_point) # Draw oversold/overbought line painter.setPen(self.white_pen) painter.drawLine( QtCore.QPointF(ix, 70), QtCore.QPointF(ix - 1, 70), ) painter.drawLine( QtCore.QPointF(ix, 30), QtCore.QPointF(ix - 1, 30), ) # Finish painter.end() return picture
k.open_interest = 0 k.open_price = data.open[i] k.close_price = data.close[i] k.high_price = data.high[i] k.low_price = data.low[i] bars.append(k) print('Over') widget = ChartWidget() widget.add_plot("candle", hide_x_axis=True) widget.add_plot("volume", maximum_height=200) widget.add_item(CandleItem, "candle", "candle") widget.add_item(VolumeItem, "volume", "volume") widget.add_cursor() n = 1000 history = bars[:n] new_data = bars[n:] widget.update_history(history) def update_bar(): bar = new_data.pop(0) widget.update_bar(bar) timer = QtCore.QTimer() timer.timeout.connect(update_bar) timer.start(100) widget.show() app.exec_()
class OptionManualTrader(QtWidgets.QWidget): """""" signal_tick = QtCore.pyqtSignal(TickData) def __init__(self, option_engine: OptionEngine, portfolio_name: str): """""" super().__init__() self.option_engine = option_engine self.main_engine: MainEngine = option_engine.main_engine self.event_engine: EventEngine = option_engine.event_engine self.contracts: Dict[str, ContractData] = {} self.vt_symbol = "" self.init_ui() self.init_contracts() def init_ui(self) -> None: """""" self.setWindowTitle("期权交易") # Trading Area self.symbol_line = QtWidgets.QLineEdit() self.symbol_line.returnPressed.connect(self._update_symbol) float_validator = QtGui.QDoubleValidator() float_validator.setBottom(0) self.price_line = QtWidgets.QLineEdit() self.price_line.setValidator(float_validator) int_validator = QtGui.QIntValidator() int_validator.setBottom(0) self.volume_line = QtWidgets.QLineEdit() self.volume_line.setValidator(int_validator) self.direction_combo = QtWidgets.QComboBox() self.direction_combo.addItems( [Direction.LONG.value, Direction.SHORT.value]) self.offset_combo = QtWidgets.QComboBox() self.offset_combo.addItems([Offset.OPEN.value, Offset.CLOSE.value]) order_button = QtWidgets.QPushButton("委托") order_button.clicked.connect(self.send_order) cancel_button = QtWidgets.QPushButton("全撤") cancel_button.clicked.connect(self.cancel_all) form1 = QtWidgets.QFormLayout() form1.addRow("代码", self.symbol_line) form1.addRow("方向", self.direction_combo) form1.addRow("开平", self.offset_combo) form1.addRow("价格", self.price_line) form1.addRow("数量", self.volume_line) form1.addRow(order_button) form1.addRow(cancel_button) # Depth Area bid_color = "rgb(255,174,201)" ask_color = "rgb(160,255,160)" self.bp1_label = self.create_label(bid_color) self.bp2_label = self.create_label(bid_color) self.bp3_label = self.create_label(bid_color) self.bp4_label = self.create_label(bid_color) self.bp5_label = self.create_label(bid_color) self.bv1_label = self.create_label(bid_color, alignment=QtCore.Qt.AlignRight) self.bv2_label = self.create_label(bid_color, alignment=QtCore.Qt.AlignRight) self.bv3_label = self.create_label(bid_color, alignment=QtCore.Qt.AlignRight) self.bv4_label = self.create_label(bid_color, alignment=QtCore.Qt.AlignRight) self.bv5_label = self.create_label(bid_color, alignment=QtCore.Qt.AlignRight) self.ap1_label = self.create_label(ask_color) self.ap2_label = self.create_label(ask_color) self.ap3_label = self.create_label(ask_color) self.ap4_label = self.create_label(ask_color) self.ap5_label = self.create_label(ask_color) self.av1_label = self.create_label(ask_color, alignment=QtCore.Qt.AlignRight) self.av2_label = self.create_label(ask_color, alignment=QtCore.Qt.AlignRight) self.av3_label = self.create_label(ask_color, alignment=QtCore.Qt.AlignRight) self.av4_label = self.create_label(ask_color, alignment=QtCore.Qt.AlignRight) self.av5_label = self.create_label(ask_color, alignment=QtCore.Qt.AlignRight) self.lp_label = self.create_label() self.return_label = self.create_label(alignment=QtCore.Qt.AlignRight) min_width = 70 self.lp_label.setMinimumWidth(min_width) self.return_label.setMinimumWidth(min_width) form2 = QtWidgets.QFormLayout() form2.addRow(self.ap5_label, self.av5_label) form2.addRow(self.ap4_label, self.av4_label) form2.addRow(self.ap3_label, self.av3_label) form2.addRow(self.ap2_label, self.av2_label) form2.addRow(self.ap1_label, self.av1_label) form2.addRow(self.lp_label, self.return_label) form2.addRow(self.bp1_label, self.bv1_label) form2.addRow(self.bp2_label, self.bv2_label) form2.addRow(self.bp3_label, self.bv3_label) form2.addRow(self.bp4_label, self.bv4_label) form2.addRow(self.bp5_label, self.bv5_label) # Set layout hbox = QtWidgets.QHBoxLayout() hbox.addLayout(form1) hbox.addLayout(form2) self.setLayout(hbox) def init_contracts(self) -> None: """""" contracts = self.main_engine.get_all_contracts() for contract in contracts: self.contracts[contract.symbol] = contract def connect_signal(self) -> None: """""" self.signal_tick.connect(self.update_tick) def send_order(self) -> None: """""" symbol = self.symbol_line.text() contract = self.contracts.get(symbol, None) if not contract: return price_text = self.price_line.text() volume_text = self.volume_line.text() if not price_text or not volume_text: return price = float(price_text) volume = int(volume_text) direction = Direction(self.direction_combo.currentText()) offset = Offset(self.offset_combo.currentText()) req = OrderRequest(symbol=contract.symbol, exchange=contract.exchange, direction=direction, type=OrderType.LIMIT, offset=offset, volume=volume, price=price) self.main_engine.send_order(req, contract.gateway_name) def cancel_all(self) -> None: """""" for order in self.main_engine.get_all_active_orders(): req = order.create_cancel_request() self.main_engine.cancel_order(req, order.gateway_name) def update_symbol(self, cell: MonitorCell) -> None: """""" if not cell.vt_symbol: return symbol = cell.vt_symbol.split(".")[0] self.symbol_line.setText(symbol) self._update_symbol() def _update_symbol(self) -> None: """""" symbol = self.symbol_line.text() contract = self.contracts.get(symbol, None) if contract and contract.vt_symbol == self.vt_symbol: return if self.vt_symbol: self.event_engine.unregister(EVENT_TICK + self.vt_symbol, self.process_tick_event) self.clear_data() self.vt_symbol = "" if not contract: return vt_symbol = contract.vt_symbol self.vt_symbol = vt_symbol tick = self.main_engine.get_tick(vt_symbol) if tick: self.update_tick(tick) self.event_engine.unregister(EVENT_TICK + vt_symbol, self.process_tick_event) def create_label(self, color: str = "", alignment: int = QtCore.Qt.AlignLeft) -> QtWidgets.QLabel: """ Create label with certain font color. """ label = QtWidgets.QLabel("-") if color: label.setStyleSheet(f"color:{color}") label.setAlignment(alignment) return label def process_tick_event(self, event: Event) -> None: """""" tick = event.data if tick.vt_symbol != self.vt_symbol: return self.signal_tick.emit(tick) def update_tick(self, tick: TickData) -> None: """""" self.lp_label.setText(str(tick.last_price)) self.bp1_label.setText(str(tick.bid_price_1)) self.bv1_label.setText(str(tick.bid_volume_1)) self.ap1_label.setText(str(tick.ask_price_1)) self.av1_label.setText(str(tick.ask_volume_1)) if tick.pre_close: r = (tick.last_price / tick.pre_close - 1) * 100 self.return_label.setText(f"{r:.2f}%") if tick.bid_price_2: self.bp2_label.setText(str(tick.bid_price_2)) self.bv2_label.setText(str(tick.bid_volume_2)) self.ap2_label.setText(str(tick.ask_price_2)) self.av2_label.setText(str(tick.ask_volume_2)) self.bp3_label.setText(str(tick.bid_price_3)) self.bv3_label.setText(str(tick.bid_volume_3)) self.ap3_label.setText(str(tick.ask_price_3)) self.av3_label.setText(str(tick.ask_volume_3)) self.bp4_label.setText(str(tick.bid_price_4)) self.bv4_label.setText(str(tick.bid_volume_4)) self.ap4_label.setText(str(tick.ask_price_4)) self.av4_label.setText(str(tick.ask_volume_4)) self.bp5_label.setText(str(tick.bid_price_5)) self.bv5_label.setText(str(tick.bid_volume_5)) self.ap5_label.setText(str(tick.ask_price_5)) self.av5_label.setText(str(tick.ask_volume_5)) def clear_data(self) -> None: """""" self.lp_label.setText("-") self.return_label.setText("-") self.bp1_label.setText("-") self.bv1_label.setText("-") self.ap1_label.setText("-") self.av1_label.setText("-") self.bp2_label.setText("-") self.bv2_label.setText("-") self.ap2_label.setText("-") self.av2_label.setText("-") self.bp3_label.setText("-") self.bv3_label.setText("-") self.ap3_label.setText("-") self.av3_label.setText("-") self.bp4_label.setText("-") self.bv4_label.setText("-") self.ap4_label.setText("-") self.av4_label.setText("-") self.bp5_label.setText("-") self.bv5_label.setText("-") self.ap5_label.setText("-") self.av5_label.setText("-")