From b41f90d1a152560ced885e932d08d0f8c63eb3ba Mon Sep 17 00:00:00 2001 From: Jan Vroonhof <38109466+vroonhof@users.noreply.github.com> Date: Tue, 27 May 2025 00:30:20 +0200 Subject: [PATCH 1/4] Add a bunch of fields that appear in my flex queries on new types IBKR seems to be in migrarion from AssetSummary to SymbolSummary Currency conversion rates sometimes appear for 'RUS' (though always --- ibflex/Types.py | 11 ++++++++++- ibflex/parser.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ibflex/Types.py b/ibflex/Types.py index 6ab7555..1f21d3a 100644 --- a/ibflex/Types.py +++ b/ibflex/Types.py @@ -709,6 +709,8 @@ class CashReportCurrency(FlexElement): salesTaxYTD: Optional[decimal.Decimal] = None salesTaxPaxos: Optional[decimal.Decimal] = None otherIncome: Optional[decimal.Decimal] = None + otherIncomeMTD: Optional[decimal.Decimal] = None + otherIncomeYTD: Optional[decimal.Decimal] = None otherIncomeSec: Optional[decimal.Decimal] = None otherIncomeCom: Optional[decimal.Decimal] = None otherFeesMTD: Optional[decimal.Decimal] = None @@ -1397,7 +1399,9 @@ class SymbolSummary(FlexElement): dateTime: Optional[datetime.datetime] = None reportDate: Optional[datetime.date] = None settleDate: Optional[datetime.date] = None + taxes: Optional[decimal.Decimal] = None tradeDate: Optional[datetime.date] = None + tradePrice: Optional[decimal.Decimal] = None exchange: Optional[str] = None buySell: Optional[enums.BuySell] = None quantity: Optional[decimal.Decimal] = None @@ -1427,6 +1431,10 @@ class SymbolSummary(FlexElement): relatedTradeID: Optional[str] = None origTransactionID: Optional[str] = None relatedTransactionID: Optional[str] = None + ibCommission: Optional[decimal.Decimal] = None + ibCommissionCurrency: Optional[str] = None + netCash: Optional[decimal.Decimal] = None + netCashInBase: Optional[decimal.Decimal] = None @dataclass(frozen=True) @@ -2122,7 +2130,8 @@ class Transfer(FlexElement): commodityType: Optional[str] = None fineness: Optional[decimal.Decimal] = None weight: Optional[str] = None - + figi: Optional[str] = None + settleDate: Optional[datetime.date] = None @dataclass(frozen=True) class UnsettledTransfer(FlexElement): diff --git a/ibflex/parser.py b/ibflex/parser.py index af6b270..67a43d6 100755 --- a/ibflex/parser.py +++ b/ibflex/parser.py @@ -463,6 +463,7 @@ def convert_enum(Type, value): "CNH", # RMB traded in HK "BASE_SUMMARY", # Fake currency code used in IB NAV/Performance reports "", # Lot element allows blank currency ?! + "RUS", # Appears with placeholder rate -1 in some list of rates. ) From e4c49130acf090474585e36d8cf6a0c0d5809180 Mon Sep 17 00:00:00 2001 From: Jan Vroonhof <38109466+vroonhof@users.noreply.github.com> Date: Tue, 27 May 2025 01:18:42 +0200 Subject: [PATCH 2/4] All types from enabling everything Most of these are empty but present on my reports, it just seems to inherit from Trade --- ibflex/Types.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/ibflex/Types.py b/ibflex/Types.py index 1f21d3a..929c767 100644 --- a/ibflex/Types.py +++ b/ibflex/Types.py @@ -1387,6 +1387,9 @@ class SymbolSummary(FlexElement): tradeID: Optional[str] = None orderID: Optional[decimal.Decimal] = None execID: Optional[str] = None + ibExecID: Optional[str] = None + extExecID: Optional[str] = None + exchOrderId: Optional[str] = None brokerageOrderID: Optional[str] = None orderReference: Optional[str] = None volatilityOrderLink: Optional[str] = None @@ -1394,14 +1397,19 @@ class SymbolSummary(FlexElement): origTradePrice: Optional[decimal.Decimal] = None origTradeDate: Optional[datetime.date] = None origTradeID: Optional[str] = None + transactionID: Optional[str] = None # Despite the name, `orderTime` actually contains date/time data. orderTime: Optional[datetime.datetime] = None + openDateTime: Optional[datetime.datetime] = None + holdingPeriodDateTime: Optional[datetime.datetime] = None dateTime: Optional[datetime.datetime] = None reportDate: Optional[datetime.date] = None settleDate: Optional[datetime.date] = None + settleDateTarget: Optional[datetime.date] = None # expected date of ownership transfer taxes: Optional[decimal.Decimal] = None tradeDate: Optional[datetime.date] = None tradePrice: Optional[decimal.Decimal] = None + tradeMoney: Optional[decimal.Decimal] = None # TradeMoney = Proceeds + Fees + Commissions exchange: Optional[str] = None buySell: Optional[enums.BuySell] = None quantity: Optional[decimal.Decimal] = None @@ -1435,6 +1443,27 @@ class SymbolSummary(FlexElement): ibCommissionCurrency: Optional[str] = None netCash: Optional[decimal.Decimal] = None netCashInBase: Optional[decimal.Decimal] = None + closePrice: Optional[decimal.Decimal] = None + openCloseIndicator: Optional[enums.OpenClose] = None + notes: Optional[str] = None + cost: Optional[decimal.Decimal] = None + fifoPnlRealized: Optional[decimal.Decimal] = None + mtmPnl: Optional[decimal.Decimal] = None # PnL at the time of reportins + ibOrderID: Optional[str] = None + origOrderID: Optional[str] = None + rtn: Optional[str] = None + whenRealized: Optional[datetime.datetime] = None + whenReopened: Optional[datetime.datetime] = None + changeInPrice: Optional[decimal.Decimal] = None + changeInQuantity: Optional[decimal.Decimal] = None + initialInvestment: Optional[decimal.Decimal] = None + serialNumber: Optional[str] = None + deliveryType: Optional[str] = None + commodityType: Optional[str] = None + fineness: Optional[decimal.Decimal] = None + weight: Optional[str] = None + + @dataclass(frozen=True) From 7ade81b9feea34c1cf70e021fa97edb4f3a04cd1 Mon Sep 17 00:00:00 2001 From: Jan Vroonhof <38109466+vroonhof@users.noreply.github.com> Date: Tue, 27 May 2025 01:31:51 +0200 Subject: [PATCH 3/4] More attributes (now enabled all fields) --- ibflex/Types.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ibflex/Types.py b/ibflex/Types.py index 929c767..e76784b 100644 --- a/ibflex/Types.py +++ b/ibflex/Types.py @@ -2160,7 +2160,11 @@ class Transfer(FlexElement): fineness: Optional[decimal.Decimal] = None weight: Optional[str] = None figi: Optional[str] = None - settleDate: Optional[datetime.date] = None + settleDate: Optional[datetime.date] = None + issuerCountryCode: Optional[str] = None + levelOfDetail: Optional[str] = None + positionInstructionID: Optional[str] = None + positionInstructionSetID: Optional[str] = None @dataclass(frozen=True) class UnsettledTransfer(FlexElement): From 330e69032818c735da2beece920be61d906cd82f Mon Sep 17 00:00:00 2001 From: Jan Vroonhof <38109466+vroonhof@users.noreply.github.com> Date: Tue, 27 May 2025 01:32:16 +0200 Subject: [PATCH 4/4] The new summary fields have MULTI as the date values --- ibflex/parser.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ibflex/parser.py b/ibflex/parser.py index 67a43d6..8fc5dc9 100755 --- a/ibflex/parser.py +++ b/ibflex/parser.py @@ -170,9 +170,11 @@ def parse_element_attr( # INPUT VALUE PREP FUNCTIONS FOR DATA CONVERTERS # These are just implementation details for converters and don't need testing. ############################################################################### -def prep_date(value: str) -> Tuple[int, int, int]: +def prep_date(value: str) -> Optional[Tuple[int, int, int]]: """Returns a tuple of (year, month, day). """ + if value == "MULTI": + return None # Summaries have MULTI as date value. date_format = DATE_FORMATS[len(value)][value.count('/')] return datetime.datetime.strptime(value, date_format).timetuple()[:3] @@ -184,9 +186,11 @@ def prep_time(value: str) -> Tuple[int, int, int]: return datetime.datetime.strptime(value, time_format).timetuple()[3:6] -def prep_datetime(value: str) -> Tuple[int, ...]: +def prep_datetime(value: str) -> Optional[Tuple[int, ...]]: """Returns a tuple of (year, month, day, hour, minute, second). """ + if value == "MULTI": + return None # Summaries have MULTI as date value. # HACK - some old data has ", " separator instead of ",". value = value.replace(", ", ",")