Activate pnl updates from order mode method on account switches

fsp_feeds
Tyler Goodlet 2021-09-10 14:59:42 -04:00
parent 149bee1058
commit b6b3ca15c5
2 changed files with 56 additions and 39 deletions

View File

@ -104,6 +104,8 @@ class SettingsPane:
tracker.show() tracker.show()
tracker.hide_info() tracker.hide_info()
mode.display_pnl(tracker)
# load the new account's allocator # load the new account's allocator
alloc = tracker.alloc alloc = tracker.alloc

View File

@ -96,6 +96,8 @@ class OrderMode:
''' '''
chart: 'ChartPlotWidget' # type: ignore # noqa chart: 'ChartPlotWidget' # type: ignore # noqa
nursery: trio.Nursery
quote_feed: Feed
book: OrderBook book: OrderBook
lines: LineEditor lines: LineEditor
arrows: ArrowEditor arrows: ArrowEditor
@ -474,6 +476,49 @@ class OrderMode:
return ids return ids
def display_pnl(
self,
tracker: PositionTracker,
) -> bool:
'''Display the PnL for the current symbol and personal positioning (pp).
If a position is open start a background task which will
real-time update the pnl label in the settings pane.
'''
sym = self.chart.linked.symbol
size = tracker.live_pp.size
global _pnl_tasks
if (
size and
sym.key not in _pnl_tasks
):
_pnl_tasks[sym.key] = True
# immediately compute and display pnl status from last quote
self.pane.pnl_label.format(
pnl=copysign(1, size) * pnl(
tracker.live_pp.avg_price,
# last historical close price
self.quote_feed.shm.array[-1][['close']][0],
),
)
log.info(
f'Starting pnl display for {tracker.alloc.account_name()}')
self.nursery.start_soon(
display_pnl,
self.quote_feed,
self,
)
return True
else:
# set 0% pnl
self.pane.pnl_label.format(pnl=0)
return False
@asynccontextmanager @asynccontextmanager
async def open_order_mode( async def open_order_mode(
@ -627,6 +672,8 @@ async def open_order_mode(
# a namespace.. # a namespace..
mode = OrderMode( mode = OrderMode(
chart, chart,
tn,
feed,
book, book,
lines, lines,
arrows, arrows,
@ -660,7 +707,8 @@ async def open_order_mode(
# make fill bar and positioning snapshot # make fill bar and positioning snapshot
order_pane.on_ui_settings_change('limit', tracker.alloc.limit()) order_pane.on_ui_settings_change('limit', tracker.alloc.limit())
order_pane.on_ui_settings_change('account', pp_account) # order_pane.on_ui_settings_change('account', pp_account)
# order_pane.update_status_ui(pp=tracker.startup_pp) # order_pane.update_status_ui(pp=tracker.startup_pp)
order_pane.update_status_ui(pp=tracker) order_pane.update_status_ui(pp=tracker)
@ -669,31 +717,8 @@ async def open_order_mode(
# so that view handlers can access it # so that view handlers can access it
view.order_mode = mode view.order_mode = mode
# real-time pnl display task allocation mode.display_pnl(mode.current_pp)
live_pp = mode.current_pp.live_pp order_pane.on_ui_settings_change('account', pp_account)
size = live_pp.size
if size:
global _pnl_tasks
# compute and display pnl status immediately
mode.pane.pnl_label.format(
pnl=copysign(1, size) * pnl(
live_pp.avg_price,
# last historical close price
feed.shm.array[-1][['close']][0],
),
)
# spawn updater task
tn.start_soon(
display_pnl,
feed,
mode,
)
else:
# set 0% pnl
mode.pane.pnl_label.format(pnl=0)
# Begin order-response streaming # Begin order-response streaming
done() done()
@ -712,7 +737,6 @@ async def open_order_mode(
), ),
): ):
# signal to top level symbol loading task we're ready # signal to top level symbol loading task we're ready
# to handle input since the ems connection is ready # to handle input since the ems connection is ready
started.set() started.set()
@ -732,8 +756,10 @@ _pnl_tasks: dict[str, bool] = {}
async def display_pnl( async def display_pnl(
feed: Feed, feed: Feed,
order_mode: OrderMode, order_mode: OrderMode,
) -> None: ) -> None:
'''Real-time display the current pp's PnL in the appropriate label. '''Real-time display the current pp's PnL in the appropriate label.
@ -744,10 +770,7 @@ async def display_pnl(
pp = order_mode.current_pp pp = order_mode.current_pp
live = pp.live_pp live = pp.live_pp
sym = live.symbol.key sym = live.symbol.key
assert not _pnl_tasks.get(sym)
_pnl_tasks[sym] = True
if live.size < 0: if live.size < 0:
types = ('ask', 'last', 'last', 'utrade') types = ('ask', 'last', 'last', 'utrade')
@ -829,15 +852,7 @@ async def process_trades_and_update_ui(
# update order pane widgets # update order pane widgets
mode.pane.update_status_ui(tracker.live_pp) mode.pane.update_status_ui(tracker.live_pp)
if ( mode.display_pnl(tracker)
tracker.live_pp.size and
sym.key not in _pnl_tasks
):
n.start_soon(
display_pnl,
feed,
mode,
)
# short circuit to next msg to avoid # short circuit to next msg to avoid
# unnecessary msg content lookups # unnecessary msg content lookups
continue continue