Use `Client` in watchlist app
parent
17feb17535
commit
4123139750
|
@ -319,7 +319,7 @@ async def update_quotes(
|
||||||
nursery: 'Nursery',
|
nursery: 'Nursery',
|
||||||
brokermod: ModuleType,
|
brokermod: ModuleType,
|
||||||
widgets: dict,
|
widgets: dict,
|
||||||
queue: 'StreamQueue',
|
client: 'Client',
|
||||||
symbol_data: dict,
|
symbol_data: dict,
|
||||||
first_quotes: dict
|
first_quotes: dict
|
||||||
):
|
):
|
||||||
|
@ -359,7 +359,7 @@ async def update_quotes(
|
||||||
grid.render_rows(cache)
|
grid.render_rows(cache)
|
||||||
|
|
||||||
# core cell update loop
|
# core cell update loop
|
||||||
async for quotes in queue: # new quotes data only
|
async for quotes in client.aiter_recv(): # new quotes data only
|
||||||
for symbol, quote in quotes.items():
|
for symbol, quote in quotes.items():
|
||||||
record, displayable = brokermod.format_quote(
|
record, displayable = brokermod.format_quote(
|
||||||
quote, symbol_data=symbol_data)
|
quote, symbol_data=symbol_data)
|
||||||
|
@ -374,6 +374,7 @@ async def update_quotes(
|
||||||
log.warn("Server connection dropped")
|
log.warn("Server connection dropped")
|
||||||
nursery.cancel_scope.cancel()
|
nursery.cancel_scope.cancel()
|
||||||
|
|
||||||
|
|
||||||
async def run_kivy(root, nursery):
|
async def run_kivy(root, nursery):
|
||||||
'''Trio-kivy entry point.
|
'''Trio-kivy entry point.
|
||||||
'''
|
'''
|
||||||
|
@ -387,76 +388,80 @@ async def _async_main(name, tickers, brokermod, rate):
|
||||||
This is started with cli command `piker watch`.
|
This is started with cli command `piker watch`.
|
||||||
'''
|
'''
|
||||||
# setup ticker stream
|
# setup ticker stream
|
||||||
from ..brokers.core import StreamQueue
|
from ..brokers.core import Client
|
||||||
queue = StreamQueue(await trio.open_tcp_stream('127.0.0.1', 1616))
|
|
||||||
await queue.put((brokermod.name, tickers)) # initial request for symbols price streams
|
|
||||||
|
|
||||||
# get initial symbol data
|
async def subscribe(client):
|
||||||
async with brokermod.get_client() as client:
|
# initial request for symbols price streams
|
||||||
# get long term data including last days close price
|
await client.send((brokermod.name, tickers))
|
||||||
sd = await client.symbol_data(tickers)
|
|
||||||
|
|
||||||
async with trio.open_nursery() as nursery:
|
async with Client(('127.0.0.1', 1616), subscribe) as client:
|
||||||
# get first quotes response
|
|
||||||
quotes = await queue.get()
|
|
||||||
first_quotes = [
|
|
||||||
brokermod.format_quote(quote, symbol_data=sd)[0]
|
|
||||||
for quote in quotes.values()]
|
|
||||||
|
|
||||||
if first_quotes[0].get('last') is None:
|
# get initial symbol data
|
||||||
log.error("Broker API is down temporarily")
|
async with brokermod.get_client() as bclient:
|
||||||
nursery.cancel_scope.cancel()
|
# get long term data including last days close price
|
||||||
return
|
sd = await bclient.symbol_data(tickers)
|
||||||
|
|
||||||
# build out UI
|
async with trio.open_nursery() as nursery:
|
||||||
Window.set_title(f"watchlist: {name}\t(press ? for help)")
|
# get first quotes response
|
||||||
Builder.load_string(_kv)
|
quotes = await client.recv()
|
||||||
box = BoxLayout(orientation='vertical', padding=5, spacing=5)
|
first_quotes = [
|
||||||
|
brokermod.format_quote(quote, symbol_data=sd)[0]
|
||||||
|
for quote in quotes.values()]
|
||||||
|
|
||||||
# define bid-ask "stacked" cells
|
if first_quotes[0].get('last') is None:
|
||||||
# (TODO: needs some rethinking and renaming for sure)
|
log.error("Broker API is down temporarily")
|
||||||
bidasks = brokermod._bidasks
|
nursery.cancel_scope.cancel()
|
||||||
|
return
|
||||||
|
|
||||||
# add header row
|
# build out UI
|
||||||
headers = first_quotes[0].keys()
|
Window.set_title(f"watchlist: {name}\t(press ? for help)")
|
||||||
header = Row(
|
Builder.load_string(_kv)
|
||||||
{key: key for key in headers},
|
box = BoxLayout(orientation='vertical', padding=5, spacing=5)
|
||||||
headers=headers,
|
|
||||||
bidasks=bidasks,
|
|
||||||
is_header_row=True,
|
|
||||||
size_hint=(1, None),
|
|
||||||
)
|
|
||||||
box.add_widget(header)
|
|
||||||
|
|
||||||
# build grid
|
# define bid-ask "stacked" cells
|
||||||
grid = TickerTable(
|
# (TODO: needs some rethinking and renaming for sure)
|
||||||
cols=1,
|
bidasks = brokermod._bidasks
|
||||||
size_hint=(1, None),
|
|
||||||
)
|
|
||||||
for ticker_record in first_quotes:
|
|
||||||
grid.append_row(ticker_record, bidasks=bidasks)
|
|
||||||
# associate the col headers row with the ticker table even though
|
|
||||||
# they're technically wrapped separately in containing BoxLayout
|
|
||||||
header.table = grid
|
|
||||||
|
|
||||||
# mark the initial sorted column header as bold and underlined
|
# add header row
|
||||||
sort_cell = header.get_cell(grid.sort_key)
|
headers = first_quotes[0].keys()
|
||||||
sort_cell.bold = sort_cell.underline = True
|
header = Row(
|
||||||
grid.last_clicked_col_cell = sort_cell
|
{key: key for key in headers},
|
||||||
|
headers=headers,
|
||||||
|
bidasks=bidasks,
|
||||||
|
is_header_row=True,
|
||||||
|
size_hint=(1, None),
|
||||||
|
)
|
||||||
|
box.add_widget(header)
|
||||||
|
|
||||||
# set up a pager view for large ticker lists
|
# build grid
|
||||||
grid.bind(minimum_height=grid.setter('height'))
|
grid = TickerTable(
|
||||||
pager = PagerView(box, grid, nursery)
|
cols=1,
|
||||||
box.add_widget(pager)
|
size_hint=(1, None),
|
||||||
|
)
|
||||||
|
for ticker_record in first_quotes:
|
||||||
|
grid.append_row(ticker_record, bidasks=bidasks)
|
||||||
|
# associate the col headers row with the ticker table even though
|
||||||
|
# they're technically wrapped separately in containing BoxLayout
|
||||||
|
header.table = grid
|
||||||
|
|
||||||
widgets = {
|
# mark the initial sorted column header as bold and underlined
|
||||||
# 'anchor': anchor,
|
sort_cell = header.get_cell(grid.sort_key)
|
||||||
'root': box,
|
sort_cell.bold = sort_cell.underline = True
|
||||||
'grid': grid,
|
grid.last_clicked_col_cell = sort_cell
|
||||||
'box': box,
|
|
||||||
'header': header,
|
# set up a pager view for large ticker lists
|
||||||
'pager': pager,
|
grid.bind(minimum_height=grid.setter('height'))
|
||||||
}
|
pager = PagerView(box, grid, nursery)
|
||||||
nursery.start_soon(run_kivy, widgets['root'], nursery)
|
box.add_widget(pager)
|
||||||
nursery.start_soon(
|
|
||||||
update_quotes, nursery, brokermod, widgets, queue, sd, quotes)
|
widgets = {
|
||||||
|
# 'anchor': anchor,
|
||||||
|
'root': box,
|
||||||
|
'grid': grid,
|
||||||
|
'box': box,
|
||||||
|
'header': header,
|
||||||
|
'pager': pager,
|
||||||
|
}
|
||||||
|
nursery.start_soon(run_kivy, widgets['root'], nursery)
|
||||||
|
nursery.start_soon(
|
||||||
|
update_quotes, nursery, brokermod, widgets, client, sd, quotes)
|
||||||
|
|
Loading…
Reference in New Issue