Activate pnl updates from order mode method on account switches
parent
149bee1058
commit
b6b3ca15c5
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue