Skip to content

Commit 2a745b7

Browse files
authored
Merge pull request #80 from 5Ub-Z3r0/master
Add a TransferLot Type to the list of Transfer types available.
2 parents 8a1748b + 3249e0c commit 2a745b7

File tree

2 files changed

+209
-3
lines changed

2 files changed

+209
-3
lines changed

ibflex/Types.py

+60-3
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,8 @@ class CashReportCurrency(FlexElement):
804804
slbNetSettledCashSec: Optional[decimal.Decimal] = None
805805
slbNetSettledCashCom: Optional[decimal.Decimal] = None
806806
slbNetSettledCashPaxos: Optional[decimal.Decimal] = None
807-
807+
808+
808809
@dataclass(frozen=True)
809810
class CFDCharge(FlexElement):
810811
""" Wrapped in <CFDCharge> """
@@ -848,8 +849,8 @@ class CFDCharge(FlexElement):
848849
acctAlias: Optional[str] = None
849850
model: Optional[str] = None
850851
levelOfDetail: Optional[str] = None
851-
852-
852+
853+
853854
@dataclass(frozen=True)
854855
class StatementOfFundsLine(FlexElement):
855856
""" Wrapped in <StmtFunds> """
@@ -906,6 +907,7 @@ class StatementOfFundsLine(FlexElement):
906907
weight: Optional[str] = None
907908
actionID: Optional[str] = None
908909

910+
909911
@dataclass(frozen=True)
910912
class ChangeInPositionValue(FlexElement):
911913
""" Wrapped in <ChangeInPositionValues> """
@@ -1107,6 +1109,59 @@ class Trade(FlexElement):
11071109
figi: Optional[str] = None
11081110

11091111

1112+
@dataclass(frozen=True)
1113+
class TransferLot(FlexElement):
1114+
""" Wrapped in <Transfers> """
1115+
accountId: Optional[str] = None
1116+
currency: Optional[str] = None
1117+
fxRateToBase: Optional[decimal.Decimal] = None
1118+
assetCategory: Optional[enums.AssetClass] = None
1119+
symbol: Optional[str] = None
1120+
description: Optional[str] = None
1121+
conid: Optional[str] = None
1122+
securityID: Optional[str] = None
1123+
securityIDType: Optional[str] = None
1124+
cusip: Optional[str] = None
1125+
isin: Optional[str] = None
1126+
listingExchange: Optional[str] = None
1127+
multiplier: Optional[decimal.Decimal] = None
1128+
reportDate: Optional[datetime.date] = None
1129+
date: Optional[datetime.date] = None
1130+
dateTime: Optional[datetime.datetime] = None
1131+
type: Optional[enums.TransferType] = None
1132+
direction: Optional[enums.InOut] = None
1133+
company: Optional[str] = None
1134+
account: Optional[str] = None
1135+
deliveringBroker: Optional[str] = None
1136+
quantity: Optional[decimal.Decimal] = None
1137+
transferPrice: Optional[decimal.Decimal] = None
1138+
pnlAmount: Optional[decimal.Decimal] = None
1139+
pnlAmountInBase: Optional[decimal.Decimal] = None
1140+
code: Tuple[enums.Code, ...] = ()
1141+
acctAlias: Optional[str] = None
1142+
model: Optional[str] = None
1143+
underlyingConid: Optional[str] = None
1144+
underlyingSymbol: Optional[str] = None
1145+
underlyingSecurityID: Optional[str] = None
1146+
underlyingListingExchange: Optional[str] = None
1147+
issuer: Optional[str] = None
1148+
strike: Optional[decimal.Decimal] = None
1149+
expiry: Optional[datetime.date] = None
1150+
putCall: Optional[enums.PutCall] = None
1151+
principalAdjustFactor: Optional[decimal.Decimal] = None
1152+
accountName: Optional[str] = None
1153+
positionAmount: Optional[decimal.Decimal] = None
1154+
positionAmountInBase: Optional[decimal.Decimal] = None
1155+
cashTransfer: Optional[decimal.Decimal] = None
1156+
clientReference: Optional[str] = None
1157+
transactionID: Optional[str] = None
1158+
serialNumber: Optional[str] = None
1159+
deliveryType: Optional[str] = None
1160+
commodityType: Optional[str] = None
1161+
fineness: Optional[decimal.Decimal] = None
1162+
weight: Optional[str] = None
1163+
1164+
11101165
@dataclass(frozen=True)
11111166
class Lot(FlexElement):
11121167
""" Wrapped in <Trades> """
@@ -1195,6 +1250,8 @@ class Lot(FlexElement):
11951250
commodityType: Optional[str] = None
11961251
fineness: Optional[decimal.Decimal] = None
11971252
weight: Optional[str] = None
1253+
origTransactionID: Optional[str] = None
1254+
relatedTransactionID: Optional[str] = None
11981255

11991256

12001257
@dataclass(frozen=True)

tests/test_types.py

+149
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,112 @@ def testParse(self):
623623
self.assertEqual(instance.weight, "0.0 ()")
624624

625625

626+
class TradeLotTestCase(unittest.TestCase):
627+
data = ET.fromstring(
628+
('<Lot accountId="U123456" acctAlias="ibflex test" model="" currency="USD" '
629+
'fxRateToBase="1" assetCategory="STK" symbol="VXX 110917C00005000" '
630+
'description="VXX 17SEP11 5.0 C" conid="83615386" securityID="" '
631+
'securityIDType="" cusip="" isin="" underlyingConid="80789235" '
632+
'underlyingSymbol="VXX" issuer="" multiplier="100" strike="5" '
633+
'expiry="2011-09-17" putCall="C" principalAdjustFactor="" tradeID="594763148" '
634+
'reportDate="2011-08-12" tradeDate="2011-08-11" tradeTime="162000" '
635+
'settleDateTarget="2011-08-12" transactionType="BookTrade" exchange="--" '
636+
'quantity="3" tradePrice="0" tradeMoney="0" proceeds="-0" taxes="0" '
637+
'ibCommission="0" ibCommissionCurrency="USD" netCash="0" '
638+
'closePrice="29.130974" openCloseIndicator="C" notes="A" cost="8398.81122" '
639+
'fifoPnlRealized="0" fxPnl="0" mtmPnl="8739.2922" origTradePrice="0" '
640+
'origTradeDate="" origTradeID="" origOrderID="0" clearingFirmID="" '
641+
'transactionID="2381339439" buySell="BUY" ibOrderID="2381339439" ibExecID="" '
642+
'brokerageOrderID="" orderReference="" volatilityOrderLink="" '
643+
'exchOrderId="N/A" extExecID="N/A" orderTime="" openDateTime="" '
644+
'holdingPeriodDateTime="" whenRealized="" whenReopened="" '
645+
'levelOfDetail="EXECUTION" changeInPrice="0" changeInQuantity="0" '
646+
'orderType="" traderID="" isAPIOrder="N" accruedInt="0" serialNumber="" '
647+
'deliveryType="" commodityType="" fineness="0.0" weight="0.0 ()" '
648+
'origTransactionID="1234" relatedTransactionID="3456"/>')
649+
)
650+
651+
def testParse(self):
652+
instance = parser.parse_data_element(self.data)
653+
self.assertIsInstance(instance, Types.Lot)
654+
self.assertEqual(instance.accountId, "U123456")
655+
self.assertEqual(instance.acctAlias, "ibflex test")
656+
self.assertEqual(instance.model, None)
657+
self.assertEqual(instance.currency, "USD")
658+
self.assertEqual(instance.fxRateToBase, decimal.Decimal('1'))
659+
self.assertEqual(instance.assetCategory, enums.AssetClass.STOCK)
660+
self.assertEqual(instance.symbol, "VXX 110917C00005000")
661+
self.assertEqual(instance.description, "VXX 17SEP11 5.0 C")
662+
self.assertEqual(instance.conid, "83615386")
663+
self.assertEqual(instance.securityID, None)
664+
self.assertEqual(instance.securityIDType, None)
665+
self.assertEqual(instance.cusip, None)
666+
self.assertEqual(instance.isin, None)
667+
self.assertEqual(instance.underlyingConid, "80789235")
668+
self.assertEqual(instance.underlyingSymbol, "VXX")
669+
self.assertEqual(instance.issuer, None)
670+
self.assertEqual(instance.multiplier, decimal.Decimal('100'))
671+
self.assertEqual(instance.strike, decimal.Decimal('5'))
672+
self.assertEqual(instance.expiry, datetime.date(2011, 9, 17))
673+
self.assertEqual(instance.putCall, enums.PutCall.CALL)
674+
self.assertEqual(instance.principalAdjustFactor, None)
675+
self.assertEqual(instance.tradeID, "594763148")
676+
self.assertEqual(instance.reportDate, datetime.date(2011, 8, 12))
677+
self.assertEqual(instance.tradeDate, datetime.date(2011, 8, 11))
678+
self.assertEqual(instance.tradeTime, datetime.time(16, 20, 0))
679+
self.assertEqual(instance.settleDateTarget, datetime.date(2011, 8, 12))
680+
self.assertEqual(instance.transactionType, enums.TradeType.BOOKTRADE)
681+
self.assertEqual(instance.exchange, None)
682+
self.assertEqual(instance.quantity, decimal.Decimal("3"))
683+
self.assertEqual(instance.tradePrice, decimal.Decimal("0"))
684+
self.assertEqual(instance.tradeMoney, decimal.Decimal("0"))
685+
self.assertEqual(instance.proceeds, decimal.Decimal("-0"))
686+
self.assertEqual(instance.taxes, decimal.Decimal("0"))
687+
self.assertEqual(instance.ibCommission, decimal.Decimal("0"))
688+
self.assertEqual(instance.ibCommissionCurrency, "USD")
689+
self.assertEqual(instance.netCash, decimal.Decimal("0"))
690+
self.assertEqual(instance.closePrice, decimal.Decimal("29.130974"))
691+
self.assertEqual(instance.openCloseIndicator, enums.OpenClose.CLOSE)
692+
self.assertEqual(instance.notes, (enums.Code.ASSIGNMENT, ))
693+
self.assertEqual(instance.cost, decimal.Decimal("8398.81122"))
694+
self.assertEqual(instance.fifoPnlRealized, decimal.Decimal("0"))
695+
self.assertEqual(instance.fxPnl, decimal.Decimal("0"))
696+
self.assertEqual(instance.mtmPnl, decimal.Decimal("8739.2922"))
697+
self.assertEqual(instance.origTradePrice, decimal.Decimal("0"))
698+
self.assertEqual(instance.origTradeDate, None)
699+
self.assertEqual(instance.origTradeID, None)
700+
self.assertEqual(instance.origOrderID, "0")
701+
self.assertEqual(instance.clearingFirmID, None)
702+
self.assertEqual(instance.transactionID, "2381339439")
703+
self.assertEqual(instance.buySell, enums.BuySell.BUY)
704+
self.assertEqual(instance.ibOrderID, "2381339439")
705+
self.assertEqual(instance.ibExecID, None)
706+
self.assertEqual(instance.brokerageOrderID, None)
707+
self.assertEqual(instance.orderReference, None)
708+
self.assertEqual(instance.volatilityOrderLink, None)
709+
self.assertEqual(instance.exchOrderId, None)
710+
self.assertEqual(instance.extExecID, None)
711+
self.assertEqual(instance.orderTime, None)
712+
self.assertEqual(instance.openDateTime, None)
713+
self.assertEqual(instance.holdingPeriodDateTime, None)
714+
self.assertEqual(instance.whenRealized, None)
715+
self.assertEqual(instance.whenReopened, None)
716+
self.assertEqual(instance.levelOfDetail, "EXECUTION")
717+
self.assertEqual(instance.changeInPrice, decimal.Decimal("0"))
718+
self.assertEqual(instance.changeInQuantity, decimal.Decimal("0"))
719+
self.assertEqual(instance.orderType, None)
720+
self.assertEqual(instance.traderID, None)
721+
self.assertEqual(instance.isAPIOrder, False)
722+
self.assertEqual(instance.accruedInt, decimal.Decimal("0"))
723+
self.assertEqual(instance.serialNumber, None)
724+
self.assertEqual(instance.deliveryType, None)
725+
self.assertEqual(instance.commodityType, None)
726+
self.assertEqual(instance.fineness, decimal.Decimal("0"))
727+
self.assertEqual(instance.weight, "0.0 ()")
728+
self.assertEqual(instance.origTransactionID, "1234")
729+
self.assertEqual(instance.relatedTransactionID, "3456")
730+
731+
626732
class OptionEAETestCase(unittest.TestCase):
627733
data = ET.fromstring(
628734
('<OptionEAE accountId="U123456" acctAlias="ibflex test" model="" '
@@ -1004,6 +1110,49 @@ def testParse(self):
10041110
self.assertEqual(instance.clientReference, None)
10051111

10061112

1113+
class TransferLotTestCase(unittest.TestCase):
1114+
data = ET.fromstring(
1115+
('<TransferLot accountId="U123456" currency="USD" fxRateToBase="1" '
1116+
'assetCategory="STK" symbol="FMTIF" description="FMI HOLDINGS LTD" '
1117+
'conid="86544467" securityID="" securityIDType="" cusip="02K123K" '
1118+
'isin="" listingExchange="NYSE" multiplier="1" reportDate="20110718" '
1119+
'date="20110718" dateTime="20110718" type="FOP" direction="IN" '
1120+
'company="HOOLI" account="12345678" deliveringBroker="12345" '
1121+
'quantity="701.5" transferPrice="0" pnlAmount="0" pnlAmountInBase="0"'
1122+
' code="ST" />')
1123+
)
1124+
1125+
def testParse(self):
1126+
instance = parser.parse_data_element(self.data)
1127+
self.assertIsInstance(instance, Types.TransferLot)
1128+
self.assertEqual(instance.accountId, "U123456")
1129+
self.assertEqual(instance.currency, "USD")
1130+
self.assertEqual(instance.fxRateToBase, decimal.Decimal("1"))
1131+
self.assertEqual(instance.assetCategory, enums.AssetClass.STOCK)
1132+
self.assertEqual(instance.symbol, "FMTIF")
1133+
self.assertEqual(instance.description, "FMI HOLDINGS LTD")
1134+
self.assertEqual(instance.conid, "86544467")
1135+
self.assertEqual(instance.securityID, None)
1136+
self.assertEqual(instance.securityIDType, None)
1137+
self.assertEqual(instance.cusip, "02K123K")
1138+
self.assertEqual(instance.isin, None)
1139+
self.assertEqual(instance.listingExchange, "NYSE")
1140+
self.assertEqual(instance.multiplier, decimal.Decimal("1"))
1141+
self.assertEqual(instance.reportDate, datetime.date(2011, 7, 18))
1142+
self.assertEqual(instance.date, datetime.date(2011, 7, 18))
1143+
self.assertEqual(instance.dateTime, datetime.datetime(2011, 7, 18, 0, 0, 0))
1144+
self.assertEqual(instance.type, enums.TransferType.FOP)
1145+
self.assertEqual(instance.direction, enums.InOut.IN)
1146+
self.assertEqual(instance.company, 'HOOLI')
1147+
self.assertEqual(instance.account, "12345678")
1148+
self.assertEqual(instance.deliveringBroker, "12345")
1149+
self.assertEqual(instance.quantity, decimal.Decimal("701.5"))
1150+
self.assertEqual(instance.transferPrice, decimal.Decimal("0"))
1151+
self.assertEqual(instance.pnlAmount, decimal.Decimal("0"))
1152+
self.assertEqual(instance.pnlAmountInBase, decimal.Decimal("0"))
1153+
self.assertEqual(instance.code, (enums.Code.STCG, ))
1154+
1155+
10071156
class CorporateActionTestCase(unittest.TestCase):
10081157
data = ET.fromstring(
10091158
('<CorporateAction accountId="U123456" acctAlias="ibflex test" model="" '

0 commit comments

Comments
 (0)