
    T>qjy                        d Z ddlZddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
mZmZmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ dd	lAmBZBmCZCmDZDmEZE dd
lFmGZG ddlHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP eeQeeQeQf   f   ZR G d deS      ZT G d d      ZUy)z$Wrapper to handle incoming messages.    N)defaultdict)suppress)datetimetimezone)AnyDictListOptionalSetTupleUnioncast)ContractContractDescriptionContractDetailsDeltaNeutralContractScanData)(AccountValueBarDataBarDataListCommissionReportDOMLevelDepthMktDataDescription	Dividends	Execution
FamilyCodeFillFundamentalRatiosHistogramDataHistoricalNewsHistoricalScheduleHistoricalSessionHistoricalTickHistoricalTickBidAskHistoricalTickLastMktDepthDataNewsArticleNewsBulletinNewsProviderNewsTickOptionChainOptionComputationPnL	PnLSinglePortfolioItemPositionPriceIncrementRealTimeBarRealTimeBarListSoftDollarTierTickAttribBidAskTickAttribLastTickByTickAllLastTickByTickBidAskTickByTickMidPointTickDataTradeLogEntry)Order
OrderStateOrderStatusTrade)Ticker)UNSET_DOUBLEUNSET_INTEGERdataclassAsDictdataclassUpdategetLoopglobalErrorEventisNanparseIBDatetimec                   0     e Zd ZdZdededef fdZ xZS )RequestErrorzd
    Exception to raise when the API reports an error that can be tied to
    a single request.
    reqIdcodemessagec                 Z    t         |   d| d|        || _        || _        || _        y)z
        Args:
          reqId: Original request ID.
          code: Original error code.
          message: Original error message.
        zAPI error: : N)super__init__rK   rL   rM   )selfrK   rL   rM   	__class__s       P/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/ib_insync/wrapper.pyrQ   zRequestError.__init__'   s4     	;tfBwi89
	    )__name__
__module____qualname____doc__intstrrQ   __classcell__)rS   s   @rT   rJ   rJ   !   s'    

c 
 
s 
 
rU   rJ   c                   D   e Zd ZdZd Zd Zd Zd ZddZddZ	d	e
d
edee
ef   fdZdedee
ef   fdZddZd Zde
de
de
defdZdefdZddefdZd Zd	e
fdZdefdZdefdZd ed!ed"ed#efd$Zd%efd&Zd	e
d#ed'ed ed!ed"efd(Zd	e
fd)Zd*e
d#ed ed+ed"ef
d,Z d	e
fd-Z!d
ed.ed/ed0ed1ed2ed3ed#efd4Z"d#ed
ed.ed5efd6Z#d7 Z$d	e
d#ed'ed
ed8ed5efd9Z%d	e
fd:Z&d	e
d;ed<ed=efd>Z'd	e
d8e
d;ed<ed=ed+efd?Z(de
d
ed@e)dAe*fdBZ+dC Z,d
ed@e)dAe*fdDZ-dE Z.	 dde
dFedGedHedIede
dJe
dKede
dLedMefdNZ/d	e
d
edOe0fdPZ1d	e
fdQZ2dRe3fdSZ4d	e
dTe
dUe
fdVZ5d	e
dWe6fdXZ7e7Z8d	e
fdYZ9d	e
dZe:e;   fd[Z<d\e
d]e:e=   fd^Z>d	e
d_e
fd`Z?d	e
dae
dbedceddedeedfedgedhe
fdiZ@d	e
djeAfdkZBdledmefdnZCd	e
djeAfdoZDd	e
dpefdqZEd	e
dre:eF   dseGfdtZHd	e
dre:eI   dseGfduZJd	e
dre:eK   dseGfdvZLd	e
de
dwedxefdyZMd	e
de
dxefdzZNd	e
fd{ZOd	e
de
dae
dwedxed|ePfd}ZQd	e
dae
d~ededededeRfdZSd	e
dae
defdZTd	e
de
d+efdZUd	e
de
d+efdZVd	e
dedede
fdZWd ZXde:eY   fdZZd	e
de
de
de
dwedxefdZ[	 dd	e
de
dede
de
dwedxedeGfdZ\d	e
de
de
dedededededededefdZ]d	e
de^fdZ_d	e
defdZ`defdZad	e
de
dWe6dedededefdZbd	e
fdZcd	e
de:ed   fdZed	e
dede
dedede:e   de:e   fdZfd	e
fdZgde:eh   fdZid*e
de
dedededefdZjd	e
de
defdZkd	e
daedededef
dZldeGfdĄZmde
de
dedefdɄZnde
defd̄Zodae
fd̈́Zpd	e
de
dededede
dededefdՄZqd	e
dededede:er   f
dڄZsd	e
defd܄Ztd	e
defd݄Zud	e
defd߄Zvd	e
de:ew   fdZxde:ey   fdZzd	e
de
dedefdZ{d Z|d Z}y)Wrapperz1Wrapper implementation for use with the IB class.c                 t    || _         t        j                  d      | _        d | _        | j                          y )Nzib_insync.wrapper)iblogging	getLogger_logger_timeoutHandlereset)rR   r`   s     rT   rQ   zWrapper.__init__7   s-    (()<="

rU   c                    i | _         i | _        t        t              | _        t        t              | _        i | _        i | _        i | _        g | _	        i | _
        i | _        t               | _        i | _        t        t              | _        i | _        i | _        i | _        i | _        i | _        d| _        d| _        i | _        i | _        t2        j4                  | _        i | _        g | _        d| _        d| _        | jA                  d       y )Nr   )!accountValuesacctSummaryr   dict	portfolio	positionstradespermId2Tradefills	newsTicksmsgId2NewsBulletintickerssetpendingTickersreqId2Tickerticker2ReqIdreqId2Subscriber	reqId2PnLreqId2PnlSinglepnlKey2ReqIdpnlSingleKey2ReqIdwshMetaReqIdwshEventReqId_futures_resultsr   minlastTime_reqId2ContractaccountsclientId_timeout
setTimeoutrR   s    rT   re   zWrapper.reset=   s    8:68>I$>O9DT9J13.0&(
)+;=*,+.5/1  	 13)+57.046 "#"# 46(* #+,,46#% rU   c           	         | j                   j                         D cg c]  }|j                   }}|| j                  j                         D cg c]  }|j                   c}z  }| j                  j                         D ]T  }||j
                  |j                  |j                  |j                  |j                  |j                  |j                  gz  }V |D ]  }|j                           yc c}w c c}w )z)Set all subscription-type events as done.N)rr   valuesupdateEventrw   rm   statusEventmodifyEvent	fillEventfilledEventcommissionReportEventcancelEventcancelledEventset_done)rR   tickereventssubtradeevents         rT   setEventsDonezWrapper.setEventsDoner   s    37<<3F3F3HI&$$IId.C.C.J.J.LMs3??MM[['') 	9E!!5#4#4eoo!!5#>#>!!5#7#79 9F	9
  	ENN	 JMs   C0C5c                     t        d      }| j                  j                         D ]$  }|j                         r|j	                  |       & t        j                  |       | j                          y )NzSocket disconnect)ConnectionErrorr~   r   doneset_exceptionrF   emitre   )rR   errorfutures      rT   connectionClosedzWrapper.connectionClosed~   sY     34mm**, 	,F;;=$$U+	, 	e$

rU   Nc                     t        j                         }|| j                  |<   ||ng | j                  |<   |r|| j                  |<   |S )z
        Start a new request and return the future that is associated
        with the key and container. The container is a list by default.
        )asyncioFuturer~   r   r   )rR   keycontract	containerr   s        rT   startReqzWrapper.startReq   sK    
 ")!1#c*3*?YRc(0D  %rU   c                 "   | j                   j                  |d      }| j                  j                  |d       |rU|| j                  j                  |g       }|j	                         s&|r|j                  |       y|j                  |       yyy)z
        Finish the future of corresponding key with the given result.
        If no result is given then it will be popped of the general results.
        N)r~   popr   r   r   
set_resultr   )rR   r   resultsuccessr   s        rT   _endReqzWrapper._endReq   s    
 ""3-  d+~**33;;=%%f-((0	 ! rU   rK   r   tickTypec                    | j                   j                  t        |            }|s)t        |g g g g g       }|| j                   t        |      <   || j                  |<   || j
                  |<   || j                  |   |<   |S )zr
        Start a tick request that has the reqId associated with the contract.
        Return the ticker.
        )r   tickstickByTicksdomBidsdomAsksdomTicks)rr   getidr@   ru   r   rv   )rR   rK   r   r   r   s        rT   startTickerzWrapper.startTicker   s     !!"X,/!B5F *0DLLH&#)% &.U#.3(#F+rU   r   c                 |    | j                   |   j                  |d      }| j                  j                  |d        |S Nr   )rv   r   r   )rR   r   r   rK   s       rT   	endTickerzWrapper.endTicker   s:    !!(+//:  -rU   c                 @    || j                   |<   || j                  |<   y)zRegister a live subscription.N)r   rw   )rR   rK   
subscriberr   s       rT   startSubscriptionzWrapper.startSubscription   s"    &.U#'1e$rU   c                     | j                   j                  |j                  d       | j                  j                  |j                  d       y)zUnregister a live subscription.N)r   r   rK   rw   )rR   r   s     rT   endSubscriptionzWrapper.endSubscription   s:      !1!148!!*"2"2D9rU   r   orderIdpermIdreturnc                      |dk  r|}|S ||f}|S r    )rR   r   r   r   r   s        rT   orderKeyzWrapper.orderKey   s(     a<C 
 W%C
rU   timeoutc                     t        j                  t        j                        | _        | j
                  r| j
                  j                          d | _        || _        |r| j                  |       y y N)	r   nowr   utcr   rd   cancelr   	_setTimer)rR   r   s     rT   r   zWrapper.setTimeout   sT     X\\2&&("NN7# rU   delayc                    | j                   t        j                  k(  ry t        j                  t        j
                        }|| j                   z
  j                         }|s| j                  |z
  }|dkD  r,t               }|j                  || j                        | _        y | j                  j                  d       | j                  d       | j                  j                   j#                  |       y )Nr   Timeout)r   r   r   r   r   r   total_secondsr   rE   
call_laterr   rd   rc   debugr   r`   timeoutEventr   )rR   r   r   diffloops        rT   r   zWrapper._setTimer   s    ==HLL(ll8<<(dmm#224MMD(E199D"&//%"HDLLy)OOAGG  %%d+rU   c                      y r   r   r   s    rT   
connectAckzWrapper.connectAck       rU   c                      y r   r   rR   rK   s     rT   nextValidIdzWrapper.nextValidId   r   rU   accountsListc                 \    |j                  d      D cg c]  }|s|	 c}| _        y c c}w )N,)splitr   )rR   r   as      rT   managedAccountszWrapper.managedAccounts   s$    $0$6$6s$;AqqAAs   ))	timestampc                      y r   r   )rR   r   s     rT   updateAccountTimezWrapper.updateAccountTime   r   rU   tagvalcurrencyaccountc                     |||df}t        ||||d      }|| j                  |<   | j                  j                  j	                  |       y N r   rh   r`   accountValueEventr   )rR   r   r   r   r   r   acctVals          rT   updateAccountValuezWrapper.updateAccountValue   sJ    Xr*wS(B?")3!!&&w/rU   _accountc                 &    | j                  d       y )Nrh   r   )rR   r   s     rT   accountDownloadEndzWrapper.accountDownloadEnd   s    _%rU   	modelCodec                     ||||f}t        |||||      }|| j                  |<   | j                  j                  j	                  |       y r   r   )	rR   rK   r   r   r   r   r   r   r   s	            rT   accountUpdateMultizWrapper.accountUpdateMulti   sL     Xy1wS(IF")3!!&&w/rU   c                 &    | j                  |       y r   r   r   s     rT   accountUpdateMultiEndzWrapper.accountUpdateMultiEnd      UrU   _reqIdvaluec                     |||f}t        ||||d      }|| j                  |<   | j                  j                  j	                  |       y r   )r   ri   r`   accountSummaryEventr   )rR   r   r   r   r   r   r   r   s           rT   accountSummaryzWrapper.accountSummary  sJ     X&wUHbA '##((1rU   c                 &    | j                  |       y r   r   r   s     rT   accountSummaryEndzWrapper.accountSummaryEnd  r   rU   posSizemarketPricemarketValueaverageCostunrealizedPNLrealizedPNLc	           
      j   t        j                  di t        |      }t        ||||||||      }	| j                  |   }
|dk(  r|
j                  |j                  d        n|	|
|j                  <   | j                  j                  d|	        | j                  j                  j                  |	       y )Nr   zupdatePortfolio: r   )r   createrC   r/   rk   r   conIdrc   infor`   updatePortfolioEventr   )rR   r   r  r  r  r  r  r  r   	portfItemportfolioItemss              rT   updatePortfoliozWrapper.updatePortfolio  s     ???_X%>?!g{KW>	 0a<x~~t4-6N8>>*-i[9:$$)))4rU   avgCostc                    t        j                  di t        |      }t        ||||      }| j                  |   }|dk(  r|j                  |j                  d        n|||j                  <   | j                  j                  d|        | j                  j                  d      }||j                  |       | j                  j                  j                  |       y )Nr   z
position: rl   r   )r   r  rC   r0   rl   r   r	  rc   r
  r   r   appendr`   positionEventr   )rR   r   r   r  r  positionrl   resultss           rT   r  zWrapper.position#  s     ???_X%>?GXw@NN7+	a<MM(..$/(0Ihnn%Jxj12--##K0NN8$""8,rU   c                 &    | j                  d       y )Nrl   r   r   s    rT   positionEndzWrapper.positionEnd3  s    [!rU   posc                      y r   r   )rR   rK   r   r   r   r  r  s          rT   positionMultizWrapper.positionMulti6  s     	rU   c                      y r   r   r   s     rT   positionMultiEndzWrapper.positionMultiEnd;  r   rU   dailyPnLunrealizedPnLrealizedPnLc                     | j                   j                  |      }|sy ||_        ||_        ||_        | j
                  j                  j                  |       y r   )rx   r   r  r  r  r`   pnlEventr   )rR   rK   r  r  r  pnls         rT   r!  zWrapper.pnl>  sL     nn  ')%c"rU   c                     | j                   j                  |      }|sy ||_        ||_        ||_        ||_        ||_        | j                  j                  j                  |       y r   )
ry   r   r  r  r  r  r   r`   pnlSingleEventr   )rR   rK   r  r  r  r  r   	pnlSingles           rT   r$  zWrapper.pnlSingleI  s_     ((,,U3	 	%	"/	 +		##I.rU   order
orderStatec           
         |j                   r;|j                  t        t              k7  r5| j	                  |j
                  |       n| j                  |j                  |j
                  |j                        }| j                  j                  |      }|r|j                  |j                  _        |j                  |j                  _        |j                  |j                  _        |j                  |j                  _        |j                  |j                  _        |j                   |j                  _        nt#        di t%        |      j'                         D ci c]  \  }}|dk7  r|| c}}}t)        j*                  di t%        |      }t-        ||j.                        }	t1        |||	g g       }|| j                  |<   | j2                  j5                  d|        | j6                  j9                  |j                  |       | j:                  j                  d      }
|
&| j<                  j>                  jA                  |       n|
jC                  |       | j<                  jD                  jG                  |dz          yc c}}w )aE  
        This wrapper is called to:

        * feed in open orders at startup;
        * feed in open orders or order updates from other clients and TWS
          if clientId=master id;
        * feed in manual orders and order updates from TWS if clientId=0;
        * handle openOrders and allOpenOrders responses.
        ?r   statuszopenOrder: 
openOrdersN   r   )$whatIfinitMarginChanger[   rA   r   r   r   r   r   rm   r   r%  totalQuantitylmtPriceauxPrice	orderTypeorderRefr<   rC   itemsr   r  r>   r*  r?   rc   r
  rn   
setdefaultr   r`   openOrderEventr   r  clientupdateReqId)rR   r   r   r%  r&  r   r   kvorderStatusr  s              rT   	openOrderzWrapper.openOrderV  s    <<**c,.??U]]J7--u||LCKKOOC(E%*\\",1,?,?)',~~$',~~$(-%',~~$  "%4U%;%A%A%C!!!QCx qD!! " $??G_X-FG)#J,=,=?h{BC#(C !!Kw"78((u=mm''5G&&++E2 u%
 	""7Q;/)!!s   Jc                 &    | j                  d       y )Nr+  r   r   s    rT   openOrderEndzWrapper.openOrderEnd  s    \"rU   c                 r   t        j                  di t        |      }t        |j                  |j
                        }t        |||g g       }| j                  d   j                  |       |j                  | j                  vr3|| j                  |j                  <   || j                  |j                  <   y y )Nr)  completedOrdersr   )r   r  rC   r>   r   r*  r?   r   r  r   rn   rm   )rR   r   r%  r&  r;  r   s         rT   completedOrderzWrapper.completedOrder  s    ???_X%>?!MM**;*;=h{B;'(//6<<t000(-DKK%.3Dell+ 1rU   c                 &    | j                  d       y )Nr@  r   r   s    rT   completedOrdersEndzWrapper.completedOrdersEnd  s    &'rU   r*  filled	remainingavgFillPriceparentIdlastFillPricewhyHeldmktCapPricec                    | j                  |	||      }| j                  j                  |      }|r|j                  j                  }t        ||||||||	|
|
      }t        |j                        }|i ||k7  }|rt        |j                  fi | d}n2|dk(  r+|j                  r|j                  d   j                  dk(  rd}nd }|t        | j                  ||      }|j                  j                  |       | j                  j                  d|        | j                  j                   j#                  |       |j$                  j#                  |       ||k7  r_|t&        j(                  k(  r|j*                  j#                  |       y |t&        j,                  k(  r|j.                  j#                  |       y y y y | j                  j1                  d||	       y )	N)
r*  rD  rE  rF  r   rG  rH  r   rI  rJ  r   	Submittedrg   ModifyModifiedzorderStatus: z:orderStatus: No order found for orderId %s and clientId %s)r   rm   r   r;  r*  rj   rC   rD   logrM   r;   r   r  rc   r
  r`   orderStatusEventr   r   r>   Filledr   	Cancelledr   r   )rR   r   r*  rD  rE  rF  r   rG  rH  r   rI  rJ  r   r   	oldStatusnewcurr	isChangedmsglogEntrys                       rT   r;  zWrapper.orderStatus  s   
 mmHgv6$))00If#,+h[:C #5#4#45D43/I 1 19S9K'EII		"--9 (D		  *!!M%"9:((--e4!!&&u-Y&!3!33))..u5;#8#88,,11%8 9 '  LL-.5xArU   	executionc                 x   | j                   j                  d|        |j                  t        k(  rd|_        | j                  j                  |j                        }|sL| j                  |j                  |j                  |j                        }| j                  j                  |      }|r||j                  k(  r|j                  }nt        j                  di t        |      }|j                  }|| j                  v}|r| j                   n|j"                  }t%        ||t'               |      }	|| j(                  vr|	| j(                  |<   |r|j(                  j+                  |	       t-        ||j.                  j0                  d|j2                   d|j4                         }
|j6                  j+                  |
       |rV| j                   j                  d|	        | j8                  j:                  j=                  ||	       |j?                  ||	       |s| j@                  |   j+                  |	       yy)z^
        This wrapper handles both live fills and responses to
        reqExecutions.
        zexecDetails r   zFill @zexecDetails: Nr   )!rc   r
  r   rB   rn   r   r   r   r   rm   r   r   r  rC   execIdr~   r   timer   r   ro   r  r;   r;  r*  sharespricerO  r`   execDetailsEventr   r   r   )rR   rK   r   rY  r   r   r\  isLiver]  fillrX  s              rT   execDetailszWrapper.execDetails  s    	L45- !I!!%%i&6&67--""I$5$5y7G7GICKKOOC(EX/~~HC)BCH!!dmm+ &t}}INNHi)9);TB#!%DJJv""4((%%,,I,,-Qy.?@B 		  *LL%%dV&<=GG,,11%>OOE40MM% ''- rU   c                 &    | j                  |       y r   r   r   s     rT   execDetailsEndzWrapper.execDetailsEnd  r   rU   commissionReportc                    |j                   t        k(  rd|_         |j                  t        k(  rd|_        | j                  j	                  |j
                        }|rt        |j                  |      }| j                  j                  d|        | j                  j	                  |j                  j                        }|rE| j                  j                  j                  |||       |j                  j                  |||       y y y )N        zcommissionReport: )yield_rA   r  ro   r   r\  rD   rf  rc   r
  rn   rY  r   r`   r   r   )rR   rf  rb  reportr   s        rT   rf  zWrapper.commissionReport  s    ""l2&)#''<7+.(zz~~.556$T%:%:<LMFLL 26(;<%%))$..*?*?@E--225$G++00fE  rU   apiClientId
apiOrderIdc                      y r   r   )rR   rK   rk  rl  s       rT   
orderBoundzWrapper.orderBound  r   rU   contractDetailsc                 @    | j                   |   j                  |       y r   )r   r  )rR   rK   ro  s      rT   ro  zWrapper.contractDetails  s    e##O4rU   c                 &    | j                  |       y r   r   r   s     rT   contractDetailsEndzWrapper.contractDetailsEnd  r   rU   contractDescriptionsc                 (    | j                  ||       y r   r   )rR   rK   rs  s      rT   symbolSampleszWrapper.symbolSamples  s    U01rU   marketRuleIdpriceIncrementsc                 .    | j                  d| |       y )NzmarketRule-r   )rR   rv  rw  s      rT   
marketRulezWrapper.marketRule  s    {<.1?CrU   marketDataIdc                 N    | j                   j                  |      }|r||_        y y r   )ru   r   marketDataType)rR   rK   rz  r   s       rT   r|  zWrapper.marketDataType  s(    ""&&u-$0F! rU   r]  open_highlowclosevolumewapcountc
                 T   t        j                  |t        j                        }
t	        |
d|||||||		      }| j
                  j                  |      }|T|j                  |       | j                  j                  j                  |d       |j                  j                  |d       y y )Nrg   T)r   fromtimestampr   r   r2   rw   r   r  r`   barUpdateEventr   r   )rR   rK   r]  r}  r~  r  r  r  r  r  dtbarbarss                rT   realtimeBarzWrapper.realtimeBar  s     ##D(,,7"b%sE63N$$((/KKGG""''d3!!$- rU   r  c                     | j                   j                  |      }|,t        |j                        |_        |j	                  |       y y r   )r   r   rH   dater  )rR   rK   r  r  s       rT   historicalDatazWrapper.historicalData(  s=    --##E*&sxx0CHNN3 rU   _start_endc                 &    | j                  |       y r   r   )rR   rK   r  r  s       rT   historicalDataEndzWrapper.historicalDataEnd.  r   rU   c                    | j                   j                  |      }|sy t        |j                        |_        |d   j                  }|j                  |k  ry t	        |      dk(  xs |j                  |kD  }|r|j                  |       n|d   |k7  r||d<   ny | j                  j                  j                  ||       |j                  j                  ||       y )Nrg   r   )
rw   r   rH   r  lenr  r`   r  r   r   )rR   rK   r  r  lastDate	hasNewBars         rT   historicalDataUpdatezWrapper.historicalDataUpdate1  s    $$((/"388,8==88hIN9chh&9	KK"X_DH##D)4dI.rU   headTimestampc                     	 t        |      }| j                  ||       y # t        $ r}| j                  ||d       Y d }~y d }~ww xY w)NF)rH   r   
ValueError)rR   rK   r  r  excs        rT   r  zWrapper.headTimestampC  sB    	, /BLL# 	,LLU++	,s     	AAAr   r   c                 p    | j                   j                  |      }|||z  }|r| j                  |       y y r   r   r   r   rR   rK   r   r   r   s        rT   historicalTickszWrapper.historicalTicksJ  9    ""5)eOFLL rU   c                 p    | j                   j                  |      }|||z  }|r| j                  |       y y r   r  r  s        rT   historicalTicksBidAskzWrapper.historicalTicksBidAskR  r  rU   c                 p    | j                   j                  |      }|||z  }|r| j                  |       y y r   r  r  s        rT   historicalTicksLastzWrapper.historicalTicksLastZ  r  rU   r_  sizec                    | j                   j                  |      }|s| j                  j                  d|        y |dv rp||j                  k(  r||j
                  k(  ry ||j                  k7  r|j                  |_        ||_        ||j
                  k7  r|j
                  |_        ||_        n|dv rp||j                  k(  r||j                  k(  ry ||j                  k7  r|j                  |_
        ||_        ||j                  k7  r+|j                  |_        ||_	        n|dv rO||j                  k7  r|j                  |_        ||_        ||j                  k7  r|j                  |_        ||_        n|dv r||_        n|dv r||_        n|dv r||_        n|dv r||_        n|d	k(  r||_        n|d
k(  r||_        nt|dk(  r||_        ng|dk(  r||_        nZ|dk(  r||_        nM|dk(  r||_        n@|dk(  r||_        n3|dk(  r||_        n&|dk(  r||_        n|dk(  r||_        n|dk(  r||_        |s|r3t?        | j@                  |||      }|jB                  jE                  |       | jF                  jI                  |       y )NzpriceSizeTick: Unknown reqId: )r,  B   )   C   )   D   )   H   )   I   )	   K   )   L                     #   %   2   3   4   )%ru   r   rc   r   bidbidSizeprevBidprevBidSizeaskaskSizeprevAskprevAskSizelastprevLastlastSizeprevLastSizer~  r  r  open	low13week
high13week	low26week
high26week	low52week
high52weekauctionPrice	markPricebidYieldaskYield	lastYieldr:   r   r   r  rt   add)rR   rK   r   r_  r  r   ticks          rT   priceSizeTickzWrapper.priceSizeTickc  sY   ""&&u-LL!?wGHw

"tv~~'=

"!'"
v~~%%+^^"!% 

"tv~~'=

"!'"
v~~%%+^^"!% #"(++#v&&,oo#"& FK FJ  FL!FK^$F^ %F^$F^ %F^$F^ %F^"'F^$F^#FO^#FO^$FDDMM8UDADLL%'rU   c                    | j                   j                  |      }|s| j                  j                  d|        y d}|dv r6||j                  k(  ry |j
                  }|j                  |_        ||_        n|dv r5||j                  k(  ry |j                  }|j                  |_	        ||_        n|dv r@|j                  }t        |      ry ||j                  k7  r|j                  |_        ||_        n|dv r||_        n|dk(  r||_        n|dk(  r||_        nt|d	k(  r||_        ng|d
k(  r||_        nZ|dk(  r||_        nM|dk(  r||_        n@|dk(  r||_        n3|dk(  r||_        n&|dk(  r||_        n|dk(  r||_        n|dk(  r||_        |s|r3t5        | j6                  |||      }|j8                  j;                  |       | j<                  j?                  |       y )NztickSize: Unknown reqId: g      )r   E   )   F   )   G   )   J                  "   $   =   V   W   Y   ) ru   r   rc   r   r  r  r  r  r  r  r  rG   r  r  r  avVolumecallOpenInterestputOpenInterest
callVolume	putVolumeauctionVolumeauctionImbalanceregulatoryImbalancefuturesOpenInterestavOptionVolumeshortableSharesr:   r   r   r  rt   r  )rR   rK   r   r  r   r_  r  s          rT   tickSizezWrapper.tickSize  s   ""&&u-LL!:5'BCwv~~%JJE!'F!FN v~~%JJE!'F!FN KKEU|v&&,oo#"&  FM^"FO^&*F#^%)F"^ $F^#F^#'F ^&*F#^)-F&^)-F&^$(F!^%)F"DDMM8UDADLL%'rU   c                 &    | j                  |       y r   r   r   s     rT   tickSnapshotEndzWrapper.tickSnapshotEnd  r   rU   tickAttribLastc	           	         | j                   j                  |      }	|	s| j                  j                  d|        y ||	j                  k7  r|	j                  |	_        ||	_        ||	j                  k7  r|	j                  |	_        ||	_        t        || j                  |||||      }
|	j                  j                  |
       | j                  j                  |	       y )Nz"tickByTickAllLast: Unknown reqId: )ru   r   rc   r   r  r  r  r  r7   r   r   r  rt   r  )rR   rK   r   r]  r_  r  r  exchangespecialConditionsr   r  s              rT   tickByTickAllLastzWrapper.tickByTickAllLast  s     ""&&u-LL!CE7KLFKK$kkFOFK6??""(//F"FO dmmUD.') 	!!$''rU   bidPriceaskPricer  r  tickAttribBidAskc                 T   | j                   j                  |      }|s| j                  j                  d|        y ||j                  k7  r|j                  |_        ||_        ||j                  k7  r|j                  |_        ||_        ||j                  k7  r|j                  |_	        ||_        ||j                  k7  r|j                  |_        ||_
        t        | j                  |||||      }	|j                  j                  |	       | j                   j#                  |       y )Nz!tickByTickBidAsk: Unknown reqId: )ru   r   rc   r   r  r  r  r  r  r  r  r  r8   r   r   r  rt   r  )
rR   rK   r]  r  r   r  r  r  r   r  s
             rT   tickByTickBidAskzWrapper.tickByTickBidAsk  s     ""&&u-LL!B5'JKvzz!#ZZFN!FJfnn$!'F$FNvzz!#ZZFN!FJfnn$!'F$FNMM8Xw 	!!$''rU   midPointc                    | j                   j                  |      }|s| j                  j                  d|        y t	        | j
                  |      }|j                  j                  |       | j                  j                  |       y )Nz#tickByTickMidPoint: Unknown reqId: )
ru   r   rc   r   r9   r   r   r  rt   r  )rR   rK   r]  r  r   r  s         rT   tickByTickMidPointzWrapper.tickByTickMidPoint  sp    ""&&u-LL!DUGLM!$--:!!$''rU   c                    | j                   j                  |      }|sy 	 |dk(  r	||_        nR|dk(  r	||_        nD|dk(  r	||_        n6|dk(  rt        d |j                  d      D              }|j                         D ]@  \  }}t        t              5  |dk(  rd}t        |      ||<   t        |      ||<   d d d        B t        di ||_        n|d	v rD|j                  d      \  }}	}
}}}|r+|d
k(  rt        |      |_        n|dk(  rt        |      |_        |rt        |      |_        |
r5t#        j$                  t        |
      dz  t&        j(                        |_        |dk(  ry t        |      }t        |	      }|r|r|j,                  |j.                  k7  r|j.                  |_        ||_        |j0                  |j2                  k7  r|j2                  |_        ||_        t5        | j6                  |||      }|j8                  j;                  |       nb|dk(  r]|j                  d      \  }}}}t=        |rt        |      nd |rt        |      nd |rt?        |      nd |rt        |      nd       |_         | jB                  jE                  |       y # 1 sw Y   &xY w# t        $ r$ | jF                  jI                  d| d|       Y y w xY w)N    !   T   /   c              3   B   K   | ]  }|r|j                  d         yw)=N)r   ).0ts     rT   	<genexpr>z%Wrapper.tickString.<locals>.<genexpr>$  s"      9a  9s   ;z	-99999.99nan)0   M   r  r  i  r   ;   r   ztickString with tickType z: malformed value: r   )%ru   r   bidExchangeaskExchangelastExchangerj   r   r4  r   r  floatrZ   r   fundamentalRatiosrtVolumertTradeVolumevwapr   r  r   r   rtTimer  r  r  r  r:   r   r   r  r   rH   	dividendsrt   r  rc   r   )rR   rK   r   r   r   dr9  r:  priceStrsizeStrr  r  r  _r_  r  r  past12next12nextDate
nextAmounts                        rT   
tickStringzWrapper.tickString  s   ""&&u-=	/2~%*"R%*"R&+#R 9"'++c"29 9GGI &DAq!*- &+ %A$Qx!"1v!	& && ,=+Aq+A(X%
 >C[[=M:'6642~*/-!R/4V},"'+FK$,$:$:Fd*HLL%:FMr>hW~T&++5*0++&+**foo=.4oo+*.#DMM8UDIDLL''-R 8={{37G4*#,%+E&M%+E&M19OH-t)3E*%	$? 
 ##F+[& &\  	/LL+H: 6$$)9./	/s2   A5J) $J9B4J) .D-J) J&	!J) )*KKc                    | j                   j                  |      }|sy 	 t        |      }|dk(  r||_        nZ|dk(  r||_        nM|dk(  r||_        n@|dk(  r||_	        n3|dk(  r||_
        n&|dk(  r||_        n|dk(  r||_        n|d	k(  r||_        t        | j                  ||d
      }|j                   j#                  |       | j$                  j'                  |       y # t        $ r! | j                  j                  d|       Y y w xY w)NzgenericTick: malformed value:          1   6   7   8   :   r   )ru   r   r  r  rc   r   histVolatilityimpliedVolatilityindexFuturePremiumhalted
tradeCount	tradeRate
volumeRatertHistVolatilityr:   r   r   r  rt   r  )rR   rK   r   r   r   r  s         rT   tickGenericzWrapper.tickGenericZ  s   ""&&u-	%LE r>$)F!^',F$^(-F%^!FM^ %F^$F^ %F^&+F#x:D!'+  	LL!?yIJ	s   C! !'D
DminTickbboExchangesnapshotPermissionsc                 j    | j                   j                  |      }|sy ||_        ||_        ||_        y r   )ru   r   r;  r<  r=  )rR   rK   r;  r<  r=  r   s         rT   tickReqParamszWrapper.tickReqParamsw  s7     ""&&u- (%8"rU   c                 (    | j                  ||       y r   r   )rR   rK   
componentss      rT   smartComponentszWrapper.smartComponents  s    UJ'rU   depthMktDataDescriptionsc                 (    | j                  d|       y )NmktDepthExchangesr   )rR   rC  s     rT   rE  zWrapper.mktDepthExchanges  s    (*BCrU   r  	operationsidec           	      2    | j                  ||d||||       y r   )updateMktDepthL2)rR   rK   r  rF  rG  r_  r  s          rT   updateMktDepthzWrapper.updateMktDepth  s!     	8RD%	?rU   marketMakerisSmartDepthc	           	         | j                   |   }	|r|	j                  n|	j                  }
|dk(  r|
j                  |t	        |||             nH|dk(  rt	        |||      |
|<   n2|dk(  r-|t        |
      k  r|
j                  |      }|j                  }d}t        | j                  ||||||      }|	j                  j                  |       | j                  j                  |	       y )Nr   r,  r  )ru   r   r   insertr   r  r   r_  r&   r   r   r  rt   r  )rR   rK   r  rK  rF  rG  r_  r  rL  r   domlevelr  s                rT   rI  zWrapper.updateMktDepthL2  s    
 ""5) $fnn&..>JJx%{!CD!^$UD+>CM!^#c(")MM8[)T5$Pt$'rU   
tickAttrib
impliedVoldeltaoptPrice
pvDividendgammavegathetaundPricec                    t        ||dk7  r|nd |dk7  r|nd |dk7  r|nd |dk7  r|nd |dk7  r|nd |	dk7  r|	n|	|
dk7  r|
n|
|dk7  r|nd 	      }| j                  j                  |      }|rK|dv r||_        n#|dv r||_        n|dv r||_        n|dv r||_        | j                  j                  |       y || j                  v r| j                  ||       y | j                  j                  d|        y )Nrg   )
   P   )   Q   )   R   )   S   z&tickOptionComputation: Unknown reqId: )r,   ru   r   	bidGreeks	askGreeks
lastGreeksmodelGreeksrt   r  r~   r   rc   r   )rR   rK   r   rQ  rR  rS  rT  rU  rV  rW  rX  rY  compr   s                 rT   tickOptionComputationzWrapper.tickOptionComputation  s    !$*Jb[Ed BHD$*Jb[EdBJDDb[Ee BHD	2 ""&&u- 8##' X%#' X%$(!X%%)"##F+dmm#LL%LL8@BrU   dncc                      y r   r   )rR   rK   rj  s      rT   deltaNeutralValidationzWrapper.deltaNeutralValidation  r   rU   datac                 (    | j                  ||       y r   r   )rR   rK   rm  s      rT   fundamentalDatazWrapper.fundamentalData  s    UD!rU   xmlc                 (    | j                  d|       y )NscannerParamsr   )rR   rp  s     rT   scannerParameterszWrapper.scannerParameters  s    _c*rU   rankdistance	benchmark
projectionlegsStrc                     t        ||||||      }| j                  j                  |      }	|	| j                  j                  |      }	|	'|dk(  r|	j	                          |	j                  |       y y r   )r   rw   r   r   clearr  )
rR   rK   rt  ro  ru  rv  rw  rx  rm  dataLists
             rT   scannerDatazWrapper.scannerData  st    
 /8Y
GM((,,U3}}((/Hqy OOD!  rU   c                    | j                   j                  |      }|| j                  |       n| j                  j                  |      }|A| j                  j
                  j                  |       |j                  j                  |       y y r   )r   r   r   rw   r`   scannerDataEventr   r   )rR   rK   r{  s      rT   scannerDataEndzWrapper.scannerDataEnd  su    ==$$U+LL,,007HGG$$))(3  %%h/  rU   r4  c                     |D cg c]"  }t        |j                  |j                        $ }}| j                  ||       y c c}w r   )r   r_  r  r   )rR   rK   r4  itemr   s        rT   histogramDatazWrapper.histogramData  s8    DIJD-

DJJ7JJUF# Ks   'Ar  underlyingConIdtradingClass
multiplierexpirationsstrikesc                 `    t        ||||||      }| j                  |   j                  |       y r   )r+   r   r  )	rR   rK   r  r  r  r  r  r  chains	            rT   !securityDefinitionOptionParameterz)Wrapper.securityDefinitionOptionParameter  s5     o|Z" 	e##E*rU   c                 &    | j                  |       y r   r   r   s     rT   $securityDefinitionOptionParameterEndz,Wrapper.securityDefinitionOptionParameterEnd  r   rU   newsProvidersc                     |D cg c]#  }t        |j                  |j                        % }}| j                  d|       y c c}w )N)rL   namer  )r)   rL   r  r   )rR   r  ps      rT   r  zWrapper.newsProviders  sE     #$ aff1662$ $ 	_m4$s   (A	timeStampproviderCode	articleIdheadline	extraDatac                     t        |||||      }| j                  j                  |       | j                  j                  j                  |       y r   )r*   rp   r  r`   tickNewsEventr   )rR   r   r  r  r  r  r  newss           rT   tickNewszWrapper.tickNews  sD     |Y)Ed#""4(rU   articleTypearticleTextc                 @    t        ||      }| j                  ||       y r   )r'   r   )rR   rK   r  r  articles        rT   newsArticlezWrapper.newsArticle  s    k;7UG$rU   c                     t        |      }t        t        |      }t        ||||      }| j                  |   j                  |       y r   )rH   r   r   r    r   r  )rR   rK   r]  r  r  r  r  r  s           rT   historicalNewszWrapper.historicalNews  sA     T"(B \9hGe##G,rU   _hasMorec                 &    | j                  |       y r   r   )rR   rK   r  s      rT   historicalNewsEndzWrapper.historicalNewsEnd  r   rU   msgIdmsgTyperM   origExchangec                     t        ||||      }|| j                  |<   | j                  j                  j	                  |       y r   )r(   rq   r`   newsBulletinEventr   )rR   r  r  rM   r  bulletins         rT   updateNewsBulletinzWrapper.updateNewsBulletin  s<      wF)1&!!&&x0rU   _faDataType	faXmlDatac                 (    | j                  d|       y )N	requestFAr   )rR   r  r  s      rT   	receiveFAzWrapper.receiveFA  s    [),rU   c                 p    t        j                  |t        j                        }| j	                  d|       y )NcurrentTime)r   r  r   r   r   )rR   r]  r  s      rT   r  zWrapper.currentTime   s&    ##D(,,7]B'rU   basisPointsformattedBasisPointstotalDividendsholdDaysfutureLastTradeDatedividendImpactdividendsToLastTradeDatec
                      y r   r   )
rR   rK   r   r  r  r  r  r  r  r  s
             rT   tickEFPzWrapper.tickEFP$  s    
 	rU   startDateTimeendDateTimetimeZonesessionsc                 D    t        ||||      }| j                  ||       y r   )r!   r   )rR   rK   r  r  r  r  schedules          rT   historicalSchedulezWrapper.historicalSchedule+  s%     &;(<UH%rU   dataJsonc                 r    | j                   j                  j                  |       | j                  ||       y r   )r`   wshMetaEventr   r   rR   rK   r  s      rT   wshMetaDatazWrapper.wshMetaData2  s(    !!(+UH%rU   c                 r    | j                   j                  j                  |       | j                  ||       y r   )r`   wshEventr   r   r  s      rT   wshEventDatazWrapper.wshEventData6  s(    h'UH%rU   whiteBrandingIdc                 &    | j                  |       y r   r   )rR   rK   r  s      rT   userInfozWrapper.userInfo:  r   rU   tiersc                      y r   r   )rR   rK   r  s      rT   softDollarTierszWrapper.softDollarTiers=  r   rU   familyCodesc                      y r   r   )rR   r  s     rT   r  zWrapper.familyCodes@  r   rU   	errorCodeerrorStringadvancedOrderRejectJsonc                 

   || j                   v }| j                  j                  | j                  |f      }h d}||v xs d|cxk  xr dk  nc }|dk(  r|rd}|rdnd d| d	| d
| }	| j                  j                  |      }
|
r|	d|
 z  }	|r| j
                  j                  |	       nO| j
                  j                  |	       |rJ| j                  j                  r"t        |||      }| j                  ||d       n| j                  |       n|r|r||_        |j                         st        j                  x}|j                   _        t%        | j&                  ||	|      }|j(                  j+                  |       | j
                  j-                  d|        | j                  j.                  j1                  |       |j2                  j1                  |       |j4                  j1                  |       |dk(  rK| j6                  j                  |      }|r|j9                          |j:                  j1                  |       n|dk(  r| j<                  j                  |      }|ra|xj>                  |j@                  D cg c]'  }tC        | j&                  dddd|jD                  d      ) c}z  c_        |xj>                  |jF                  D cg c]'  }tC        | j&                  dddd|jD                  d      ) c}z  c_        |j@                  j9                          |jF                  j9                          | jH                  jK                  |       np|dk(  rj| j6                  j                  |      }tM        |tN              r| j                  jP                  jS                  |       | j                  jP                  jU                  ||jV                  |jX                  |jZ                  |j\                  |j^                         ntM        |t`              r| j                  jP                  jc                  |       | j                  jP                  je                  ||jV                  |jf                  |jh                  |jj                  |jZ                  |j\                  |jl                  |jn                  |jp                  
       | j                  jr                  j1                  ||||
       y c c}w c c}w )N>         '    n         i4  i  r  FWarningError z, reqId rO   z, contract: )r   zCanceled order: r  i=  r   r   r  r,  i'  ):r~   rm   r   r   r   rc   r
  r   r`   RaiseRequestErrorsrJ   r   advancedErrorisDoner>   rR  r;  r*  r;   r   rO  r  warningrP  r   r   r   rw   rz  r   ru   r   r   r&   r_  r   rt   r  
isinstancer3   r7  cancelRealTimeBarsreqRealTimeBarsr   barSize
whatToShowuseRTHrealTimeBarsOptionsr   cancelHistoricalDatareqHistoricalDatar  durationStrbarSizeSetting
formatDatekeepUpToDatechartOptions
errorEvent)rR   rK   r  r  r  	isRequestr   warningCodes	isWarningrW  r   r   r*  rX  r{  r   rP  r  s                     rT   r   zWrapper.errorC  s	    T]]*	 67A-I1IT1I		I &y731k%;-9 	 ''++E2\(,,CLLc"LLs#77--(	;GELLuL=LL'**AE'||~8C8M8MMFU..5,vsI ?HII$$X.LL((+;E7)CDGG,,11%8%%**51((--e4,,007H $$))(3#&&**51F!'$1 %1MM1b!QQ%@ $1 1 !'$1 %1MM1b!QQ%@ $1 1 $$&$$&##''/% ((,,U3D$011%8..4==$,,KK!9!9; D+.33E:004==$*:*:$$d&9&94??KK$2C2C%%	' 	y+xH5$1$1s   ,S;,T c                     t        j                  t        j                        | _        | j
                  D ]  }g |_        g |_        g |_         t               | _        y r   )
r   r   r   r   r   rt   r   r   r   rs   rR   r   s     rT   tcpDataArrivedzWrapper.tcpDataArrived  sM     X\\2)) 	!FFL!#F FO	! "erU   c                 >   | j                   j                  j                          | j                  rm| j                  D ].  }| j                  |_        |j                  j                  |       0 | j                   j                  j                  | j                         y y r   )r`   r   r   rt   r   r]  pendingTickersEventr  s     rT   tcpDataProcessedzWrapper.tcpDataProcessed  sz      "-- 0"mm""''/0 GG'',,T-@-@A	 rU   )NN)NTr   )r   )rh  )F)~rV   rW   rX   rY   rQ   re   r   r   r   r   rZ   r   r   r[   r   r@   r   r   r   OrderKeyTyper   r  r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r$  r<   r=   r<  r>  rA  rC  r;  r   rc  re  r   rf  rn  r   ro  bondContractDetailsrr  r	   r   ru  r1   ry  r|  r  r   r  r  r  r  r#   boolr  r$   r  r%   r  r  r  r  r6   r  r5   r  r  r(  r:  r?  rB  r   rE  rJ  rI  ri  r   rl  ro  rs  r|  r  r   r  r  r  r)   r  r  r  r  r  r  r  r  r  r"   r  r  r  r  r4   r  r   r  r   r  r  r   rU   rT   r^   r^   4   sV
   ;3j

1 (0<A#s(O" %S/ 
2
:
 s C $% $,u ," BC B3 00!$0030>A0&3 &00'*07:0AD0KN003 22(+2252>A22s 5$5/45CH55-25CH5 5 *-5 --*2-=B-- "'*7:%*5:
c 	#	#(-	#>C	#	#//#&/27/HM//',/0000*200;@00"00d#	4$	4-2	4@J	4( "%	*A*A(+*A5:*AGL*A*A),*A8;*A !*A -0*A ;>*A 	*AX&.&.(0&.=F&.PC 1A * # 3 5S 5? 5 * 22489L4M2D #D6:>6JD1C 1s 1
	.	.$'	.05	.=B	.IN	.	."'	..3	.<?	. C  g  s # /# /G /$,3 ,s ,  %).%9 AE   %)*>%? GK   %)*<%= EI A(A((+A(49A(AFA(F5(c 5(S 5( 5(nS (((+(36(?D(()7(((($'(38(DI((%*( /(4( (3 (% (A/ A/s A/3 A/F( ( (E (:99',9;>9!$9(D,01H,ID??(+?8;?CF?? %? HM(((+(:=(JM((#(+0(@D(. B B(+ B9< B B&+ B7< B  B   B (- B 6; B GL BDC 6J "S " "+S +""$'"," " '*" 8;" 	"0C 0$3 $tM/B $++(++>A+++.+=A#Y+ %[+# 54+= 5))*-)=@))&))69)% %3 %S %--$'-7:--&)- 11'*15811-S -S -( ((+:?"%7<  14 FK ',	&&-0&?B&&%)*;%<&& & &&# & &c C S n1E tJ'7 RIRI),RI;>RI%(RIh$BrU   r^   )VrY   r   ra   collectionsr   
contextlibr   r   r   typingr   r   r	   r
   r   r   r   r   ib_insync.contractr   r   r   r   r   ib_insync.objectsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   ib_insync.orderr<   r=   r>   r?   ib_insync.tickerr@   ib_insync.utilrA   rB   rC   rD   rE   rF   rG   rH   rZ   r  	ExceptionrJ   r^   r   rU   rT   <module>r	     s    *   #  '8 8 8 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 B A #7 7 7 S%S/)*9 &qB qBrU   