def update(self, ohlc): if self._active: data = getattr(ohlc, self.name, None) if data: for p in self.plts: self._update(p, ohlc, data) V_logger.info(f'G↑更新{self.name}图表至{p}') else: for p in self.plts: self._update(p, ohlc) V_logger.info(f'G↑更新{self.name}图表至{p}')
def set_info_text(self, p, *args, **kwargs): try: if p in self.plt_texts: plt = self.plts[p] textitem = self.plt_texts[p] vbr = plt.vb.viewRange() info_text = self.info_text(p, *args, **kwargs) textitem.setHtml(info_text) p = self.text_pos[p] Pos = (vbr[p[0]][p[1]], vbr[p[2]][p[3]]) textitem.setPos(*Pos) except Exception as e: V_logger.debug(f'set_info_text设置信息错误->{p}')
def init(self, ohlc): if not self._active: data = getattr(ohlc, self.name, None) self.text_pos = {} self.plt_texts = {} self.plt_items = {p_name: {} for p_name in self.plts} if data: for p in self.plts: self._init(p, ohlc, data) V_logger.info(f'G+初始化{self.name}图表至{p}') else: for p in self.plts: self._init(p, ohlc) V_logger.info(f'G+初始化{self.name}图表至{p}') self._active = True
def __init__(self, name, date_xaxis): super(plt_base, self).__init__(viewBox=pg.ViewBox(), name=name, axisItems={'bottom': date_xaxis}) # vb = CustomViewBox() self.setMenuEnabled(False) # self.setClipToView(True) self.hideAxis('left') self.showAxis('right') self.setDownsampling(mode='peak') # # self.setRange(xRange=(0, 1), yRange=(0, 1)) self.getAxis('right').setWidth(30) self.getAxis('right').setStyle(tickFont=QFont("Roman times", 6, QFont.Bold)) self.getAxis('right').setPen(color=(255, 255, 255, 255), width=0.8) self.showGrid(True, True) self.hideButtons() V_logger.info(f'初始化{name}画布')
def _update(self, p, ohlc, trade_data): x = ohlc.x U = self.long_symbol D = self.short_symbol item = self.plt_items[p] try: item['open'].setData( x=x.reindex(trade_data.open.index.floor(ohlc.ktype)), y=trade_data['OpenPrice'], symbol=[U if t == 0 else D for t in trade_data['Type']], brush=trade_data['Status'].map({ 2: pg.mkBrush(QBrush(QColor(0, 0, 255))), 1: pg.mkBrush(QBrush(QColor(255, 0, 255))), 0: pg.mkBrush(QBrush(QColor(255, 255, 255))) }).tolist(), size=5) except Exception as e: V_logger.error(f'初始化交易数据标记TradeDataScatter-open失败') try: item['close'].setData( x=x.reindex(trade_data.close.index.floor(ohlc.ktype)), y=trade_data['ClosePrice'], symbol=[D if t == 0 else U for t in trade_data['Type']], brush=trade_data['Status'].map({ 2: pg.mkBrush(QBrush(QColor(255, 255, 0))), 1: pg.mkBrush(QBrush(QColor(255, 0, 255))), 0: pg.mkBrush(QBrush(QColor(255, 255, 255))) }).tolist(), size=5) except Exception as e: V_logger.error(f'初始化交易数据标记TradeDataScatter-open失败') # ------------------------------------------------------------------------------------------------------------- def link_line(a, b): trade_data = ohlc.Trade_Data if a is item['open']: for i, d in enumerate(item['open'].data): if b[0].pos().x() == d[0] and b[0].pos().y() == d[1]: index = i break elif a is item['close']: for i, d in enumerate(item['close'].data): if b[0].pos().x() == d[0] and b[0].pos().y() == d[1]: index = i break open_x = item['open'].data[index][0] open_y = item['open'].data[index][1] open_symbol = item['open'].data[index][3] # open_symbol来区别开仓平仓 if trade_data["Status"].iloc[index] == 2: close_x = item['close'].data[index][0] close_y = item['close'].data[index][1] else: close_x = item['close'].data[index][0] close_y = ohlc._last_tick.Price if ohlc._last_tick else ohlc.data.iloc[ -1]['close'] profit = round(close_y - open_y, 2) if open_symbol == "t1" else round( open_y - close_y, 2) pen_color_type = ((open_symbol == 't1') << 1) + (open_y < close_y) pen_color_map_dict = {0: 'r', 1: 'g', 2: 'g', 3: 'r'} item['link_line'].setData([[open_x, open_y], [close_x, close_y]], pen_color_map_dict[pen_color_type]) self.set_info_text(p, trade_data, open_y, close_y, open_symbol, profit, index) item['open'].sigClicked.connect(link_line) item['close'].sigClicked.connect(link_line)
def deinit(self): if self._active: for p in self.plts: self._deinit(p) V_logger.info(f'G-反初始化{self.name}图表') self._active = False