Python ウィンドウは複数の限月 K ライン チャートを同時に描画します

 

 コードは非常にシンプルです 

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_()        
        

おすすめ

転載: blog.csdn.net/qq_20575249/article/details/128266616