B
     9-e                 @   s   d Z ddlmZ ddlT ddlmZ ddlT ddlT ddlm	Z	 ddl
T ddlmZ ddlmZ ddlmZ ddlT dd	lmZ eeZG d
d deZG dd deZdS )z
Copyright (C) 2019 Interactive Brokers LLC. All rights reserved. This code is subject to the terms
 and conditions of the IB API Non-Commercial License or the IB API Commercial License, as applicable.
    )IN)*)ContractDescription)SoftDollarTier)TagValue)ScanData)BAD_MESSAGE)OrderDecoderc               @   s   e Zd ZdddZdd ZdS )
HandleInfoNc             C   s.   || _ d | _|| _|d kr*|d kr*tdd S )Nz both wrap and proc can't be None)wrapperMethwrapperParamsprocessMeth
ValueError)selfwrapproc r   G:\My Drive\STUDY\EPAT\09 TBP - Trading & Back-testing Platforms\TBP04 - Backtesting & Live Trading\IB IBridgePy API\02 Python 3.7 IBridgePy_Win_Anaconda37_64\ibapi\decoder.py__init__   s
    zHandleInfo.__init__c             C   s   d| j | j| jf }|S )Nzwrap:%s meth:%s prms:%s)r   r   r   )r   sr   r   r   __str__%   s    zHandleInfo.__str__)NN)__name__
__module____qualname__r   r   r   r   r   r   r
      s   
r
   c               @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7dkdl Z8e9e:dmdndoZ;dpdq Z<drds Z=dtdu Z>dvdw Z?e@jAeBedxe@jCeBedxe@jDeBedxe@jEeBe8dxe@jFeBedxe@jGeBeHjIdye@jJeBedxe@jKeBeHjLdye@jMeBeHjNdye@jOeBe	dxe@jPeBedxe@jQeBe/dxe@jReBe0dxe@jSeBeHjTdye@jUeBeHjVdye@jWeBeHjXdye@jYeBedxe@jZeBedxe@j[eBe
dxe@j\eBeHj]dye@j^eBedxe@j_eBedxe@j`eBeHjadye@jbeBeHjcdye@jdeBeHjedye@jfeBeHjgdye@jheBedxe@jieBeHjjdye@jkeBeHjldye@jmeBeHjndye@joeBeHjpdye@jqeBeHjrdye@jseBedxe@jteBeHjudye@jveBeHjwdye@jxeBedxe@jyeBedxe@jzeBeHj{dye@j|eBeHj}dye@j~eBeHjdye@jeBeHjdye@jeBeHjdye@jeBeHjdye@jeBeHjdye@jeBeHjdye@jeBeHjdye@jeBedxe@jeBeHjdye@jeBeHjdye@jeBeHjdye@jeBedxe@jeBedxe@jeBedxe@jeBedxe@jeBedxe@jeBedxe@jeBedxe@jeBedxe@jeBedxe@jeBedxe@jeBe dxe@jeBe!dxe@jeBe"dxe@jeBe#dxe@jeBe$dxe@jeBe%dxe@jeBe&dxe@jeBe'dxe@jeBe(dxe@jeBe)dxe@jeBe*dxe@jeBe+dxe@jeBe,dxe@jeBe-dxe@jeBe.dxe@jeBe1dxe@jeBe2dxe@jeBe3dxe@jeBe4dxe@jeBe5dxe@jeBe6dxe@jeBe7dxiRZdzS ){Decoderc             C   s   || _ || _|   d S )N)wrapperserverVersiondiscoverParams)r   r   r   r   r   r   r   ,   s    zDecoder.__init__c       	      C   s8  t | tt| tt|}tt|}tt|}tt|}tt|}t }|dk|_| jtkr|d@ dk|_|d@ dk|_	| jt
kr|d@ dk|_| j|||| tj}tj|krtj}n\tj|krtj}nJtj|krtj}n8tj|krtj}n&tj|krtj}ntj|krtj}|tjkr4| j||| d S )N   r         )nextdecodeintfloatDecimalZ
TickAttribcanAutoExecuter   ZMIN_SERVER_VER_PAST_LIMIT	pastLimitZMIN_SERVER_VER_PRE_OPEN_BID_ASKZpreOpenr   	tickPriceTickTypeEnumNOT_SETBIDBID_SIZEASKASK_SIZELAST	LAST_SIZEZDELAYED_BIDZDELAYED_BID_SIZEZDELAYED_ASKZDELAYED_ASK_SIZEZDELAYED_LASTZDELAYED_LAST_SIZEtickSize)	r   fieldsreqIdtickTypepricesizeZattrMaskattribsizeTickTyper   r   r   processTickPriceMsg2   s<    












zDecoder.processTickPriceMsgc             C   sN   t | tt| tt|}tt|}tt|}|tjkrJ| j||| d S )N)r!   r"   r#   r%   r)   r*   r   r1   )r   r2   r3   r8   r6   r   r   r   processTickSizeMsg[   s    




zDecoder.processTickSizeMsgc             C   s   t | | jtk rtt| tt|}tt|}tt|}tt|}tt|}tt|}tt|}tt|}	tt|}
tt|}| jtkrtt|}nd }| j	||||||||	|
|| d S )N)
r!   r   ZMIN_SERVER_VER_MARKET_CAP_PRICEr"   r#   strr%   r$   r   orderStatus)r   r2   orderIdstatusfilled	remainingavgFillPricepermIdparentIdlastFillPriceclientIdwhyHeldmktCapPricer   r   r   processOrderStatusMsgf   s$    












zDecoder.processOrderStatusMsgc             C   s  t | t }t }t }| jtk r0tt|}n| j}t	| ||||| j t
| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t | | t!| | t"| | t#| | t$| | t%| | t&| | t'| | t(| | t)| | t*| | t+| | t,| | t-| | t.| | t/| | t0| | t1| | t2| | t3| |d t4| | t5| | t6| | t7| | t8| | t9| | t:| | t;| | t<| | t=| | t>| | t?| | t@| | tA| | tB| | tC| | tD| | tE| | tF| | tG| | tH| | tI| | tJ| | tK| | tL| | tM| |tN tO| | | jPQ|jR||| d S )NT)Sr!   OrderContract
OrderStater   MIN_SERVER_VER_ORDER_CONTAINERr"   r#   r	   r   ZdecodeOrderIddecodeContractFieldsdecodeActiondecodeTotalQuantitydecodeOrderTypedecodeLmtPricedecodeAuxPrice	decodeTIFdecodeOcaGroupdecodeAccountdecodeOpenClosedecodeOrigindecodeOrderRefZdecodeClientIddecodePermIddecodeOutsideRthdecodeHiddendecodeDiscretionaryAmtdecodeGoodAfterTimeZskipSharesAllocationdecodeFAParamsdecodeModelCodedecodeGoodTillDatedecodeRule80AdecodePercentOffsetdecodeSettlingFirmdecodeShortSaleParamsZdecodeAuctionStrategydecodeBoxOrderParamsdecodePegToStkOrVolOrderParamsdecodeDisplaySizeZdecodeBlockOrderdecodeSweepToFilldecodeAllOrNonedecodeMinQtydecodeOcaTypeZskipETradeOnlyZskipFirmQuoteOnlyZskipNbboPriceCapZdecodeParentIddecodeTriggerMethoddecodeVolOrderParamsdecodeTrailParamsZdecodeBasisPointsdecodeComboLegsdecodeSmartComboRoutingParamsdecodeScaleOrderParamsdecodeHedgeParamsZdecodeOptOutSmartRoutingdecodeClearingParamsdecodeNotHelddecodeDeltaNeutraldecodeAlgoParamsdecodeSolicitedZdecodeWhatIfInfoAndCommissiondecodeVolRandomizeFlagsdecodePegToBenchParamsdecodeConditionsZdecodeAdjustedOrderParamsZdecodeSoftDollarTierdecodeCashQtydecodeDontUseAutoPriceForHedgedecodeIsOmsContainersZ!decodeDiscretionaryUpToLimitPriceZdecodeUsePriceMgmtAlgoZdecodeDurationZdecodePostToAtsdecodeAutoCancelParent!MIN_SERVER_VER_AUTO_CANCEL_PARENT"decodePegBestPegMidOrderAttributesr   	openOrderr=   )r   r2   ordercontract
orderStateversionr   r   r   processOpenOrder   s    
zDecoder.processOpenOrderc          
   C   s2  t | tt|}t }tt||_tt||_tt||_tt||_tt	||_
tt||_|dkrtt||_tt||_tt||_tt||_|dkrtt||_tt|}tt	|}tt	|}tt	|}tt	|}tt	|}	tt|}
|dkr| jdkrtt||_| j|||||||	|
 d S )N         '   )r!   r"   r#   rJ   conIdr;   symbolsecTypelastTradeDateOrContractMonthr$   strikeright
multiplierprimaryExchangecurrencylocalSymboltradingClassr%   r   r   updatePortfolio)r   r2   r   r   positionmarketPricemarketValueaverageCostunrealizedPNLrealizedPNLZaccountNamer   r   r   processPortfolioValueMsg   s8    







z Decoder.processPortfolioValueMsgc             C   sT  t | d}| jtk r tt|}d}|dkr6tt|}t }tt||j_tt||j_	| 
||d tt||j_tt||j_tt||j_tt||j_tt||j_tt||_tt||j_tt||j_tt||_| jtkr| jtk rtt| tt||j_tt||_tt||_tt||_|dkrFtt||_|dkr| jtkrptt| dntt||_tt||j_|dkrtt||_tt||_ tt||_!tt||_"tt||_#tt||_$tt||_%|dkr
tt||_&tt||_'|d	krltt|}|d
krlg |_(x<t)|D ]0}t* }tt||_+tt||_,|j(-| q8W | jt.krtt||_/| jt0krtt||_1tt||_2| jt3krtt||_4| jt5krtt||_6| jt7krtt||_8| jt9kr| jtk rtt:| | jtkrBtt:||_;tt:||_<tt:||_=| j>?|| d S )Nr      Fr       zunicode-escaper   r   r   )@r!   r   MIN_SERVER_VER_SIZE_RULESr"   r#   ContractDetailsr;   r   r   r   readLastTradeDater$   r   r   exchanger   r   
marketNamer   r   minTick!MIN_SERVER_VER_MD_SIZE_MULTIPLIERr   
orderTypesvalidExchangespriceMagnifier
underConId MIN_SERVER_VER_ENCODE_MSG_ASCII7encodelongNamer   contractMonthindustrycategorysubcategory
timeZoneIdtradingHoursliquidHoursevRuleevMultiplier	secIdListranger   tagvalueappendMIN_SERVER_VER_AGG_GROUPaggGroupZMIN_SERVER_VER_UNDERLYING_INFOunderSymbolunderSecTypeMIN_SERVER_VER_MARKET_RULESmarketRuleIdsZ#MIN_SERVER_VER_REAL_EXPIRATION_DATErealExpirationDateZMIN_SERVER_VER_STOCK_TYPEZ	stockTypeZ&MIN_SERVER_VER_FRACTIONAL_SIZE_SUPPORTr%   minSizesizeIncrementsuggestedSizeIncrementr   contractDetails)r   r2   r   r3   r   secIdListCount_tagValuer   r   r   processContractDataMsg  s    





,





zDecoder.processContractDataMsgc             C   s  t | d}| jtk r tt|}d}|dkr6tt|}t }tt||j_tt||j_	tt||_
tt||_| ||d tt||_tt||_tt||_tt||_tt||_tt||_tt||_tt||_tt||j_tt||j_tt||_tt||j_tt||j_tt||_| jtkrP| jtk rPtt| tt||_tt||_tt||_ tt||_!tt||_"tt||_#|dkrtt||_$|dkrtt||_%tt||_&|dkr2tt|}|dkr2g |_'x<t(|D ]0}t) }tt||_*tt||_+|j',| qW | jt-krJtt||_.| jt/krbtt||_0| jtkrtt1||_2tt1||_3tt1||_4| j56|| d S )Nr   r   r   Tr    r   r   )7r!   r   r   r"   r#   r   r;   r   r   r   cusipr$   couponr   	issueDateratingsbondType
couponTypeboolconvertiblecallableputable
descAppendr   r   r   r   r   r   r   r   r   nextOptionDatenextOptionTypenextOptionPartialnotesr   r   r   r   r   r   r   r   r   r   r   r   r   r%   r   r   r   r   bondContractDetails)r   r2   r   r3   r   r   r   r   r   r   r   processBondContractDataMsgZ  st    








z"Decoder.processBondContractDataMsgc          
   C   sh  t | tt| tt|}tt|}x.t|D ] }t }t |_tt||_tt||jj_tt	||jj_
tt	||jj_tt	||jj_tt||jj_tt	||jj_tt	||jj_tt	||jj_tt	||jj_tt	||j_tt	||jj_tt	||_tt	||_tt	||_tt	||_| j||j|j|j|j|j|j q2W | j| d S )N)r!   r"   r#   r   r   r   r   rankr   r;   r   r   r   r$   r   r   r   r   r   r   r   distance	benchmark
projectionlegsStrr   scannerDatascannerDataEnd)r   r2   r3   ZnumberOfElementsr   datar   r   r   processScannerDataMsg  s4    


zDecoder.processScannerDataMsgc             C   s  t | | j}| jtk r"tt|}d}|dkr8tt|}tt|}t }tt||_tt||_tt||_	tt||_
tt||_tt||_|dkrtt||_tt||_tt||_tt||_|dkrtt||_t }||_tt||_tt||_tt||_tt||_tt||_tt||_tt||_tt||_tt||_tt||_|dkrtt||_tt||_ |dkrtt||_!|dkrtt||_"tt||_#| jt$krtt||_%| jtkrtt||_&| j'(||| d S )Nr   r   	   
   r   r   ))r!   r   ZMIN_SERVER_VER_LAST_LIQUIDITYr"   r#   rJ   r   r;   r   r   r   r$   r   r   r   r   r   r   r   Z	Executionr=   execIdtime
acctNumbersider%   sharesr5   rB   rE   ZliquidationcumQtyZavgPriceorderRefr   r   MIN_SERVER_VER_MODELS_SUPPORT	modelCodeZlastLiquidityr   execDetails)r   r2   r   r3   r=   r   	executionr   r   r   processExecutionDataMsg  s^    






zDecoder.processExecutionDataMsgc             C   s   t | | jtk rtt| tt|}tt|}tt|}tt|}xt|D ]}t }tt||_tt	||_
tt	||_tt	||_tt	||_tt||_tt||_| jtk rtt| tt||_| j|| qNW | j||| d S )N)r!   r   !MIN_SERVER_VER_SYNT_REALTIME_BARSr"   r#   r;   r   BarDatadater$   openhighlowcloser%   volumewapbarCountr   historicalDatahistoricalDataEnd)r   r2   r3   startDateStr
endDateStrZ	itemCountr   barr   r   r   processHistoricalDataMsg  s*    







z Decoder.processHistoricalDataMsgc             C   s   t | tt|}t }tt||_tt||_tt||_tt||_	tt||_
tt||_tt||_tt||_| j|| d S )N)r!   r"   r#   r   r   r;   r   r$   r   r   r   r   r%   r   r   r   ZhistoricalDataUpdate)r   r2   r3   r  r   r   r   processHistoricalDataUpdateMsg  s    
z&Decoder.processHistoricalDataUpdateMsgc             C   s   t | tt| tt|}t }tt||_tt||_tt||_tt||_tt||_	tt
||_tt
||_tt||_| j||j|j|j|j|j	|j|j|j	 d S )N)r!   r"   r#   ZRealTimeBarr   r$   r   r   r   r   r%   r   r   countr   realtimeBar)r   r2   r3   r  r   r   r   processRealTimeBarMsg)  s    

zDecoder.processRealTimeBarMsgc             C   sh  | j }d }d }d }d }d }d }d }	t| | j tk r>tt|}tt|}
tt|}| j tkrftt|}tt|}tt|}|dk rd }|dkrd }|dks|tjks|tjkrtt|}tt|}|dkrd }|dkrd }|dkrDtt|}tt|}tt|}tt|}	|dkrd }|dkr(d }|dkr6d }|	dkrDd }	| j	
|
||||||||||	 d S )Nr   r   r   )r   r!   Z%MIN_SERVER_VER_PRICE_BASED_VOLATILITYr"   r#   r$   r)   MODEL_OPTIONZDELAYED_MODEL_OPTIONr   tickOptionComputation)r   r2   r   
tickAttriboptPrice
pvDividendgammavegathetaundPricer3   ZtickTypeInt
impliedVoldeltar   r   r   processTickOptionComputationMsg:  sZ    




















z'Decoder.processTickOptionComputationMsgc             C   sX   t | tt| tt|}t }tt||_tt||_tt||_| j	|| d S )N)
r!   r"   r#   ZDeltaNeutralContractr   r$   r  r5   r   ZdeltaNeutralValidation)r   r2   r3   deltaNeutralContractr   r   r    processDeltaNeutralValidationMsgv  s    

z(Decoder.processDeltaNeutralValidationMsgc             C   s8   t | tt| tt|}tt|}| j|| d S )N)r!   r"   r#   r   marketDataType)r   r2   r3   r  r   r   r   processMarketDataTypeMsg  s
    


z Decoder.processMarketDataTypeMsgc             C   sp   t | tt| t }tt||_tt||_tt||_tt||_	tt||_
tt||_| j| d S )N)r!   r"   r#   ZCommissionReportr;   r   r$   
commissionr   r   yield_ZyieldRedemptionDater   commissionReport)r   r2   r  r   r   r   processCommissionReportMsg  s    
z"Decoder.processCommissionReportMsgc             C   s   t | tt|}tt|}t }tt||_tt||_tt||_tt||_tt	||_
tt||_tt||_tt||_tt||_tt||_|dkrtt||_tt|}d}|dkrtt	|}| j|||| d S )Nr   g        r   )r!   r"   r#   r;   rJ   r   r   r   r   r$   r   r   r   r   r   r   r   r%   r   r   )r   r2   r   accountr   r   avgCostr   r   r   processPositionDataMsg  s*    



zDecoder.processPositionDataMsgc             C   s   t | tt| tt|}tt|}t }tt||_tt||_tt||_tt||_tt	||_
tt||_tt||_tt||_tt||_tt||_tt||_tt|}tt	|}tt|}| j|||||| d S )N)r!   r"   r#   r;   rJ   r   r   r   r   r$   r   r   r   r   r   r   r   r%   r   ZpositionMulti)r   r2   r3   r  r   r   r  r   r   r   r   processPositionMultiMsg  s(    





zDecoder.processPositionMultiMsgc          	   C   s   t | tt|}tt|}tt|}tt|}tt|}tt|}t }x$t|D ]}	tt|}
||
 qTW tt|}t }x$t|D ]}	tt|}|| qW | j	||||||| d S )N)
r!   r"   r#   r;   setr   addr$   r   Z!securityDefinitionOptionParameter)r   r2   r3   r   underlyingConIdr   r   ZexpCountZexpirationsr   Z
expirationZstrikeCountZstrikesr   r   r   r   +processSecurityDefinitionOptionParameterMsg  s$    









z3Decoder.processSecurityDefinitionOptionParameterMsgc             C   s"   t | tt|}| j| d S )N)r!   r"   r#   r   Z$securityDefinitionOptionParameterEnd)r   r2   r3   r   r   r   .processSecurityDefinitionOptionParameterEndMsg  s    
z6Decoder.processSecurityDefinitionOptionParameterEndMsgc             C   sx   t | tt|}tt|}g }xDt|D ]8}t }tt||_tt||_tt||_|	| q*W | j
|| d S )N)r!   r"   r#   r   r   r;   namevalZdisplayNamer   r   ZsoftDollarTiers)r   r2   r3   ZnTiersZtiersr   Ztierr   r   r   processSoftDollarTiersMsg  s    

z!Decoder.processSoftDollarTiersMsgc             C   s`   t | tt|}g }x8t|D ],}t }tt||_tt||_|| q W | j	
| d S )N)r!   r"   r#   r   Z
FamilyCoder;   Z	accountIDZfamilyCodeStrr   r   familyCodes)r   r2   ZnFamilyCodesr)  r   ZfamCoder   r   r   processFamilyCodesMsg  s    
zDecoder.processFamilyCodesMsgc       	      C   s   t | tt|}tt|}g }xt|D ]}t }tt||j_tt||j_tt||j_	tt||j_
tt||j_tt|}g |_x&t|D ]}tt|}|j| qW || | jtkr*tt||j_tt||j_q*W | j|| d S )N)r!   r"   r#   r   r   r   r   r;   r   r   r   r   ZderivativeSecTypesr   r   MIN_SERVER_VER_BOND_ISSUERIDdescriptionissuerIdr   ZsymbolSamples)	r   r2   r3   ZnContractDescriptionsZcontractDescriptionsr   ZconDescZnDerivativeSecTypesZderivSecTyper   r   r   processSymbolSamplesMsg  s*    





zDecoder.processSymbolSamplesMsgc             C   sx   t | tt|}tt|}g }xDt|D ]8}t }tt||_tt||_tt||_|	| q*W | j
|| d S )N)r!   r"   r#   r   ZSmartComponentZ	bitNumberr;   r   ZexchangeLetterr   r   ZsmartComponents)r   r2   r3   nZsmartComponentMapr   ZsmartComponentr   r   r   processSmartComponents-  s    

zDecoder.processSmartComponentsc             C   sF   t | tt|}tt|}tt|}tt|}| j|||| d S )N)r!   r"   r#   r$   r;   r   ZtickReqParams)r   r2   tickerIdr   bboExchangeZsnapshotPermissionsr   r   r   processTickReqParams<  s    



zDecoder.processTickReqParamsc             C   s   t | g }tt|}|dkrxrt|D ]f}t }tt||_tt||_| jt	krztt||_
tt||_tt||_n
tt| || q(W | j| d S )Nr   )r!   r"   r#   r   ZDepthMktDataDescriptionr;   r   r   r   Z MIN_SERVER_VER_SERVICE_DATA_TYPEZlistingExchZserviceDataTyper   r   r   ZmktDepthExchanges)r   r2   ZdepthMktDataDescriptionsZnDepthMktDataDescriptionsr   descr   r   r   processMktDepthExchangesD  s    


z Decoder.processMktDepthExchangesc             C   s.   t | tt|}tt|}| j|| d S )N)r!   r"   r#   r;   r   headTimestamp)r   r2   r3   r6  r   r   r   processHeadTimestampX  s    

zDecoder.processHeadTimestampc             C   s^   t | tt|}tt|}tt|}tt|}tt|}tt|}| j|||||| d S )N)r!   r"   r#   r;   r   ZtickNews)r   r2   r1  Z	timeStampproviderCode	articleIdheadlineZ	extraDatar   r   r   processTickNews^  s    





zDecoder.processTickNewsc             C   sh   t | g }tt|}|dkrXx8t|D ],}t }tt||_tt||_|| q(W | j	
| d S )Nr   )r!   r"   r#   r   ZNewsProviderr;   coder&  r   r   newsProviders)r   r2   r=  ZnNewsProvidersr   providerr   r   r   processNewsProvidersh  s    
zDecoder.processNewsProvidersc             C   s:   t | tt|}tt|}tt|}| j||| d S )N)r!   r"   r#   r;   r   ZnewsArticle)r   r2   r3   ZarticleTypeZarticleTextr   r   r   processNewsArticleu  s
    


zDecoder.processNewsArticlec             C   sR   t | tt|}tt|}tt|}tt|}tt|}| j||||| d S )N)r!   r"   r#   r;   r   ZhistoricalNews)r   r2   	requestIdr   r8  r9  r:  r   r   r   processHistoricalNews|  s    




zDecoder.processHistoricalNewsc             C   s.   t | tt|}tt|}| j|| d S )N)r!   r"   r#   r   r   ZhistoricalNewsEnd)r   r2   r3   ZhasMorer   r   r   processHistoricalNewsEnd  s    

z Decoder.processHistoricalNewsEndc             C   sl   t | tt|}tt|}g }x8t|D ],}t }tt||_tt||_|	| q*W | j
|| d S )N)r!   r"   r#   r   ZHistogramDatar$   r5   r%   r6   r   r   ZhistogramData)r   r2   r3   Z	numPoints	histogramr   Z	dataPointr   r   r   processHistogramData  s    

zDecoder.processHistogramDatac             C   s:   t | tt|}tt|}tt|}| j||| d S )N)r!   r"   r#   r;   r   ZrerouteMktDataReq)r   r2   r3   r   r   r   r   r   processRerouteMktDataReq  s
    


z Decoder.processRerouteMktDataReqc             C   s:   t | tt|}tt|}tt|}| j||| d S )N)r!   r"   r#   r;   r   ZrerouteMktDepthReq)r   r2   r3   r   r   r   r   r   processRerouteMktDepthReq  s
    


z!Decoder.processRerouteMktDepthReqc             C   st   t | tt|}tt|}g }|dkrbx8t|D ],}t }tt||_tt||_|| q2W | j	
|| d S )Nr   )r!   r"   r#   r   ZPriceIncrementr$   ZlowEdge	incrementr   r   Z
marketRule)r   r2   marketRuleIdZnPriceIncrementsZpriceIncrementsr   ZprcIncr   r   r   processMarketRuleMsg  s    

zDecoder.processMarketRuleMsgc             C   sb   t | tt|}tt|}d }d }| jtkr8tt|}| jtkrLtt|}| j|||| d S )N)	r!   r"   r#   r$   r   MIN_SERVER_VER_UNREALIZED_PNLMIN_SERVER_VER_REALIZED_PNLr   pnl)r   r2   r3   dailyPnLunrealizedPnLrealizedPnLr   r   r   processPnLMsg  s    





zDecoder.processPnLMsgc             C   sz   t | tt|}tt|}tt|}d }d }| jtkrBtt|}| jtkrVtt|}tt|}| j	|||||| d S )N)
r!   r"   r#   r%   r$   r   rK  rL  r   Z	pnlSingle)r   r2   r3   posrN  rO  rP  r   r   r   r   processPnLSingleMsg  s    







zDecoder.processPnLSingleMsgc             C   s   t | tt|}tt|}g }xLt|D ]@}t }tt||_t | tt||_tt||_	|
| q*W tt|}| j||| d S )N)r!   r"   r#   r   ZHistoricalTickr   r$   r5   r%   r6   r   r   r   ZhistoricalTicks)r   r2   r3   	tickCountticksr   ZhistoricalTickdoner   r   r   processHistoricalTicks  s    


zDecoder.processHistoricalTicksc       
      C   s   t | tt|}tt|}g }xt|D ]}t }tt||_tt|}t }|d@ dk|_|d@ dk|_||_	tt
||_tt
||_tt||_tt||_|| q*W tt|}	| j|||	 d S )Nr   r   r   )r!   r"   r#   r   ZHistoricalTickBidAskr   TickAttribBidAskaskPastHigh
bidPastLowtickAttribBidAskr$   ZpriceBidZpriceAskr%   ZsizeBidZsizeAskr   r   r   ZhistoricalTicksBidAsk)
r   r2   r3   rT  rU  r   ZhistoricalTickBidAskmaskr[  rV  r   r   r   processHistoricalTicksBidAsk  s&    



z$Decoder.processHistoricalTicksBidAskc       
      C   s   t | tt|}tt|}g }xt|D ]}t }tt||_tt|}t }|d@ dk|_|d@ dk|_||_	tt
||_tt||_tt||_tt||_|| q*W tt|}	| j|||	 d S )Nr   r   r   )r!   r"   r#   r   ZHistoricalTickLastr   TickAttribLastr'   
unreportedtickAttribLastr$   r5   r%   r6   r;   r   specialConditionsr   r   r   ZhistoricalTicksLast)
r   r2   r3   rT  rU  r   ZhistoricalTickLastr\  r`  rV  r   r   r   processHistoricalTicksLast  s&    



z"Decoder.processHistoricalTicksLastc          
   C   sR  t | tt|}tt|}tt|}|dkr2n|dksB|dkrtt|}tt|}tt|}t }|d@ dk|_|d@ dk|_tt|}	tt|}
| j	
|||||||	|
 n|dkr*tt|}tt|}tt|}tt|}tt|}t }|d@ dk|_|d@ dk|_| j	||||||| n$|dkrNtt|}| j	||| d S )Nr   r   r   r   r    )r!   r"   r#   r$   r%   r^  r'   r_  r;   r   ZtickByTickAllLastrX  rZ  rY  ZtickByTickBidAskZtickByTickMidPoint)r   r2   r3   r4   r   r5   r6   r\  r`  r   ra  ZbidPriceZaskPriceZbidSizeZaskSizer[  ZmidPointr   r   r   processTickByTickMsg  s>    

















zDecoder.processTickByTickMsgc             C   s:   t | tt|}tt|}tt|}| j||| d S )N)r!   r"   r#   r   Z
orderBound)r   r2   r3   ZapiClientIdZ
apiOrderIdr   r   r   processOrderBoundMsgI  s
    


zDecoder.processOrderBoundMsgc             C   sh   t | tt| tt|}tt|}tt|}tt|}tt|}tt|}| j|||||| d S )N)r!   r"   r#   r$   r%   r   ZupdateMktDepth)r   r2   r3   r   	operationr   r5   r6   r   r   r   processMarketDepthMsgQ  s    






zDecoder.processMarketDepthMsgc       
   
   C   s   t | tt| tt|}tt|}tt|}tt|}tt|}tt|}tt|}d}	| jtkrptt|}	| j	
||||||||	 d S )NF)r!   r"   r#   r;   r$   r%   r   MIN_SERVER_VER_SMART_DEPTHr   r   ZupdateMktDepthL2)
r   r2   r3   r   ZmarketMakerre  r   r5   r6   isSmartDepthr   r   r   processMarketDepthL2Msg^  s    









zDecoder.processMarketDepthL2Msgc             C   s.  t | t }t }t }t| |||t| j t| | t	| | t
| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t| | t | | t!| | t"| | t#| | t$| | t%| | t&| | t'| | t(| |d t)| | t*| | t+| | t,| | t-| | t.| | t/| | t0| | t1| | t2| | t3| | t4| | t5| | t6| | t7| | t8| | t9| | t:| | t;| | t<| | t=| | t>| | t?| | t@| | tA| | tB| | tC| | tD| | tE| | | jFG||| d S )NF)Hr!   rI   rJ   rK   r	   r   UNSET_INTEGERr   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   ZdecodeOrderStatusrx   ry   rz   Z decodeStopPriceAndLmtPriceOffsetr{   r|   r}   ZdecodeAutoCancelDateZdecodeFilledQuantityZdecodeRefFuturesConIdr~   ZdecodeShareholderZdecodeImbalanceOnlyZdecodeRouteMarketableToBboZdecodeParentPermIdZdecodeCompletedTimeZdecodeCompletedStatusr   r   ZcompletedOrder)r   r2   r   r   r   r   r   r   processCompletedOrderMsgr  s    z Decoder.processCompletedOrderMsgc             C   s   t | | j  d S )N)r!   r   ZcompletedOrdersEnd)r   r2   r   r   r   processCompletedOrdersEndMsg  s    z$Decoder.processCompletedOrdersEndMsgc             C   s.   t | tt|}tt|}| j|| d S )N)r!   r"   r#   r;   r   ZreplaceFAEnd)r   r2   r3   textr   r   r   processReplaceFAEndMsg  s    

zDecoder.processReplaceFAEndMsgc             C   s.   t | tt|}tt|}| j|| d S )N)r!   r"   r#   r;   r   ZwshMetaData)r   r2   r3   dataJsonr   r   r   processWshMetaDataMsg  s    

zDecoder.processWshMetaDataMsgc             C   s.   t | tt|}tt|}| j|| d S )N)r!   r"   r#   r;   r   wshEventData)r   r2   r3   ro  r   r   r   processWshEventDataMsg  s    

zDecoder.processWshEventDataMsgc       
      C   s   t | tt|}tt|}tt|}tt|}tt|}g }xDt|D ]8}t }	tt||	_tt||	_tt||	_|	|	 qHW | j
||||| d S )N)r!   r"   r#   r;   r   ZHistoricalSessionstartDateTimeendDateTimeZrefDater   r   ZhistoricalSchedule)
r   r2   r3   rs  rt  ZtimeZoneZsessionsCountsessionsr   ZhistoricalSessionr   r   r   processHistoricalSchedule  s    




z!Decoder.processHistoricalSchedulec             C   s.   t | tt|}tt|}| j|| d S )N)r!   r"   r#   r;   r   ZuserInfo)r   r2   r3   ZwhiteBrandingIdr   r   r   processUserInfo  s    

zDecoder.processUserInfoc             C   sl   t | tt| tt|}tt|}tt|d| jtk}d}| jtkrVtt|dd}| j	|||| d S )NF T)
r!   r"   r#   TickerIdr;   r   r   $MIN_SERVER_VER_ADVANCED_ORDER_REJECTr   error)r   r2   r3   	errorCodeZerrorStringadvancedOrderRejectJsonr   r   r   processErrorMsg  s    



zDecoder.processErrorMsg)r   isBondc             C   s   t t|}|d k	rd|kr&|d}n| }t|dkrV|rJ|d |_n|d |j_t|dkrl|d |_|rt|dkr|d |_d S )N-r   r   r   )	r"   r;   splitlenmaturityr   r   ZlastTradeTimer   )r   r2   r   r  r   splittedr   r   r   r     s    

zDecoder.readLastTradeDatec             C   sl   i }x| j  D ]}|||j< qW tttj}x6|D ].\}}t|}||d }|d k	r6|j	|_
q6W d S )N)msgId2handleInfovaluesr   inspect
getmembersEWrapper
isfunction	signatureget
parametersr   )r   Zmeth2handleInfo
handleInfomethodsr   methsigr   r   r   r     s    
zDecoder.discoverParamsc             C   sl   xf| j  D ]X\}}|jd k	rtd|jj |jd k	rx*|j D ]\}}td||j|j qDW qW d S )Nzmeth %sz	param %s %s %s)	r  itemsr   loggerdebugr   r   r&  
annotation)r   r   r  pnameparamr   r   r   printParams(  s    

zDecoder.printParamsc       
   	   C   s  |j d krtd|| d S d}t|| t|j d krZtdt|t|j || d S |}g }x|j  D ]\}}|dkrntd||  y || | jtkrdnd}W n" t	k
r   || d	}Y nX td
||j
 |j
tkrt|}nF|j
tkrt|}n0|j
tkr<|d ks0t|dkr4tS t|S || |d7 }qnW t| j|jj}	td|	| j| |	|  d S )Nz%s: no param info in %sr   r   zBdiff len fields and params %d %d for fields: %s and handleInfo: %sr   z	field %s zunicode-escapezUTF-8zlatin-1zarg %s type %sr   zcalling %s with %s %s)r   r  r  r  r{  r  r"   r   r   UnicodeDecodeErrorr  r#   r$   r%   ZUNSET_DECIMALr   getattrr   r   r   )
r   r2   r  ZnIgnoreFieldsZfieldIdxargsr  r  argmethodr   r   r   interpretWithSignature1  s@    
 



zDecoder.interpretWithSignaturec          	   C   s   t |dkrtd d S |d }t|}| j|d }|d krPtd| d S yB|jd k	rvtd| | || n|jd k	r|| t	| W n> t
k
r   d|}| jtt t | d  Y nX d S )Nr   z	no fieldsz%s: no handleInfozIn interpret(), handleInfo: %s,rx  )r  r  r  r#   r  r  r   r  r   iter
BadMessagejoinr   r{  NO_VALID_IDr   r<  msg)r   r2   ZsMsgIdZnMsgIdr  Z	theBadMsgr   r   r   	interpretX  s(    



zDecoder.interpret)r   )r   N)r   r   r   r   r9   r:   rH   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r   r$  r%  r(  r*  r.  r0  r3  r5  r7  r;  r?  r@  rB  rC  rE  rF  rG  rJ  rQ  rS  rW  r]  rb  rc  rd  rf  ri  rk  rl  rn  rp  rr  rv  rw  r~  r   r   r   r   r  r  r  r   Z
TICK_PRICEr
   Z	TICK_SIZEZORDER_STATUSZERR_MSGZ
OPEN_ORDERZ
ACCT_VALUEr  updateAccountValueZPORTFOLIO_VALUEZACCT_UPDATE_TIMEupdateAccountTimeZNEXT_VALID_IDnextVa1idIdZCONTRACT_DATAZEXECUTION_DATAZMARKET_DEPTHZMARKET_DEPTH_L2ZNEWS_BULLETINSZupdateNewsBulletinZMANAGED_ACCTSZmanagedAccountsZ
RECEIVE_FAZ	receiveFAZHISTORICAL_DATAZHISTORICAL_DATA_UPDATEZBOND_CONTRACT_DATAZSCANNER_PARAMETERSscannerParametersZSCANNER_DATAZTICK_OPTION_COMPUTATIONZTICK_GENERICtickGenericZTICK_STRING
tickStringZTICK_EFPZtickEFPZCURRENT_TIMEcurrentZREAL_TIME_BARSZFUNDAMENTAL_DATAZfundamentalDataZCONTRACT_DATA_ENDcontractDetailsEndZOPEN_ORDER_ENDopenOrderEndZACCT_DOWNLOAD_ENDaccountDownloadEndZEXECUTION_DATA_ENDZexecDetailsEndZDELTA_NEUTRAL_VALIDATIONZTICK_SNAPSHOT_ENDtickSnapshotEndZMARKET_DATA_TYPEr  ZCOMMISSION_REPORTZPOSITION_DATAZPOSITION_ENDpositionEndZACCOUNT_SUMMARYaccountSummaryZACCOUNT_SUMMARY_ENDaccountSummaryEndZVERIFY_MESSAGE_APIZverifyMessageAPIZVERIFY_COMPLETEDZverifyCompletedZDISPLAY_GROUP_LISTZdisplayGroupListZDISPLAY_GROUP_UPDATEDZdisplayGroupUpdatedZVERIFY_AND_AUTH_MESSAGE_APIZverifyAndAuthMessageAPIZVERIFY_AND_AUTH_COMPLETEDZverifyAndAuthCompletedZPOSITION_MULTIZPOSITION_MULTI_ENDZpositionMultiEndZACCOUNT_UPDATE_MULTIZaccountUpdateMultiZACCOUNT_UPDATE_MULTI_ENDZaccountUpdateMultiEndZ$SECURITY_DEFINITION_OPTION_PARAMETERZ(SECURITY_DEFINITION_OPTION_PARAMETER_ENDZSOFT_DOLLAR_TIERSZFAMILY_CODESZSYMBOL_SAMPLESZSMART_COMPONENTSZTICK_REQ_PARAMSZMKT_DEPTH_EXCHANGESZHEAD_TIMESTAMPZ	TICK_NEWSZNEWS_PROVIDERSZNEWS_ARTICLEZHISTORICAL_NEWSZHISTORICAL_NEWS_ENDZHISTOGRAM_DATAZREROUTE_MKT_DATA_REQZREROUTE_MKT_DEPTH_REQZMARKET_RULEZPNLZ
PNL_SINGLEZHISTORICAL_TICKSZHISTORICAL_TICKS_BID_ASKZHISTORICAL_TICKS_LASTZTICK_BY_TICKZORDER_BOUNDZCOMPLETED_ORDERZCOMPLETED_ORDERS_ENDZREPLACE_FA_ENDZWSH_META_DATAZWSH_EVENT_DATAZHISTORICAL_SCHEDULEZ	USER_INFOr  r   r   r   r   r   +   s  )^)SC!= <
	*M	'r   N)__doc__ibapi.messager   ibapi.wrapperibapi.contractr   ibapi.server_versionsibapi.utilsZibapi.softdollartierr   Zibapi.ticktypeZibapi.tag_valuer   ibapi.scannerr   ibapi.errorsr   ibapi.commonZibapi.orderdecoderr	   logging	getLoggerr   r  ZObjectr
   r   r   r   r   r   <module>   s   	
