def create_chart(self) -> ChartWidget: """""" chart = ChartWidget() chart.add_plot("candle", hide_x_axis=True) chart.add_plot("volume", maximum_height=200) chart.add_item(CandleItem, "candle", "candle") chart.add_item(VolumeItem, "volume", "volume") chart.add_cursor() return chart
k = BarData(gateway_name='shioaji', symbol="TXF", exchange=Exchange.SMART, datetime=data.index[i]) k.volume = data.vol[i] 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)
class CandleChartDialog(QtWidgets.QDialog): """ """ def __init__(self): """""" super().__init__() self.dt_ix_map = {} self.updated = False self.init_ui() def init_ui(self): """""" self.setWindowTitle("回测K线图表") self.resize(1400, 800) # Create chart widget self.chart = ChartWidget() self.chart.add_plot("candle", hide_x_axis=True) self.chart.add_plot("volume", maximum_height=200) self.chart.add_item(CandleItem, "candle", "candle") self.chart.add_item(VolumeItem, "volume", "volume") self.chart.add_cursor() # Add scatter item for showing tradings self.trade_scatter = pg.ScatterPlotItem() candle_plot = self.chart.get_plot("candle") candle_plot.addItem(self.trade_scatter) # Set layout vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.chart) self.setLayout(vbox) def update_history(self, history: list): """""" self.updated = True self.chart.update_history(history) for ix, bar in enumerate(history): self.dt_ix_map[bar.datetime] = ix def update_trades(self, trades: list): """""" trade_data = [] for trade in trades: ix = self.dt_ix_map[trade.datetime] scatter = { "pos": (ix, trade.price), "data": 1, "size": 14, "pen": pg.mkPen((255, 255, 255)) } if trade.direction == Direction.LONG: scatter["symbol"] = "t1" scatter["brush"] = pg.mkBrush((255, 255, 0)) else: scatter["symbol"] = "t" scatter["brush"] = pg.mkBrush((0, 0, 255)) trade_data.append(scatter) self.trade_scatter.setData(trade_data) def clear_data(self): """""" self.updated = False self.chart.clear_all() self.dt_ix_map.clear() self.trade_scatter.clear() def is_updated(self): """""" return self.updated
class CandleChartDialog(QtWidgets.QDialog): """ """ def __init__(self): """""" super().__init__() self.updated = False self.dt_ix_map = {} self.ix_bar_map = {} self.high_price = 0 self.low_price = 0 self.price_range = 0 self.items = [] self.init_ui() def init_ui(self): """""" self.setWindowTitle("回测K线图表") self.resize(1400, 800) # Create chart widget self.chart = ChartWidget() self.chart.add_plot("candle", hide_x_axis=True) self.chart.add_plot("volume", maximum_height=200) self.chart.add_item(CandleItem, "candle", "candle") self.chart.add_item(VolumeItem, "volume", "volume") self.chart.add_cursor() # Create help widget text1 = "红色虚线 —— 盈利交易" label1 = QtWidgets.QLabel(text1) label1.setStyleSheet("color:red") text2 = "绿色虚线 —— 亏损交易" label2 = QtWidgets.QLabel(text2) label2.setStyleSheet("color:#00FF00") text3 = "黄色向上箭头 —— 买入开仓 Buy" label3 = QtWidgets.QLabel(text3) label3.setStyleSheet("color:yellow") text4 = "黄色向下箭头 —— 卖出平仓 Sell" label4 = QtWidgets.QLabel(text4) label4.setStyleSheet("color:yellow") text5 = "紫红向下箭头 —— 卖出开仓 Short" label5 = QtWidgets.QLabel(text5) label5.setStyleSheet("color:magenta") text6 = "紫红向上箭头 —— 买入平仓 Cover" label6 = QtWidgets.QLabel(text6) label6.setStyleSheet("color:magenta") hbox1 = QtWidgets.QHBoxLayout() hbox1.addStretch() hbox1.addWidget(label1) hbox1.addStretch() hbox1.addWidget(label2) hbox1.addStretch() hbox2 = QtWidgets.QHBoxLayout() hbox2.addStretch() hbox2.addWidget(label3) hbox2.addStretch() hbox2.addWidget(label4) hbox2.addStretch() hbox3 = QtWidgets.QHBoxLayout() hbox3.addStretch() hbox3.addWidget(label5) hbox3.addStretch() hbox3.addWidget(label6) hbox3.addStretch() # Set layout vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.chart) vbox.addLayout(hbox1) vbox.addLayout(hbox2) vbox.addLayout(hbox3) self.setLayout(vbox) def update_history(self, history: list): """""" self.updated = True self.chart.update_history(history) for ix, bar in enumerate(history): self.ix_bar_map[ix] = bar self.dt_ix_map[bar.datetime] = ix if not self.high_price: self.high_price = bar.high_price self.low_price = bar.low_price else: self.high_price = max(self.high_price, bar.high_price) self.low_price = min(self.low_price, bar.low_price) self.price_range = self.high_price - self.low_price def update_trades(self, trades: list): """""" trade_pairs = generate_trade_pairs(trades) candle_plot = self.chart.get_plot("candle") scatter_data = [] y_adjustment = self.price_range * 0.001 for d in trade_pairs: open_ix = self.dt_ix_map[d["open_dt"]] close_ix = self.dt_ix_map[d["close_dt"]] open_price = d["open_price"] close_price = d["close_price"] # Trade Line x = [open_ix, close_ix] y = [open_price, close_price] if d["direction"] == Direction.LONG and close_price >= open_price: color = "r" elif d["direction"] == Direction.SHORT and close_price <= open_price: color = "r" else: color = "g" pen = pg.mkPen(color, width=1.5, style=QtCore.Qt.DashLine) item = pg.PlotCurveItem(x, y, pen=pen) self.items.append(item) candle_plot.addItem(item) # Trade Scatter open_bar = self.ix_bar_map[open_ix] close_bar = self.ix_bar_map[close_ix] if d["direction"] == Direction.LONG: scatter_color = "yellow" open_symbol = "t1" close_symbol = "t" open_side = 1 close_side = -1 open_y = open_bar.low_price close_y = close_bar.high_price else: scatter_color = "magenta" open_symbol = "t" close_symbol = "t1" open_side = -1 close_side = 1 open_y = open_bar.high_price close_y = close_bar.low_price pen = pg.mkPen(QtGui.QColor(scatter_color)) brush = pg.mkBrush(QtGui.QColor(scatter_color)) size = 10 open_scatter = { "pos": (open_ix, open_y - open_side * y_adjustment), "size": size, "pen": pen, "brush": brush, "symbol": open_symbol } close_scatter = { "pos": (close_ix, close_y - close_side * y_adjustment), "size": size, "pen": pen, "brush": brush, "symbol": close_symbol } scatter_data.append(open_scatter) scatter_data.append(close_scatter) # Trade text volume = d["volume"] text_color = QtGui.QColor(scatter_color) open_text = pg.TextItem(f"[{volume}]", color=text_color, anchor=(0.5, 0.5)) close_text = pg.TextItem(f"[{volume}]", color=text_color, anchor=(0.5, 0.5)) open_text.setPos(open_ix, open_y - open_side * y_adjustment * 3) close_text.setPos(close_ix, close_y - close_side * y_adjustment * 3) self.items.append(open_text) self.items.append(close_text) candle_plot.addItem(open_text) candle_plot.addItem(close_text) trade_scatter = pg.ScatterPlotItem(scatter_data) self.items.append(trade_scatter) candle_plot.addItem(trade_scatter) def clear_data(self): """""" self.updated = False candle_plot = self.chart.get_plot("candle") for item in self.items: candle_plot.removeItem(item) self.items.clear() self.chart.clear_all() self.dt_ix_map.clear() self.ix_bar_map.clear() def is_updated(self): """""" return self.updated