From 8c7e4c0ce9cf4f3c24619bc895bdfa56509fbb48 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 27 Aug 2021 16:38:06 -0400 Subject: [PATCH] Add real-time pnl calc and display in status pane --- piker/ui/_chart.py | 27 ++++++++++++++++++++++----- piker/ui/_forms.py | 2 +- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/piker/ui/_chart.py b/piker/ui/_chart.py index ba421698..567e8435 100644 --- a/piker/ui/_chart.py +++ b/piker/ui/_chart.py @@ -41,6 +41,7 @@ from .._daemon import ( maybe_spawn_brokerd, ) from ..brokers import get_brokermod +from ..calc import percent_change from ._axes import ( DynamicDateAxis, PriceAxis, @@ -67,6 +68,7 @@ from ..data import maybe_open_shm_array from ..data.feed import open_feed, Feed, install_brokerd_search from ..data._source import Symbol from ..data._sharedmem import ShmArray +from ..data._normalize import iterticks from .. import brokers from ..log import get_logger from ._exec import run_qtractor @@ -1848,6 +1850,15 @@ async def display_symbol_data( pp = order_mode.pp live = pp.live_pp + if live.size < 0: + types = ('ask', 'last') + + elif live.size > 0: + types = ('bid', 'last') + + else: + raise RuntimeError('No pp?!?!') + # real-time update pnl on the order mode async with feed.stream.subscribe() as bstream: last_tick = time.time() @@ -1858,13 +1869,19 @@ async def display_symbol_data( for sym, quote in quotes.items(): - ticks = quote.get('ticks', ()) - if ticks: + for tick in iterticks(quote, types): print(f'{1/period} Hz') - if live.size: - # compute and display pnl - pass + # compute and display pnl status + order_mode.pane.pnl_label.format( + pnl=round( + live.size * percent_change( + live.avg_price, + tick['price'], + ), + ndigits=2, + ) + ) last_tick = time.time() diff --git a/piker/ui/_forms.py b/piker/ui/_forms.py index f5cd2f85..f0da20b0 100644 --- a/piker/ui/_forms.py +++ b/piker/ui/_forms.py @@ -547,7 +547,7 @@ def mk_fill_status_bar( bar_labels_lhs = QVBoxLayout(fields) left_label = fields.add_field_label( dedent(""" - {pnl}% PnL + {pnl}% pnl """), font_size=bar_label_font_size, font_color='gunmetal',