Skip to content

Commit de1a027

Browse files
author
rob
committed
add exchange to ib position
1 parent ddd810a commit de1a027

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

sysbrokers/IB/client/ib_positions_client.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from syscore.constants import arg_not_supplied
22
from sysbrokers.IB.client.ib_client import ibClient
3-
from sysbrokers.IB.ib_positions import from_ib_positions_to_dict, positionsFromIB
3+
from sysbrokers.IB.ib_positions import (
4+
from_ib_positions_to_dict,
5+
positionsFromIB,
6+
IBPositionWithExtendedAttr,
7+
)
8+
from ib_insync.ib import Position
49

510

611
class ibPositionsClient(ibClient):
@@ -32,7 +37,9 @@ def add_exchange_codes_to_list_of_raw_ib_positions(
3237

3338
return raw_positions_with_codes
3439

35-
def add_exchange_code_to_raw_ib_position(self, raw_ib_position):
40+
def add_exchange_code_to_raw_ib_position(
41+
self, raw_ib_position: Position
42+
) -> IBPositionWithExtendedAttr:
3643
try:
3744
ib_contract = raw_ib_position.contract
3845
list_of_contract_details = self.ib.reqContractDetails(ib_contract)
@@ -43,6 +50,8 @@ def add_exchange_code_to_raw_ib_position(self, raw_ib_position):
4350
except:
4451
exchange_code = ""
4552

46-
setattr(raw_ib_position, "exchange", exchange_code)
53+
new_ib_position = IBPositionWithExtendedAttr.from_ib_position(
54+
ib_position=raw_ib_position, exchange=exchange_code
55+
)
4756

48-
return raw_ib_position
57+
return new_ib_position

sysbrokers/IB/ib_positions.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
1-
import re
1+
from typing import NamedTuple
2+
from ib_insync.ib import Position, Contract
23
from syscore.genutils import highest_common_factor_for_list, sign
34
from syscore.constants import arg_not_supplied
45

56
from sysexecution.trade_qty import tradeQuantity
67

78

9+
class IBPositionWithExtendedAttr(NamedTuple):
10+
account: str
11+
contract: Contract
12+
position: float
13+
avgCost: float
14+
exchange: str
15+
16+
@classmethod
17+
def from_ib_position(cls, ib_position: Position, exchange: str):
18+
return cls(
19+
account=ib_position.account,
20+
contract=ib_position.contract,
21+
avgCost=ib_position.avgCost,
22+
position=ib_position.position,
23+
exchange=exchange,
24+
)
25+
26+
827
def extract_fx_balances_from_account_summary(account_summary) -> dict:
928
relevant_tag = "TotalCashBalance"
1029

0 commit comments

Comments
 (0)