M4 workin bishhhhh
parent
8b89ba6111
commit
01f06976ed
|
@ -217,6 +217,7 @@ class BarItems(pg.GraphicsObject):
|
||||||
self._color = pen_color
|
self._color = pen_color
|
||||||
self.bars_pen = pg.mkPen(hcolor(pen_color), width=1)
|
self.bars_pen = pg.mkPen(hcolor(pen_color), width=1)
|
||||||
self.last_bar_pen = pg.mkPen(hcolor(last_bar_color), width=2)
|
self.last_bar_pen = pg.mkPen(hcolor(last_bar_color), width=2)
|
||||||
|
self._array = None
|
||||||
|
|
||||||
# NOTE: this prevents redraws on mouse interaction which is
|
# NOTE: this prevents redraws on mouse interaction which is
|
||||||
# a huge boon for avg interaction latency.
|
# a huge boon for avg interaction latency.
|
||||||
|
@ -249,6 +250,7 @@ class BarItems(pg.GraphicsObject):
|
||||||
self._ds_lines: dict[int, FastAppendCurve] = {}
|
self._ds_lines: dict[int, FastAppendCurve] = {}
|
||||||
self._ds_line: Optional[FastAppendCurve] = None
|
self._ds_line: Optional[FastAppendCurve] = None
|
||||||
self._ds: int = 0
|
self._ds: int = 0
|
||||||
|
self._xs_in_px: float = 0
|
||||||
|
|
||||||
def draw_from_data(
|
def draw_from_data(
|
||||||
self,
|
self,
|
||||||
|
@ -283,10 +285,11 @@ class BarItems(pg.GraphicsObject):
|
||||||
# https://doc.qt.io/qt-5/qgraphicsitem.html#update
|
# https://doc.qt.io/qt-5/qgraphicsitem.html#update
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
self.update_ds_line(ohlc)
|
# self.update_ds_line(ohlc)
|
||||||
assert self._ds_line
|
# assert self._ds_line
|
||||||
self._ds_line.hide()
|
# self._ds_line.hide()
|
||||||
|
|
||||||
|
self._array = ohlc
|
||||||
return self.path
|
return self.path
|
||||||
|
|
||||||
def get_ds_line(
|
def get_ds_line(
|
||||||
|
@ -332,28 +335,47 @@ class BarItems(pg.GraphicsObject):
|
||||||
# return None, None
|
# return None, None
|
||||||
|
|
||||||
index = ohlc['index']
|
index = ohlc['index']
|
||||||
|
|
||||||
|
chart = self.linked.chart
|
||||||
|
if not chart:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
px_width = round(chart.curve_width_pxs())
|
||||||
|
|
||||||
flat = rfn.structured_to_unstructured(
|
flat = rfn.structured_to_unstructured(
|
||||||
ohlc[['open', 'high', 'low', 'close']]
|
ohlc[['open', 'high', 'low', 'close']]
|
||||||
).flatten()
|
).flatten()
|
||||||
xpts = np.linspace(start=index[0] - 0.5, stop=index[-1] + 0.5, num=4*len(ohlc))
|
xpts = np.linspace(
|
||||||
|
start=index[0] - 0.5,
|
||||||
|
stop=index[-1] + 0.5,
|
||||||
|
num=4*len(ohlc),
|
||||||
|
)
|
||||||
|
bins, x, y = ds_m4(
|
||||||
|
xpts,
|
||||||
|
flat,
|
||||||
|
px_width=px_width * 8,
|
||||||
|
)
|
||||||
|
# x4 = np.zeros(y.shape)
|
||||||
|
x = np.broadcast_to(x[:, None], y.shape) #.flatten()
|
||||||
|
x = (x + np.array([-0.5, 0, 0, 0.5])).flatten()
|
||||||
|
|
||||||
# bins, x, ds = ds_m4(
|
# x = np.linspace(
|
||||||
# xpts,
|
# start=x[0] - 0.5,
|
||||||
# flat,
|
# stop=x[-1] + 0.5,
|
||||||
# # px_width=self.linked.chart.curve_width_pxs()
|
# num=4*len(x),
|
||||||
# px_width=self.getViewBox().width(),
|
|
||||||
# )
|
# )
|
||||||
|
y = y.flatten()
|
||||||
# breakpoint()
|
# breakpoint()
|
||||||
|
|
||||||
mxmn, x = hl2mxmn(ohlc)
|
# y, x = hl2mxmn(ohlc)
|
||||||
|
|
||||||
# if self._ds_line:
|
# if self._ds_line:
|
||||||
# self._pi.removeItem(self._ds_line)
|
# self._pi.removeItem(self._ds_line)
|
||||||
|
|
||||||
if not curve:
|
if not curve:
|
||||||
curve = FastAppendCurve(
|
curve = FastAppendCurve(
|
||||||
# y=ds.flatten(),
|
y=y,
|
||||||
y=mxmn,
|
# y=mxmn,
|
||||||
x=x,
|
x=x,
|
||||||
name='ds',
|
name='ds',
|
||||||
color=self._color,
|
color=self._color,
|
||||||
|
@ -363,6 +385,7 @@ class BarItems(pg.GraphicsObject):
|
||||||
self._pi.addItem(curve)
|
self._pi.addItem(curve)
|
||||||
self._ds_lines[ds] = curve
|
self._ds_lines[ds] = curve
|
||||||
self._ds_line = curve
|
self._ds_line = curve
|
||||||
|
curve.ds = px_width
|
||||||
|
|
||||||
# elif ds != self._ds:
|
# elif ds != self._ds:
|
||||||
# print(f'ds changed {self._ds} -> {ds}')
|
# print(f'ds changed {self._ds} -> {ds}')
|
||||||
|
@ -386,8 +409,13 @@ class BarItems(pg.GraphicsObject):
|
||||||
# istart, istop = curve._xrange
|
# istart, istop = curve._xrange
|
||||||
# curve.path = None
|
# curve.path = None
|
||||||
# print(x[-10:])
|
# print(x[-10:])
|
||||||
|
if px_width != curve.ds:
|
||||||
|
print(f'redrawing {curve.ds} -> {px_width}')
|
||||||
|
curve.path = None
|
||||||
|
curve.ds = px_width
|
||||||
|
|
||||||
curve.update_from_array(
|
curve.update_from_array(
|
||||||
y=mxmn,
|
y=y,
|
||||||
x=x,
|
x=x,
|
||||||
)
|
)
|
||||||
# curve.update()
|
# curve.update()
|
||||||
|
@ -415,7 +443,7 @@ class BarItems(pg.GraphicsObject):
|
||||||
|
|
||||||
'''
|
'''
|
||||||
# XXX: always do this?
|
# XXX: always do this?
|
||||||
if self._ds_line:
|
# if self._ds_line:
|
||||||
curve, ds = self.update_ds_line(ohlc)
|
curve, ds = self.update_ds_line(ohlc)
|
||||||
|
|
||||||
# index = self.start_index
|
# index = self.start_index
|
||||||
|
@ -507,6 +535,8 @@ class BarItems(pg.GraphicsObject):
|
||||||
if flip_cache:
|
if flip_cache:
|
||||||
self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
|
self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
|
||||||
|
|
||||||
|
self._array = ohlc
|
||||||
|
|
||||||
def boundingRect(self):
|
def boundingRect(self):
|
||||||
# Qt docs: https://doc.qt.io/qt-5/qgraphicsitem.html#boundingRect
|
# Qt docs: https://doc.qt.io/qt-5/qgraphicsitem.html#boundingRect
|
||||||
|
|
||||||
|
@ -530,6 +560,8 @@ class BarItems(pg.GraphicsObject):
|
||||||
mx_y = hb_br.y()
|
mx_y = hb_br.y()
|
||||||
mn_y = hb_tl.y()
|
mn_y = hb_tl.y()
|
||||||
|
|
||||||
|
last_lines = self._last_bar_lines
|
||||||
|
if last_lines:
|
||||||
body_line = self._last_bar_lines[0]
|
body_line = self._last_bar_lines[0]
|
||||||
if body_line:
|
if body_line:
|
||||||
mx_y = max(mx_y, max(body_line.y1(), body_line.y2()))
|
mx_y = max(mx_y, max(body_line.y1(), body_line.y2()))
|
||||||
|
@ -563,6 +595,9 @@ class BarItems(pg.GraphicsObject):
|
||||||
is less then a pixel width on the device).
|
is less then a pixel width on the device).
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
if not self._ds_line:
|
||||||
|
return False
|
||||||
|
|
||||||
# this is the ``float`` value of the "number of x units" (in
|
# this is the ``float`` value of the "number of x units" (in
|
||||||
# view coords) that a pixel spans.
|
# view coords) that a pixel spans.
|
||||||
xvec = self.pixelVectors()[0]
|
xvec = self.pixelVectors()[0]
|
||||||
|
@ -571,6 +606,10 @@ class BarItems(pg.GraphicsObject):
|
||||||
else:
|
else:
|
||||||
xs_in_px = self._ds_line.pixelVectors()[0].x()
|
xs_in_px = self._ds_line.pixelVectors()[0].x()
|
||||||
|
|
||||||
|
if xs_in_px != self._xs_in_px and self._array is not None:
|
||||||
|
self.update_ds_line(self._array)
|
||||||
|
self._xs_in_px = xs_in_px
|
||||||
|
|
||||||
linked = self.linked
|
linked = self.linked
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|
Loading…
Reference in New Issue