Skip to content

Commit df672d2

Browse files
authored
Merge pull request #88 from akeedev/update_202503
Added a couple of attributes, works with a Flex Query from today
2 parents 9a6a4ac + 8ea109e commit df672d2

File tree

3 files changed

+148
-33
lines changed

3 files changed

+148
-33
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ reg_settings.py
1818
.ycm_extra_conf.py
1919
/venv/
2020
**/.DS_Store
21-
.vscode/
21+
.vscode/

ibflex/Types.py

+145-32
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class FlexStatement(FlexElement):
177177
TierInterestDetails: Tuple["TierInterestDetail", ...] = ()
178178
HardToBorrowDetails: Tuple["HardToBorrowDetail", ...] = ()
179179
HardToBorrowMarkupDetails: Tuple = ()
180-
SLBOpenContracts: Tuple = () # TODO
180+
SLBOpenContracts: Tuple["SLBOpenContract", ...] = ()
181181
SLBActivities: Tuple["SLBActivity", ...] = ()
182182
SLBFees: Tuple["SLBFee", ...] = ()
183183
Transfers: Tuple["Transfer", ...] = ()
@@ -188,6 +188,9 @@ class FlexStatement(FlexElement):
188188
HKIPOOpenSubscriptions: Tuple = () # TODO
189189
CommissionCredits: Tuple = () # TODO
190190
StockGrantActivities: Tuple = () # TODO
191+
SLBCollaterals: Tuple = () # TODO
192+
IncentiveCouponAccrualDetails: Tuple = () # TODO
193+
DepositsOnHold: Tuple = () # TODO
191194

192195
def __repr__(self):
193196
repr = (
@@ -250,6 +253,7 @@ class AccountInformation(FlexElement):
250253
primaryEmail: Optional[str] = None
251254
accountRepName: Optional[str] = None
252255
accountRepPhone: Optional[str] = None
256+
lastTradedDate: Optional[datetime.date] = None
253257

254258

255259
# Type alias to work around https://github.com/python/mypy/issues/1775
@@ -313,7 +317,9 @@ class ChangeInNAV(FlexElement):
313317
paxosTransfers: Optional[decimal.Decimal] = None
314318
commissionsAtPaxos: Optional[decimal.Decimal] = None
315319
referralFee: Optional[decimal.Decimal] = None
316-
320+
currency: Optional[str] = None
321+
changeInIncentiveCouponAccruals: Optional[decimal.Decimal] = None
322+
otherIncome: Optional[decimal.Decimal] = None
317323

318324
# Type alias to work around https://github.com/python/mypy/issues/1775
319325
_ChangeInNAV = ChangeInNAV
@@ -366,7 +372,9 @@ class MTMPerformanceSummaryUnderlying(FlexElement):
366372
weight: Optional[str] = None
367373
otherWithAccruals: Optional[decimal.Decimal] = None
368374
totalWithAccruals: Optional[decimal.Decimal] = None
369-
375+
subCategory: Optional[str] = None
376+
figi: Optional[str] = None
377+
issuerCountryCode: Optional[str] = None
370378

371379
@dataclass(frozen=True)
372380
class EquitySummaryByReportDateInBase(FlexElement):
@@ -461,6 +469,16 @@ class EquitySummaryByReportDateInBase(FlexElement):
461469
physDelLong: Optional[decimal.Decimal] = None
462470
physDelShort: Optional[decimal.Decimal] = None
463471
currency: Optional[str] = None
472+
insuredBankDepositRedemptionCashComponentLong: Optional[decimal.Decimal] = None
473+
insuredBankDepositRedemptionCashComponentShort: Optional[decimal.Decimal] = None
474+
incentiveCouponAccrualsLong: Optional[decimal.Decimal] = None
475+
incentiveCouponAccrualsShort: Optional[decimal.Decimal] = None
476+
eventContractInterestAccrualsLong: Optional[decimal.Decimal] = None
477+
eventContractInterestAccrualsShort: Optional[decimal.Decimal] = None
478+
marginFinancingChargeAccrualsLong: Optional[decimal.Decimal] = None
479+
marginFinancingChargeAccrualsShort: Optional[decimal.Decimal] = None
480+
cryptoLong: Optional[decimal.Decimal] = None
481+
cryptoShort: Optional[decimal.Decimal] = None
464482

465483

466484
@dataclass(frozen=True)
@@ -690,6 +708,9 @@ class CashReportCurrency(FlexElement):
690708
salesTaxMTD: Optional[decimal.Decimal] = None
691709
salesTaxYTD: Optional[decimal.Decimal] = None
692710
salesTaxPaxos: Optional[decimal.Decimal] = None
711+
otherIncome: Optional[decimal.Decimal] = None
712+
otherIncomeSec: Optional[decimal.Decimal] = None
713+
otherIncomeCom: Optional[decimal.Decimal] = None
693714
otherFeesMTD: Optional[decimal.Decimal] = None
694715
otherFeesYTD: Optional[decimal.Decimal] = None
695716
otherFeesPaxos: Optional[decimal.Decimal] = None
@@ -1040,34 +1061,36 @@ class Trade(FlexElement):
10401061
accountId: Optional[str] = None
10411062
currency: Optional[str] = None
10421063
fxRateToBase: Optional[decimal.Decimal] = None
1043-
symbol: Optional[str] = None
1044-
description: Optional[str] = None
1045-
conid: Optional[str] = None
1046-
cusip: Optional[str] = None
1047-
isin: Optional[str] = None
1048-
listingExchange: Optional[str] = None
1049-
multiplier: Optional[decimal.Decimal] = None
1064+
symbol: Optional[str] = None # symbol of instrument traded, e.g. AAPL, not unique in IBKR as it can exist on different exchanges: (symbol, Exchange, Currency, Asset Type) is unique
1065+
conid: Optional[str] = None # IBKR identifier of instrument, unique key within IBKR
1066+
cusip: Optional[str] = None # S&P instrument ID, not unique as it is used on different exchanges
1067+
isin: Optional[str] = None # instrument ISIN (ISO standardized instrument ID)
1068+
figi: Optional[str] = None # instrument FIGI (Bloomberg ID - comparable to ISIN)
1069+
description: Optional[str] = None # instrument name, e.g. "Apple Inc."
1070+
listingExchange: Optional[str] = None # exchange, e.g. "NASDAQ"
1071+
multiplier: Optional[decimal.Decimal] = None # multiplier of contract traded
10501072
strike: Optional[decimal.Decimal] = None
10511073
expiry: Optional[datetime.date] = None
10521074
putCall: Optional[enums.PutCall] = None
10531075
tradeID: Optional[str] = None
1054-
reportDate: Optional[datetime.date] = None
1055-
tradeDate: Optional[datetime.date] = None
1056-
tradeTime: Optional[datetime.time] = None
1057-
settleDateTarget: Optional[datetime.date] = None
1076+
reportDate: Optional[datetime.date] = None # when the trade was included in IBKR's reporting system (e.g. corrections)
1077+
tradeDate: Optional[datetime.date] = None # date of the trade
1078+
tradeTime: Optional[datetime.time] = None # timestamp of the trade
1079+
settleDateTarget: Optional[datetime.date] = None # expected date of ownership transfer
10581080
exchange: Optional[str] = None
10591081
quantity: Optional[decimal.Decimal] = None
10601082
tradePrice: Optional[decimal.Decimal] = None
1061-
tradeMoney: Optional[decimal.Decimal] = None
1083+
tradeMoney: Optional[decimal.Decimal] = None # TradeMoney = Proceeds + Fees + Commissions
1084+
proceeds: Optional[decimal.Decimal] = None # Proceeds = Quantity * TradePrice * Multiplier
1085+
netCash: Optional[decimal.Decimal] = None # netCash = TradeMoney - Adjustments (e.g. fees in physical execution of options, or taxes)
1086+
netCashInBase: Optional[decimal.Decimal] = None # = NetCash × FX Rate
10621087
taxes: Optional[decimal.Decimal] = None
10631088
ibCommission: Optional[decimal.Decimal] = None
10641089
ibCommissionCurrency: Optional[str] = None
1065-
netCash: Optional[decimal.Decimal] = None
1066-
netCashInBase: Optional[decimal.Decimal] = None
1067-
closePrice: Optional[decimal.Decimal] = None
1090+
closePrice: Optional[decimal.Decimal] = None # closing market price of the asset on the trade date
10681091
notes: Tuple[enums.Code, ...] = () # separator = ";"
10691092
cost: Optional[decimal.Decimal] = None
1070-
mtmPnl: Optional[decimal.Decimal] = None
1093+
mtmPnl: Optional[decimal.Decimal] = None # PnL at the time of reportins
10711094
origTradePrice: Optional[decimal.Decimal] = None
10721095
origTradeDate: Optional[datetime.date] = None
10731096
origTradeID: Optional[str] = None
@@ -1081,7 +1104,6 @@ class Trade(FlexElement):
10811104
orderTime: Optional[datetime.datetime] = None
10821105
changeInPrice: Optional[decimal.Decimal] = None
10831106
changeInQuantity: Optional[decimal.Decimal] = None
1084-
proceeds: Optional[decimal.Decimal] = None
10851107
fxPnl: Optional[decimal.Decimal] = None
10861108
clearingFirmID: Optional[str] = None
10871109
# Effective 2013, every Trade has a `transactionID` attribute that can't
@@ -1097,10 +1119,10 @@ class Trade(FlexElement):
10971119
traderID: Optional[str] = None
10981120
isAPIOrder: Optional[bool] = None
10991121
acctAlias: Optional[str] = None
1100-
model: Optional[str] = None
1122+
model: Optional[str] = None # some clients use model portfolios in account, i.e. virtual sub-accounts
11011123
securityID: Optional[str] = None
11021124
securityIDType: Optional[str] = None
1103-
principalAdjustFactor: Optional[decimal.Decimal] = None
1125+
principalAdjustFactor: Optional[decimal.Decimal] = None # relevant e.g. in stock splits
11041126
dateTime: Optional[datetime.datetime] = None
11051127
underlyingConid: Optional[str] = None
11061128
underlyingSecurityID: Optional[str] = None
@@ -1120,7 +1142,6 @@ class Trade(FlexElement):
11201142
relatedTransactionID: Optional[str] = None
11211143
origTransactionID: Optional[str] = None
11221144
subCategory: Optional[str] = None
1123-
figi: Optional[str] = None
11241145
issuerCountryCode: Optional[str] = None
11251146
rtn: Optional[str] = None
11261147
initialInvestment: Optional[decimal.Decimal] = None
@@ -1324,7 +1345,14 @@ class UnbundledCommissionDetail(FlexElement):
13241345
regSection31TransactionFee: Optional[decimal.Decimal] = None
13251346
regOther: Optional[decimal.Decimal] = None
13261347
other: Optional[decimal.Decimal] = None
1327-
1348+
subCategory: Optional[str] = None
1349+
figi: Optional[str] = None
1350+
issuerCountryCode: Optional[str] = None
1351+
serialNumber: Optional[decimal.Decimal] = None
1352+
deliveryType: Optional[decimal.Decimal] = None # 0: Cash settlement, 1: physical settlement
1353+
commodityType: Optional[str] = None # z.B. "STK"=Aktie, "BND"=Anleihe, etc.
1354+
fineness: Optional[decimal.Decimal] = None # Reinheitsgrad bei Edelmetallen, z.B. 925 für 925 Sterling Silber
1355+
weight: Optional[decimal.Decimal] = None # Gewicht - Einheit ist Rohstoffabhängig
13281356

13291357
@dataclass(frozen=True)
13301358
class SymbolSummary(FlexElement):
@@ -1892,7 +1920,8 @@ class TierInterestDetail(FlexElement):
18921920
code: Tuple[enums.Code, ...] = ()
18931921
fromAcct: Optional[str] = None
18941922
toAcct: Optional[str] = None
1895-
1923+
reportDate: Optional[datetime.date] = None
1924+
marginBalance: Optional[decimal.Decimal] = None
18961925

18971926
@dataclass(frozen=True)
18981927
class HardToBorrowDetail(FlexElement):
@@ -1969,7 +1998,17 @@ class SLBActivity(FlexElement):
19691998
markQuantity: Optional[decimal.Decimal] = None
19701999
markPriorPrice: Optional[decimal.Decimal] = None
19712000
markCurrentPrice: Optional[decimal.Decimal] = None
1972-
2001+
subCategory: Optional[str] = None
2002+
figi: Optional[str] = None
2003+
listingExchange: Optional[str] = None
2004+
underlyingSecurityID: Optional[str] = None
2005+
underlyingListingExchange: Optional[str] = None
2006+
issuerCountryCode: Optional[str] = None
2007+
serialNumber: Optional[decimal.Decimal] = None
2008+
deliveryType: Optional[decimal.Decimal] = None
2009+
commodityType: Optional[str] = None
2010+
fineness: Optional[decimal.Decimal] = None
2011+
weight: Optional[decimal.Decimal] = None
19732012

19742013
@dataclass(frozen=True)
19752014
class SLBFee:
@@ -2017,7 +2056,15 @@ class SLBFee:
20172056
code: Tuple[enums.Code, ...] = ()
20182057
fromAcct: Optional[str] = None
20192058
toAcct: Optional[str] = None
2020-
2059+
subCategory: Optional[str] = None
2060+
figi: Optional[str] = None
2061+
issuerCountryCode: Optional[str] = None
2062+
uniqueID: Optional[str] = None
2063+
serialNumber: Optional[decimal.Decimal] = None
2064+
deliveryType: Optional[decimal.Decimal] = None
2065+
commodityType: Optional[str] = None
2066+
fineness: Optional[decimal.Decimal] = None
2067+
weight: Optional[decimal.Decimal] = None
20212068

20222069
@dataclass(frozen=True)
20232070
class Transfer(FlexElement):
@@ -2137,7 +2184,14 @@ class PriorPeriodPosition(FlexElement):
21372184
expiry: Optional[datetime.date] = None
21382185
putCall: Optional[enums.PutCall] = None
21392186
principalAdjustFactor: Optional[decimal.Decimal] = None
2140-
2187+
subCategory: Optional[str] = None
2188+
figi: Optional[str] = None
2189+
issuerCountryCode: Optional[str] = None
2190+
serialNumber: Optional[decimal.Decimal] = None
2191+
deliveryType: Optional[decimal.Decimal] = None
2192+
commodityType: Optional[str] = None
2193+
fineness: Optional[decimal.Decimal] = None
2194+
weight: Optional[decimal.Decimal] = None
21412195

21422196
@dataclass(frozen=True)
21432197
class CorporateAction(FlexElement):
@@ -2261,7 +2315,9 @@ class CashTransaction(FlexElement):
22612315
fineness: Optional[decimal.Decimal] = None
22622316
weight: Optional[str] = None
22632317
figi: Optional[str] = None
2264-
2318+
issuerCountryCode: Optional[str] = None
2319+
availableForTradingDate: Optional[datetime.datetime] = None
2320+
exDate: Optional[datetime.datetime] = None
22652321

22662322
@dataclass(frozen=True)
22672323
class DebitCardActivity(FlexElement):
@@ -2324,7 +2380,16 @@ class ChangeInDividendAccrual(FlexElement):
23242380
toAcct: Optional[str] = None
23252381
acctAlias: Optional[str] = None
23262382
model: Optional[str] = None
2327-
2383+
subCategory: Optional[str] = None
2384+
figi: Optional[str] = None
2385+
issuerCountryCode: Optional[str] = None
2386+
actionID: Optional[decimal.Decimal] = None #unique numerical ID
2387+
levelOfDetail: Optional[str] = None
2388+
serialNumber: Optional[decimal.Decimal] = None
2389+
deliveryType: Optional[decimal.Decimal] = None
2390+
commodityType: Optional[str] = None
2391+
fineness: Optional[decimal.Decimal] = None
2392+
weight: Optional[decimal.Decimal] = None
23282393

23292394
# Type alias to work around https://github.com/python/mypy/issues/1775
23302395
_ChangeInDividendAccrual = ChangeInDividendAccrual
@@ -2488,7 +2553,9 @@ class FIFOPerformanceSummaryUnderlying(FlexElement):
24882553
commodityType: Optional[str] = None
24892554
fineness: Optional[decimal.Decimal] = None
24902555
weight: Optional[str] = None
2491-
2556+
subCategory: Optional[str] = None
2557+
figi: Optional[str] = None
2558+
issuerCountryCode: Optional[str] = None
24922559

24932560
@dataclass(frozen=True)
24942561
class NetStockPosition(FlexElement):
@@ -2526,7 +2593,9 @@ class NetStockPosition(FlexElement):
25262593
commodityType: Optional[str] = None
25272594
fineness: Optional[decimal.Decimal] = None
25282595
weight: Optional[str] = None
2529-
2596+
subCategory: Optional[str] = None
2597+
figi: Optional[str] = None
2598+
issuerCountryCode: Optional[str] = None
25302599

25312600
@dataclass(frozen=True)
25322601
class ClientFee(FlexElement):
@@ -2706,5 +2775,49 @@ class SalesTax(FlexElement):
27062775
code: Tuple[enums.Code, ...] = ()
27072776

27082777

2778+
@dataclass(frozen=True)
2779+
class SLBOpenContract(FlexElement):
2780+
accountId: Optional[str] = None
2781+
acctAlias: Optional[str] = None
2782+
model: Optional[str] = None
2783+
currency: Optional[str] = None
2784+
fxRateToBase: Optional[decimal.Decimal] = None
2785+
description: Optional[str] = None
2786+
conid: Optional[str] = None
2787+
securityID: Optional[str] = None
2788+
cusip: Optional[str] = None
2789+
isin: Optional[str] = None
2790+
assetCategory: Optional[str] = None
2791+
subCategory: Optional[str] = None
2792+
symbol: Optional[str] = None
2793+
securityIDType: Optional[str] = None
2794+
figi: Optional[str] = None
2795+
listingExchange: Optional[str] = None
2796+
underlyingConid: Optional[str] = None
2797+
underlyingSymbol: Optional[str] = None
2798+
underlyingSecurityID: Optional[str] = None
2799+
underlyingListingExchange: Optional[str] = None
2800+
issuer: Optional[str] = None
2801+
issuerCountryCode: Optional[str] = None
2802+
multiplier: Optional[decimal.Decimal] = None
2803+
strike: Optional[decimal.Decimal] = None
2804+
expiry: Optional[datetime.date] = None
2805+
putCall: Optional[enums.PutCall] = None
2806+
principalAdjustFactor: Optional[decimal.Decimal] = None
2807+
date: Optional[datetime.date] = None
2808+
type: Optional[str] = None
2809+
slbTransactionId: Optional[str] = None
2810+
exchange: Optional[str] = None
2811+
quantity: Optional[decimal.Decimal] = None
2812+
excessQuantity: Optional[decimal.Decimal] = None
2813+
feeRate: Optional[decimal.Decimal] = None
2814+
collateralAmount: Optional[decimal.Decimal] = None
2815+
levelOfDetail: Optional[str] = None
2816+
serialNumber: Optional[decimal.Decimal] = None
2817+
deliveryType: Optional[decimal.Decimal] = None
2818+
commodityType: Optional[str] = None
2819+
fineness: Optional[decimal.Decimal] = None
2820+
weight: Optional[decimal.Decimal] = None
2821+
27092822
# Type alias to work around https://github.com/python/mypy/issues/1775
27102823
_ClientFeesDetail = ClientFeesDetail

ibflex/client.py

+2
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ def request_statement(
136136
"""First part of the 2-step download process.
137137
"""
138138
url = url or REQUEST_URL
139+
### AKE FIX
140+
url = 'https://ndcdyn.interactivebrokers.com/portal.flexweb/api/v1/flexQuery'
139141
response = submit_request(url, token, query=query_id)
140142
stmt_access = parse_stmt_response(response)
141143
if isinstance(stmt_access, StatementError):

0 commit comments

Comments
 (0)