From 6acfd6c38a2d7510872f1f46b3b4590529bce69a Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Sun, 12 Sep 2021 19:30:43 -0400 Subject: [PATCH 1/5] Ugh, positions relay hotfix Must have run into some confusion with data structures in `brokerd` vs. `emsd`. This fixes the ems `relay.positions` state tracking to be composed maps, vs. messages from `brokerd` should just be a sequence. --- piker/brokers/ib.py | 6 ++---- piker/clearing/_ems.py | 5 ++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/piker/brokers/ib.py b/piker/brokers/ib.py index d40857a5..a9d04156 100644 --- a/piker/brokers/ib.py +++ b/piker/brokers/ib.py @@ -1465,7 +1465,7 @@ async def trades_dialogue( global _client_cache # deliver positions to subscriber before anything else - all_positions = {} + all_positions = [] clients: list[tuple[Client, trio.MemoryReceiveChannel]] = [] for account, client in _accounts2clients.items(): @@ -1480,9 +1480,7 @@ async def trades_dialogue( for client in _client_cache.values(): for pos in client.positions(): msg = pack_position(pos) - all_positions.setdefault( - msg.symbol, [] - ).append(msg.dict()) + all_positions.append(msg.dict()) await ctx.started(all_positions) diff --git a/piker/clearing/_ems.py b/piker/clearing/_ems.py index 3c689ff4..3df1cd00 100644 --- a/piker/clearing/_ems.py +++ b/piker/clearing/_ems.py @@ -429,10 +429,13 @@ async def open_brokerd_trades_dialogue( # by receiving order submission response messages, # normalizing them to EMS messages and relaying back to # the piker order client set. + pps = {} + for msg in positions: + pps.setdefault(msg['symbol'], {})['account'] = msg relay = TradesRelay( brokerd_dialogue=brokerd_trades_stream, - positions=positions, + positions=pps, consumers=1 ) From 16b7456fefc47aa5c1769398b2ad63c15acac96d Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 13 Sep 2021 07:42:28 -0400 Subject: [PATCH 2/5] Fix indentation --- piker/ui/order_mode.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/piker/ui/order_mode.py b/piker/ui/order_mode.py index 1a588360..41aacef2 100644 --- a/piker/ui/order_mode.py +++ b/piker/ui/order_mode.py @@ -769,8 +769,9 @@ async def process_trades_and_update_ui( # update order pane widgets mode.pane.update_status_ui(tracker) + # display pnl + mode.pane.display_pnl(tracker) - mode.pane.display_pnl(tracker) # short circuit to next msg to avoid # unnecessary msg content lookups continue From eb70baf161cebbdab59de8e124a9df03fabfd1da Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 13 Sep 2021 08:21:09 -0400 Subject: [PATCH 3/5] Pass account names on wire: brokerd => emsd --- piker/brokers/ib.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/piker/brokers/ib.py b/piker/brokers/ib.py index a9d04156..21946802 100644 --- a/piker/brokers/ib.py +++ b/piker/brokers/ib.py @@ -1333,7 +1333,10 @@ async def stream_quotes( # last = time.time() -def pack_position(pos: Position) -> dict[str, Any]: +def pack_position( + pos: Position + +) -> dict[str, Any]: con = pos.contract if isinstance(con, Option): @@ -1480,6 +1483,7 @@ async def trades_dialogue( for client in _client_cache.values(): for pos in client.positions(): msg = pack_position(pos) + msg.account = accounts_def.inverse[msg.account] all_positions.append(msg.dict()) await ctx.started(all_positions) @@ -1636,6 +1640,7 @@ async def deliver_trade_events( elif event_name == 'position': msg = pack_position(item) + msg.account = accounts_def.inverse[msg.account] if getattr(msg, 'reqid', 0) < -1: From c6cc592f4e1f6b51511356992c9b6597e9adb360 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 13 Sep 2021 08:21:42 -0400 Subject: [PATCH 4/5] Fix wrong key, use account value --- piker/clearing/_ems.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/piker/clearing/_ems.py b/piker/clearing/_ems.py index 3df1cd00..397ef48b 100644 --- a/piker/clearing/_ems.py +++ b/piker/clearing/_ems.py @@ -429,9 +429,14 @@ async def open_brokerd_trades_dialogue( # by receiving order submission response messages, # normalizing them to EMS messages and relaying back to # the piker order client set. + + # locally cache and track positions per account. pps = {} for msg in positions: - pps.setdefault(msg['symbol'], {})['account'] = msg + pps.setdefault( + msg['symbol'], + {} + )[msg['account']] = msg relay = TradesRelay( brokerd_dialogue=brokerd_trades_stream, From 8ec31d925612d93912efd248af8480497af582b2 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 13 Sep 2021 08:22:42 -0400 Subject: [PATCH 5/5] Make order mode expect account names in startup pp msgs --- piker/ui/order_mode.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/piker/ui/order_mode.py b/piker/ui/order_mode.py index 41aacef2..40f8a3a3 100644 --- a/piker/ui/order_mode.py +++ b/piker/ui/order_mode.py @@ -577,8 +577,8 @@ async def open_order_mode( for msg in pp_msgs: log.info(f'Loading pp for {symkey}:\n{pformat(msg)}') - account_value = msg.get('account') - account_name = accounts.inverse.get(account_value) + account_name = msg.get('account') + account_value = accounts.get(account_name) if not account_name and account_value == 'paper': account_name = 'paper'