Следующий код читает данные 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()