コードは非常にシンプルです
import pyqtgraph as pg from pyqtgraph import QtCore, QtGui import numpy import numpy as np import pandas as pd from ta import * class GetData(): def __init__(self, *arg): pass def getData(self, code, ktype): self.code = code self.ktype = ktype return self.getData_Tushare(self.code, self.ktype) def getData_Tushare(self, code, ktype='30'): try: self.k_data = TAInstance().Get_kline(code, ktype) # print(pd.DataFrame(self.k_data)) return pd.DataFrame(self.k_data) except: print('getData_Tushare except') return class CandlestickItem(pg.GraphicsObject): def __init__(self, data): pg.GraphicsObject.__init__(self) self.data = data ## data must have fields: time, open, close, min, max self.generatePicture() def generatePicture(self): self.picture = QtGui.QPicture() p = QtGui.QPainter(self.picture) w = 0.4 bPen = pg.mkPen(color=(0, 240, 240, 255), width=w * 2) bBrush = pg.mkBrush((0, 240, 240, 255)) rPen = pg.mkPen(color=(255, 60, 60, 255), width=w * 2) rBrush = pg.mkBrush((255, 60, 60, 255)) rBrush.setStyle(QtCore.Qt.NoBrush) #阳线红色,空心 for (t, open, close, low, high) in self.data: # 下跌蓝色(实心), 上涨红色(空心) pen, brush, pmin, pmax = (bPen, bBrush, close, open) \ if open > close else (rPen, rBrush, open, close) p.setPen(pen) p.setBrush(brush) # 画K线方块和上下影线 if open == close: p.drawLine(QtCore.QPointF(t - w, open), QtCore.QPointF(t + w, close)) else: p.drawRect(QtCore.QRectF(t - w, open, w * 2, close - open)) if pmin > low: p.drawLine(QtCore.QPointF(t, low), QtCore.QPointF(t, pmin)) if high > pmax: p.drawLine(QtCore.QPointF(t, pmax), QtCore.QPointF(t, high)) p.end() def paint(self, p, *args): p.drawPicture(0, 0, self.picture) def boundingRect(self): return QtCore.QRectF(self.picture.boundingRect()) def data(code): data = [] dataTool = GetData() # code = "ni2301" datas = dataTool.getData(code, '30') # print(datas) datas['date'] = np.array(range(len(datas.index))) print(datas) data = datas[['date', 'Open', 'Close', 'Low', 'High']].to_records(False) # print(data) return data # data = [ ## 数据对应关系 (time, open, close, min, max). # (1., 10, 13, 5, 15), # (2., 13, 17, 9, 20), # (3., 17, 14, 11, 23), # (4., 14, 15, 5, 19), # (5., 15, 9, 8, 22), # (6., 9, 15, 8, 16), # (7., 1.0, 1.3, 0.5, 1.5),#这里把官方示例的数据缩小10倍,为的是能明显开出K线的差别 # (8., 1.3, 1.7, 0.9, 2.0), # (9., 1.7, 1.4, 1.1, 2.3), # (10., 1.4, 1.5, 0.5, 1.9), # (11., 1.5, 0.9, 0.8, 2.2), # (12., 0.9, 1.5, 0.8, 1.6), # ] # item = CandlestickItem(data) #原始数据,对应(0,0)幅图 # item2 =CandlestickItem(data) #把原始数据里Y轴相关的数据,全部预先用log对数化处理一下,对应(0,1) # item3= CandlestickItem(data) #原始数据,对应第三幅图(1,0) # item4 =CandlestickItem(data) #验证一下,是不是setLogMode在自定义组件的时候,得自己去实现(1,1) # w=pg.GraphicsWindow() # w.setWindowTitle('公众号:Ctp接口量化') # plt = w.addPlot(0,0, title=code) # plt.addItem(item) # plt.showGrid(True, True) # plt2 = w.addPlot(0,1, title=code) # plt2.addItem(item2) # plt2.showGrid(True, True) # plt3 = w.addPlot(1,0, title=code) # plt3.addItem(item3) # plt3.showGrid(True, True) # # plt3.setLogMode(False, True) # plt4 = w.addPlot(1,1, title=code) # plt4.addItem(item4) # plt4.showGrid(True, True) # # plt4.setLogMode(False, True) w=pg.GraphicsWindow() w.setWindowTitle('公众号:Ctp接口量化') # symbol_lsit = ["000911","600168","M0","ni2301","IF2212","IC2212","rb2301","MA301"] symbol_lsit = ["IF2212"] j=0 # Buju = [(i, j) for i in range(5) for j in range(4)] Buju = [(i, j) for i in range(len(symbol_lsit)) for j in range(2)] # print(Buju) j=0 for i in symbol_lsit: y = CandlestickItem(data(i)) plt = w.addPlot(int(Buju[j][0]),int(Buju[j][1]), title=i) plt.addItem(y) plt.showGrid(True, True) j += 1 import sys if __name__ == '__main__': app = QtGui.QApplication.instance() app.exec_()