Start vlm and other fsps as separate tasks
parent
404f5d6d23
commit
c3c1e14cf4
|
@ -40,6 +40,8 @@ from ._l1 import L1Labels
|
|||
from ._fsp import (
|
||||
update_fsp_chart,
|
||||
start_fsp_displays,
|
||||
has_vlm,
|
||||
open_vlm_displays,
|
||||
)
|
||||
from ..data._sharedmem import ShmArray, try_read
|
||||
from ._forms import (
|
||||
|
@ -81,7 +83,7 @@ def chart_maxmin(
|
|||
# https://arxiv.org/abs/cs/0610046
|
||||
# https://github.com/lemire/pythonmaxmin
|
||||
|
||||
array = chart._arrays['ohlc']
|
||||
array = chart._arrays[chart.name]
|
||||
ifirst = array[0]['index']
|
||||
|
||||
last_bars_range = chart.bars_range()
|
||||
|
@ -139,6 +141,7 @@ async def update_linked_charts_graphics(
|
|||
|
||||
if vlm_chart:
|
||||
vlm_sticky = vlm_chart._ysticks['volume']
|
||||
vlm_view = vlm_chart.view
|
||||
|
||||
maxmin = partial(chart_maxmin, chart, vlm_chart)
|
||||
|
||||
|
@ -175,6 +178,7 @@ async def update_linked_charts_graphics(
|
|||
tick_margin = 3 * tick_size
|
||||
|
||||
chart.show()
|
||||
view = chart.view
|
||||
last_quote = time.time()
|
||||
|
||||
async for quotes in stream:
|
||||
|
@ -186,7 +190,10 @@ async def update_linked_charts_graphics(
|
|||
|
||||
if (
|
||||
quote_period <= 1/_quote_throttle_rate
|
||||
and quote_rate > _quote_throttle_rate * 1.5
|
||||
|
||||
# in the absolute worst case we shouldn't see more then
|
||||
# twice the expected throttle rate right!?
|
||||
and quote_rate >= _quote_throttle_rate * 1.5
|
||||
):
|
||||
log.warning(f'High quote rate {symbol.key}: {quote_rate}')
|
||||
last_quote = now
|
||||
|
@ -223,7 +230,9 @@ async def update_linked_charts_graphics(
|
|||
mx_vlm_in_view > last_mx_vlm
|
||||
):
|
||||
# print(f'mx vlm: {last_mx_vlm} -> {mx_vlm_in_view}')
|
||||
vlm_chart._set_yrange(yrange=(0, mx_vlm_in_view * 1.375))
|
||||
vlm_view._set_yrange(
|
||||
yrange=(0, mx_vlm_in_view * 1.375)
|
||||
)
|
||||
last_mx_vlm = mx_vlm_in_view
|
||||
|
||||
for curve_name, shm in vlm_chart._overlays.items():
|
||||
|
@ -347,9 +356,12 @@ async def update_linked_charts_graphics(
|
|||
l1.bid_label.update_fields({'level': price, 'size': size})
|
||||
|
||||
# check for y-range re-size
|
||||
if (mx > last_mx) or (mn < last_mn):
|
||||
if (
|
||||
(mx > last_mx) or (mn < last_mn)
|
||||
and not chart._static_yrange == 'axis'
|
||||
):
|
||||
# print(f'new y range: {(mn, mx)}')
|
||||
chart._set_yrange(
|
||||
view._set_yrange(
|
||||
yrange=(mn, mx),
|
||||
# TODO: we should probably scale
|
||||
# the view margin based on the size
|
||||
|
@ -371,6 +383,7 @@ async def update_linked_charts_graphics(
|
|||
name,
|
||||
array_key=name,
|
||||
)
|
||||
subchart.cv._set_yrange()
|
||||
|
||||
# TODO: all overlays on all subplots..
|
||||
|
||||
|
@ -382,6 +395,7 @@ async def update_linked_charts_graphics(
|
|||
curve_name,
|
||||
array_key=curve_name,
|
||||
)
|
||||
# chart._set_yrange()
|
||||
|
||||
|
||||
async def check_for_new_bars(
|
||||
|
@ -542,7 +556,7 @@ async def display_symbol_data(
|
|||
)
|
||||
|
||||
# size view to data once at outset
|
||||
chart._set_yrange()
|
||||
chart.cv._set_yrange()
|
||||
|
||||
# TODO: a data view api that makes this less shit
|
||||
chart._shm = ohlcv
|
||||
|
@ -557,13 +571,19 @@ async def display_symbol_data(
|
|||
vlm_chart: Optional[ChartPlotWidget] = None
|
||||
async with trio.open_nursery() as ln:
|
||||
|
||||
# load initial fsp chain (otherwise known as "indicators")
|
||||
admin, vlm_chart = await ln.start(
|
||||
start_fsp_displays,
|
||||
# if available load volume related built-in display(s)
|
||||
if has_vlm(ohlcv):
|
||||
vlm_chart = await ln.start(
|
||||
open_vlm_displays,
|
||||
linkedsplits,
|
||||
ohlcv,
|
||||
)
|
||||
|
||||
# load (user's) FSP set (otherwise known as "indicators")
|
||||
# from an input config.
|
||||
ln.start_soon(
|
||||
start_fsp_displays,
|
||||
linkedsplits,
|
||||
brokermod,
|
||||
sym,
|
||||
ohlcv,
|
||||
loading_sym_key,
|
||||
loglevel,
|
||||
|
@ -601,5 +621,9 @@ async def display_symbol_data(
|
|||
await trio.sleep(0)
|
||||
linkedsplits.resize_sidepanes()
|
||||
|
||||
# TODO: make this not so shit XD
|
||||
# close group status
|
||||
sbar._status_groups[loading_sym_key][1]()
|
||||
|
||||
# let the app run.
|
||||
await trio.sleep_forever()
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# piker: trading gear for hackers
|
||||
# Copyright (C) Tyler Goodlet (in stewardship for piker0)
|
||||
# Copyright (C) Tyler Goodlet (in stewardship for pikers)
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published by
|
||||
|
@ -25,7 +25,7 @@ from typing import Callable, Optional, Union
|
|||
import uuid
|
||||
|
||||
from pyqtgraph import QtGui
|
||||
from PyQt5 import QtCore, QtWidgets
|
||||
from PyQt5 import QtCore
|
||||
from PyQt5.QtWidgets import QLabel, QStatusBar
|
||||
|
||||
from ..log import get_logger
|
||||
|
@ -55,7 +55,8 @@ class MultiStatus:
|
|||
group_key: Optional[Union[bool, str]] = False,
|
||||
|
||||
) -> Union[Callable[..., None], str]:
|
||||
'''Add a status to the status bar and return a close callback which
|
||||
'''
|
||||
Add a status to the status bar and return a close callback which
|
||||
when called will remove the status ``msg``.
|
||||
|
||||
'''
|
||||
|
@ -137,7 +138,8 @@ class MultiStatus:
|
|||
return ret
|
||||
|
||||
def render(self) -> None:
|
||||
'''Display all open statuses to bar.
|
||||
'''
|
||||
Display all open statuses to bar.
|
||||
|
||||
'''
|
||||
if self.statuses:
|
||||
|
|
Loading…
Reference in New Issue