как добавить перекрестие pyqtgraph ccxt - PullRequest
0 голосов
/ 28 января 2020

Следующий код читает данные CSV и создает в списке свечи объемом 2M и использует pyqtgraph для генерации графиков, использует 2 потока и asyncio для обновления данных и графиков, мой вопрос заключается в том, как нарисовать перекрестие в pg.plot (), данные хранятся в .csv и каждые 2M в объеме добавляет новую свечу, используя API ccxt для загрузки данных, в результате чего класс plot (), к которому я хочу добавить перекрестие

import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
import ccxt.async_support as ccxt
import numpy as np
import threading
import asyncio
import time
import pandas as pd
import csv
class CandlestickItem(pg.GraphicsObject):
    def __init__(self, data):
        pg.GraphicsObject.__init__(self)
        self.data = data
        self.generatePicture()

    def generatePicture(self):
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        w = (self.data[1][0] - self.data[0][0]) / 3.
        for (t,d, min, max, last, b,s, v) in self.data:
            if b > s:
                p.setPen(pg.mkPen('g'))
                p.setBrush(pg.mkBrush('g'))
            else:
                p.setPen(pg.mkPen('r'))
                p.setBrush(pg.mkBrush('r'))
            p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
            p.drawRect(QtCore.QRectF(t-w, last, w*2, last-last+0.05))
        p.end()

    def paint(self, p, *args):
        p.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        return QtCore.QRectF(self.picture.boundingRect())

class plot():
    def __init__(self):
        self.data = []
        self.volume = 0
        self.readata()
        self.t = threading.Thread(target=self.loops, name='loops')
        self.t.setDaemon(True)
        self.t.start()
        self.plt = pg.plot()
        self.text = pg.TextItem(text="update", anchor=(-0.3,2), angle=0, border='w', fill=(0, 0, 255, 100))
        self.textV = pg.TextItem(text='update', anchor=(-0.3,2), angle=0, border='w', fill=(0,0,255,100))
        self.plt.addItem(self.textV)
        self.plt.addItem(self.text)
        self.timer = pg.QtCore.QTimer()
        self.timer.timeout.connect(self.newdata)
        self.timer.start(60)
    def readata(self):
        with open("ETHUSD2M5000trades.csv") as File:
            r = pd.read_csv(File)
            values = r.values.tolist()
        self.data = values[-1000:-1]
        File.close()
    async def updatedata(self):
        id = []
        volume = 0
        acum = 0
        close = [0]
        datas =  []
        price = []
        trade = []
        buys = 0
        sells = 0
        exchange = ccxt.bitmex({
            'enableRateLimit': True,
            ' proxies ' : {
            ' http ' : ' http://10.10.1.10:3128 ' ,
            ' https ' : ' http://10.10.1.10:1080 ' ,
        },
        })
        s = int(self.data[-1][1])
        while True:
            asyncio.get_event_loop().is_running()
            ticker = await exchange.fetch_trades(symbol='ETH/USD', since=s, limit=100)
            for e in ticker:
                pg.QtGui.QApplication.processEvents()
                if e['id'] in id:
                    s = int(e['timestamp'] + 1)
                else:
                    id.append(e['id'])
                    exc = 0
                    volume = e['amount'] + volume
                    price.append(e['price'])
                    self.data[-1][3] = np.amax(price)
                    self.data[-1][2] = np.amin(price)
                    self.data[-1][4] = price[-1]
                    self.volume = volume
                    if e['side'] == 'buy':
                        buys +=1
                    else:
                        sells += 1
                    if volume > 2000000:
                        acum = volume - 2000000
                        self.data.append([self.data[-1][0] + 1, e['timestamp'], np.amin(price), np.amax(price), price[-1], buys, sells, volume - acum])
                        buys = 0
                        sells = 0
                        price = []
                        volume = acum
                        self.volume = 0
                        self.write_new_data()
    def loops(self):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(self.updatedata())
        loop.close()

    def write_new_data(self):
        with open("ETHUSD2M5000trades.csv", "w", newline="") as f:
            writer = csv.writer(f)
            writer.writerows(self.data)

    def newdata(self):
        self.plt.clear()
        item = CandlestickItem(self.data)
        self.plt.addItem(item)
        self.plt.addItem(self.text)
        self.plt.addItem(self.textV)
        self.textV.setPos(self.data[-1][0] + 50, self.data[-1][4] - 1)
        self.textV.setText(str(self.volume), color=None)
        self.text.setPos(self.data[-1][0] + 5, self.data[-1][4] - 1)
        self.text.setText(str(self.data[-1][4]), color=None)

plot()
...