B
     9-e|M ã               @   sò   d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZ ddlT ddlmZ ddlmZm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 ddlT ddlT ddlmZ ddlm Z m!Z!m"Z" e #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.
é    N)ÚdecoderÚreaderÚcomm)Ú
Connection)ÚOUT)Ú*)ÚContract)ÚOrderÚ%COMPETE_AGAINST_BEST_OFFSET_UP_TO_MID)ÚExecutionFilter)ÚScannerSubscription)Ú
make_fieldÚmake_field_handle_empty)Úcurrent_fn_nameÚ
BadMessage)ÚClientException)Úorder_converterÚcontract_converterÚscannerSubscription_converterc               @   s‚  e Zd Zedƒ\ZZZZdd„ Zdñdd„Z	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ Zdò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ed%œd&d'„Zd(d)„ Zeeeeee d*œd+d,„Z!ed-œd.d/„Z"ed0œd1d2„Z#eed3œd4d5„Z$ed6œd7d8„Z%eeeeed9œd:d;„Z&ed-œd<d=„Z'eee(e(e d>œd?d@„Z)ed-œdAdB„Z*eee(e(e dCœdDdE„Z+ed-œdFdG„Z,eeeeeedHœdIdJ„Z-e.ee/dKœdLdM„Z0e.edNœdOdP„Z1dQdR„ Z2edSœdTdU„Z3dVdW„ Z4dXdY„ Z5edZœd[d\„Z6eed]œd^d_„Z7eeed`œdadb„Z8ed-œdcdd„Z9dedf„ Z:dgdh„ Z;eeediœdjdk„Z<ed-œdldm„Z=eeeednœdodp„Z>ed-œdqdr„Z?eeediœdsdt„Z@ed-œdudv„ZAeeeedwœdxdy„ZBed-œdzd{„ZCeeDd|œd}d~„ZEeedœd€d„ZFd‚dƒ„ ZGeeeee d„œd…d†„ZHeed‡œdˆd‰„ZIedŠœd‹dŒ„ZJddŽ„ ZKdd„ ZLeMd‘œd’d“„ZNeeMed”œd•d–„ZOeeeeeeeeee d—œ
d˜d™„ZPed-œdšd›„ZQeeeeedœœddž„ZRed-œdŸd „ZSeeeed¡œd¢d£„ZTed¤œd¥d¦„ZUeeeeeeeee d§œ	d¨d©„ZVdªd«„ ZWeeXe e d¬œd­d®„ZYed-œd¯d°„ZZeeeeee d±œd²d³„Z[ed-œd´dµ„Z\eeee d¶œd·d¸„Z]ed-œd¹dº„Z^d»d¼„ Z_eeee d½œd¾d¿„Z`eeeeeee dÀœdÁdÂ„Zaed-œdÃdÄ„ZbeedÅœdÆdÇ„ZceedÈœdÉdÊ„Zded-œdËdÌ„ZeeedÍœdÎdÏ„ZfedÐœdÑdÒ„ZgeeedÓœdÔdÕ„ZheedÖœd×dØ„ZieeeeedÙœdÚdÛ„Zjed-œdÜdÝ„ZkdÞdß„ Zleedàœdádâ„Zmedãœdädå„Zned-œdædç„Zoed-œdèdé„Zpeeqdêœdëdì„Zred-œdídî„Zsed-œdïdð„ZtdS )óÚEClienté   c             C   s*   t  ¡ | _|| _d | _|  t› d¡ d S )Nz	.__init__)ÚqueueÚQueueÚ	msg_queueÚwrapperr   ÚresetÚ__name__)Úselfr   © 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\client.pyÚ__init__-   s    
zEClient.__init__Nc             C   sf   t  t› d|› ¡ d| _d | _d| _d | _d | _d | _d| _	d| _
d | _d | _|  tj¡ d | _d S )Nz::reset: caller=r   FÚ )ÚloggingÚdebugr   ÚnKeybIntHardÚconnÚ	extraAuthÚserverVersion_ÚconnTimeÚ	connStateÚoptCapabÚasynchronousr   ÚdecodeÚsetConnStater   ÚDISCONNECTEDÚconnectionOptions)r   Úcallerr   r   r   r   3   s    zEClient.resetc             C   s*   | j }|| _ t dt| ƒ|| j f ¡ d S )Nz%s connState: %s -> %s)r)   Úloggerr#   Úid)r   r)   Z
_connStater   r   r   r-   C   s    zEClient.setConnStatec             C   s.   t  |¡}t ddtdƒ|¡ | j |¡ d S )Nz%s %s %sZSENDINGé   )r   Úmake_msgr1   Úinfor   r%   ÚsendMsg)r   ÚmsgZfull_msgr   r   r   r6   I   s    
zEClient.sendMsgc             C   s>   t  tj¡r:d|kr$t|ƒ}|d= n|}t  d||f ¡ d S )Nr   zREQUEST %s %s)r1   ÚisEnabledForr"   ÚINFOÚdictr5   )r   ZfnNameZfnParamsZprmsr   r   r   Ú
logRequestO   s    zEClient.logRequestc          
   C   sÂ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS y>d}t
tjƒt
|ƒ t
| jƒ }|  ¡ tkrr|t
| jƒ7 }W n> tk
r² } z | j t|j|j	|j d¡ dS d}~X Y nX |  |¡ dS )z`  Initiates the message exchange between the client application and
        the TWS/IB Gateway. r!   Né   )r;   r   ÚvarsÚisConnectedr   ÚerrorÚNO_VALID_IDÚNOT_CONNECTEDÚcoder7   r   r   Z	START_APIÚclientIdÚserverVersionZ$MIN_SERVER_VER_OPTIONAL_CAPABILITIESr*   r   Útextr6   )r   ÚVERSIONr7   Úexr   r   r   ÚstartApiY   s    zEClient.startApic          	   C   sx  y|| _ || _|| _t d| j | j| j¡ t| j | jƒ| _| j ¡  |  t	j
¡ d}dttf }| jrv|d | j }t |¡}t d|¡ t |d¡| }t d|¡ | j |¡ t | j|  ¡ ¡| _g }d}	d	}
xºt|ƒd
krŽ|	|
krŽ|	d	7 }	| j |¡ | j ¡ }| j ¡ s6t d¡ |  t› d¡ dS t d|¡ t|ƒdkrˆt |¡\}}}t d|||¡ t |¡}t d|¡ qÖg }qÖW |	|
kr¢t dƒ‚|\}}t!|ƒ}t d||¡ || _"|| _#|  ¡ | j_|  t	j$¡ t% &| j| j'¡| _%| j% (¡  t )d¡ |  *¡  | j +¡  W nT t,j-k
rr   | jrT| j -t.t/ 0¡ t/ 1¡ d¡ t )d¡ |  2t› d¡ Y nX dS )a¹  This function must be called before any other. There is no
        feedback for a successful connection, but a subsequent attempt to
        connect will return the message "Already connected."

        host:str - The host name or IP address of the machine where TWS is
            running. Leave blank to connect to the local host.
        port:int - Must match the port specified in TWS on the
            Configure>API>Socket Port field.
        clientId:int - A number used to identify this client connection. All
            orders placed/modified from this client will be associated with
            this client identifier.

            Note: Each client MUST connect with a unique clientId.zConnecting to %s:%d w/ id:%dzAPI zv%d..%dú zmsg %sÚasciiz
REQUEST %sr   r3   r<   z"Disconnected; resetting connectionz	::connectNz	ANSWER %szsize:%d msg:%s rest:%s|z	fields %szConnection failedzANSWER Version:%d time:%szsent startApir!   zcould not connect)3ÚhostÚportrC   r1   r#   r   r%   Úconnectr-   r   Ú
CONNECTINGZMIN_CLIENT_VERZMAX_CLIENT_VERr/   r   r4   ÚstrÚencoder6   r   ZDecoderr   rD   ÚlenÚ	interpretZrecvMsgr>   Úwarningr   r   Zread_msgÚread_fieldsÚRuntimeErrorÚintr(   r'   Ú	CONNECTEDr   ZEReaderr   Ústartr5   rH   Z
connectAckÚsocketr?   r@   ZCONNECT_FAILrB   r7   Ú
disconnect)r   rK   rL   rC   Z
v100prefixZv100versionr7   Úmsg2ÚfieldsÚcountZCOUNT_THRESHOLDÚbufÚsizeÚrestÚserver_versionZ	conn_timer   r   r   rM   u   sn    








zEClient.connectc             C   s\   t  t› d|› ¡ |  tj¡ | jdk	rXt  d¡ | j ¡  | j	 
¡  |  t› d¡ dS )z“Call this function to terminate the connections with TWS.
        Calling this function does not cancel orders that have already been
        sent.z::disconnect: caller=NZdisconnectingz::disconnect)r1   r#   r   r-   r   r.   r%   r5   rZ   r   ZconnectionClosedr   )r   r0   r   r   r   rZ   Î   s    



zEClient.disconnectc             C   s>   | j o| j  ¡ }t dt| ƒ| jt|ƒf ¡ tj| jko<|S )z=Call this function to check if there is a connection with TWSz %s isConn: %s, connConnected: %s)	r%   r>   r1   r#   r2   r)   rO   r   rW   )r   ZconnConnectedr   r   r   r>   Û   s    zEClient.isConnectedc             C   s   d S )Nr   )r   r   r   r   ÚkeyboardInterruptã   s    zEClient.keyboardInterruptc             C   s"   |  j d7  _ | j dkrtƒ ‚d S )Nr3   é   )r$   Ú
SystemExit)r   r   r   r   ÚkeyboardInterruptHardç   s    
zEClient.keyboardInterruptHardc             C   s
   || _ d S )N)r/   )r   Úoptsr   r   r   ÚsetConnectionOptionsì   s    zEClient.setConnectionOptionsc             C   s   d S )Nr   )r   r   r   r   Ú
msgLoopTmoï   s    zEClient.msgLoopTmoc             C   s   d S )Nr   )r   r   r   r   Ú
msgLoopRecó   s    zEClient.msgLoopRecc          
   C   sF  z,x$|   ¡ s| j ¡ s*y¢yJ| jjddd}t|ƒtkrf| j tt	 
¡ dt	 ¡ t|ƒ|f d¡ P W n( tjk
r   t d¡ |  ¡  Y n,X t |¡}t d|¡ | j |¡ |  ¡  W nP ttfk
rð   t d¡ |  ¡  |  ¡  Y n  tk
r   t d	¡ Y nX t d
|   ¡ | j ¡ ¡ qW W d|  t› d¡ X dS )z/This is the function that has the message loop.Tgš™™™™™É?)ÚblockÚtimeoutz%s:%d:%sr!   zqueue.get: emptyz	fields %sz&detected KeyboardInterrupt, SystemExitr   zconn:%d queue.sz:%dNz::run)r>   r   ÚemptyÚgetrQ   ZMAX_MSG_LENr   r?   r@   Z
BAD_LENGTHrB   r7   r   ÚEmptyr1   r#   rh   r   rT   r   rR   ri   ÚKeyboardInterruptrd   r5   rb   re   r   ÚqsizerZ   r   )r   rE   r\   r   r   r   Úrun÷   s4    


zEClient.runc             C   sZ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ }|  |¡ dS )z0Asks the current system time on the server side.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ÚREQ_CURRENT_TIMEr6   )r   rF   r7   r   r   r   ÚreqCurrentTime  s    
zEClient.reqCurrentTimec             C   s   | j S )zZReturns the version of the TWS instance to which the API
        application is connected.)r'   )r   r   r   r   rD   +  s    zEClient.serverVersion)ÚlogLevelc             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
|ƒ }|  |¡ dS )zMThe default detail level is ERROR. For more details, see API
        Logging.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZSET_SERVER_LOGLEVELr6   )r   rt   rF   r7   r   r   r   ÚsetServerLogLevel2  s    zEClient.setServerLogLevelc             C   s   | j S )z>Returns the time the API application made a connection to TWS.)r(   )r   r   r   r   ÚtwsConnectionTimeF  s    zEClient.twsConnectionTime)ÚreqIdÚcontractÚgenericTickListÚsnapshotÚregulatorySnapshotÚmktDataOptionsc             C   s  t |ƒ}t|ƒ}|  tƒ tƒ ¡ |  ¡ sF| j |t 	¡ t 
¡ d¡ dS |  ¡ tk rz|jrz| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk r²|jdkr²| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk ræ|jræ| j |t 	¡ t 
¡ d d¡ dS yàd}g }|ttjƒt|ƒt|ƒg7 }|  ¡ tkr,|t|jƒg7 }|t|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒg
7 }|  ¡ tkr¢|t|jƒg7 }|jdkr|j rÀt!|j ƒnd}	|t|	ƒg7 }x8|j D ].}
|t|
jƒt|
j"ƒt|
j#ƒt|
jƒg7 }qÚW |  ¡ tkr^|jrP|td	ƒt|jjƒt|jj$ƒt|jj%ƒg7 }n|td
ƒg7 }|t|ƒt|ƒg7 }|  ¡ t&krŽ|t|ƒg7 }|  ¡ t'kr¼|rªt(dƒ‚d}|t|ƒg7 }d )|¡}W n@ t*k
r } z | j ||j	|j
|j+ d¡ dS d}~X Y nX |  ,|¡ dS )aà  Call this function to request market data. The market data
        will be returned by the tickPrice and tickSize events.

        reqId: TickerId - The ticker id. Must be a unique value. When the
            market data returns, it will be identified by this tag. This is
            also used when canceling the market data.
        contract:Contract - This structure contains a description of the
            Contractt for which market data is being requested.
        genericTickList:str - A commma delimited list of generic tick types.
            Tick types can be found in the Generic Tick Types page.
            Prefixing w/ 'mdoff' indicates that top mkt data shouldn't tick.
            You can specify the news source by postfixing w/ ':<source>.
            Example: "mdoff,292:FLY+BRF"
        snapshot:bool - Check to return a single snapshot of Market data and
            have the market data subscription cancel. Do not enter any
            genericTicklist values if you use snapshots.
        regulatorySnapshot: bool - With the US Value Snapshot Bundle for stocks,
            regulatory snapshots are available for 0.01 USD each.
        mktDataOptions:TagValueList - For internal use only.
            Use default value XYZ. r!   Nz+  It does not support delta-neutral orders.r   z&  It does not support conId parameter.z;  It does not support tradingClass parameter in reqMktData.é   ÚBAGTFznot supported)-r   rO   r;   r   r=   r>   r   r?   rA   rB   r7   rD   ÚMIN_SERVER_VER_DELTA_NEUTRALÚdeltaNeutralContractÚ
UPDATE_TWSZ!MIN_SERVER_VER_REQ_MKT_DATA_CONIDÚconIdÚMIN_SERVER_VER_TRADING_CLASSÚtradingClassr   r   ÚREQ_MKT_DATAÚsymbolÚsecTypeÚlastTradeDateOrContractMonthÚstrikeÚrightÚ
multiplierÚexchangeÚprimaryExchangeÚcurrencyÚlocalSymbolÚ	comboLegsrQ   ÚratioÚactionÚdeltaÚpriceÚ#MIN_SERVER_VER_REQ_SMART_COMPONENTSÚMIN_SERVER_VER_LINKINGÚNotImplementedErrorÚjoinr   rE   r6   )r   rw   rx   ry   rz   r{   r|   rF   ÚfldsÚcomboLegsCountÚcomboLegÚmktDataOptionsStrr7   rG   r   r   r   Ú
reqMktDataT  sŽ    





zEClient.reqMktData)rw   c             C   sr   |   tƒ tƒ ¡ |  ¡ s6| j |t ¡ t ¡ d¡ dS d}g }|t	t
jƒt	|ƒt	|ƒg7 }d |¡}|  |¡ dS )z·After calling this function, market data for the specified id
        will stop flowing.

        reqId: TickerId - The ID that was specified in the call to
            reqMktData(). r!   Nr<   )r;   r   r=   r>   r   r?   rA   rB   r7   r   r   ZCANCEL_MKT_DATAr˜   r6   )r   rw   rF   r™   r7   r   r   r   ÚcancelMktDataÍ  s    

zEClient.cancelMktData)ÚmarketDataTypec             C   s    |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rd| j tt ¡ t 	¡ d d¡ dS d}g }|ttjƒt|ƒt|ƒg7 }d |¡}|  |¡ dS )a@  The API can receive frozen market data from Trader
        Workstation. Frozen market data is the last data recorded in our system.
        During normal trading hours, the API receives real-time market data. If
        you use this function, you are telling TWS to automatically switch to
        frozen market data after the close. Then, before the opening of the next
        trading day, market data will automatically switch back to real-time
        market data.

        marketDataType:int - 1 for real-time streaming market data or 2 for
            frozen market datar!   Nz0  It does not support market data type requests.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z#MIN_SERVER_VER_REQ_MARKET_DATA_TYPEr   r   r   ZREQ_MARKET_DATA_TYPEr˜   r6   )r   rŸ   rF   r™   r7   r   r   r   ÚreqMarketDataTypeæ  s    

zEClient.reqMarketDataType)rw   ÚbboExchangec          
   C   sÐ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rd| j tt ¡ t 	¡ d d¡ d S yttjƒt|ƒ t|ƒ }W n> tk
rÀ } z | j ||j|j	|j d¡ d S d }~X Y nX |  |¡ d S )Nr!   z/  It does not support smart components request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r•   r   r   r   ZREQ_SMART_COMPONENTSr   rE   r6   )r   rw   r¡   r7   rG   r   r   r   ÚreqSmartComponents  s    
zEClient.reqSmartComponents)ÚmarketRuleIdc             C   s„   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rd| j tt ¡ t 	¡ d d¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z* It does not support market rule requests.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ZMIN_SERVER_VER_MARKET_RULESr   r   r   ZREQ_MARKET_RULEr6   )r   r£   r7   r   r   r   ÚreqMarketRule!  s    

zEClient.reqMarketRule)rw   rx   ÚtickTypeÚnumberOfTicksÚ
ignoreSizec          
   C   sš  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rd| j tt ¡ t 	¡ d d¡ d S |  
¡ tk r’| j tt ¡ t 	¡ d d¡ d S y¸ttjƒt|ƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|jƒ t|ƒ }|  
¡ tkrH|t|ƒt|ƒ 7 }W n@ tk
rŠ } z | j ||j|j	|j d¡ d S d }~X Y nX |  |¡ d S )Nr!   z0 It does not support tick-by-tick data requests.z[ It does not support ignoreSize and numberOfTicks parameters in tick-by-tick data requests.) r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ÚMIN_SERVER_VER_TICK_BY_TICKr   Z'MIN_SERVER_VER_TICK_BY_TICK_IGNORE_SIZEr   r   ZREQ_TICK_BY_TICK_DATAr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r„   r   rE   r6   )r   rw   rx   r¥   r¦   r§   r7   rG   r   r   r   ÚreqTickByTickData2  s,    
’zEClient.reqTickByTickDatac             C   s„   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rd| j tt ¡ t 	¡ d d¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z0 It does not support tick-by-tick data requests.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r¨   r   r   r   ZCANCEL_TICK_BY_TICK_DATAr6   )r   rw   r7   r   r   r   ÚcancelTickByTickDataa  s    

zEClient.cancelTickByTickData)rw   rx   ÚoptionPriceÚ
underPriceÚimplVolOptionsc             C   s  t |ƒ}|  tƒ tƒ ¡ |  ¡ s>| j |t ¡ t 	¡ d¡ dS |  
¡ tk rl| j |t ¡ t 	¡ d d¡ dS |  
¡ tk r |jr | j |t ¡ t 	¡ d d¡ dS yd}g }|ttjƒt|ƒt|ƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒg7 }|  
¡ tkr>|t|jƒg7 }|t|ƒt|ƒg7 }|  
¡ tkr¬d}|rrt|ƒnd}	|r˜x|D ]}
|t|
ƒ7 }q‚W |t|	ƒt|ƒg7 }d  |¡}W n@ t!k
rø } z | j ||j|j	|j" d¡ dS d}~X Y nX |  #|¡ dS )au  Call this function to calculate volatility for a supplied
        option price and underlying price. Result will be delivered
        via EWrapper.tickOptionComputation()

        reqId:TickerId -  The request id.
        contract:Contract -  Describes the contract.
        optionPrice:double - The price of the option.
        underPrice:double - Price of the underlying.r!   Nz5  It does not support calculateImpliedVolatility req.zK  It does not support tradingClass parameter in calculateImpliedVolatility.é   r   )$r   r;   r   r=   r>   r   r?   rA   rB   r7   rD   Ú%MIN_SERVER_VER_REQ_CALC_IMPLIED_VOLATr   rƒ   r„   r   r   ZREQ_CALC_IMPLIED_VOLATr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r–   rQ   rO   r˜   r   rE   r6   )r   rw   rx   r«   r¬   r­   rF   r™   ZimplVolOptStrÚtagValuesCountÚ
implVolOptr7   rG   r   r   r   ÚcalculateImpliedVolatilityv  s`    



z"EClient.calculateImpliedVolatilityc             C   s   |   tƒ tƒ ¡ |  ¡ s6| j |t ¡ t ¡ d¡ dS |  	¡ t
k rd| j |t ¡ t ¡ d d¡ dS d}ttjƒt|ƒ t|ƒ }|  |¡ dS )z¤Call this function to cancel a request to calculate
        volatility for a supplied option price and underlying price.

        reqId:TickerId - The request ID.  r!   Nz5  It does not support calculateImpliedVolatility req.r3   )r;   r   r=   r>   r   r?   rA   rB   r7   rD   r¯   r   r   r   ZCANCEL_CALC_IMPLIED_VOLATr6   )r   rw   rF   r7   r   r   r   Ú cancelCalculateImpliedVolatilityÀ  s    
z(EClient.cancelCalculateImpliedVolatility)rw   rx   Ú
volatilityr¬   ÚoptPrcOptionsc             C   s   |   tƒ tƒ ¡ |  ¡ s6| j |t ¡ t ¡ d¡ dS |  	¡ t
k rd| j |t ¡ t ¡ d d¡ dS |  	¡ tk r˜|jr˜| j |t ¡ t ¡ d d¡ dS yd}g }|ttjƒt|ƒt|ƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒg7 }|  	¡ tkr6|t|jƒg7 }|t|ƒt|ƒg7 }|  	¡ tkr¤d}|rjt|ƒnd}	|rx|D ]}
|t|
ƒ7 }qzW |t|	ƒt|ƒg7 }d |¡}W n@ t k
rð } z | j ||j|j|j! d¡ dS d}~X Y nX |  "|¡ dS )a6  Call this function to calculate option price and greek values
        for a supplied volatility and underlying price.

        reqId:TickerId -    The ticker ID.
        contract:Contract - Describes the contract.
        volatility:double - The volatility.
        underPrice:double - Price of the underlying.r!   Nz5  It does not support calculateImpliedVolatility req.zK  It does not support tradingClass parameter in calculateImpliedVolatility.r®   r   )#r;   r   r=   r>   r   r?   rA   rB   r7   rD   r¯   r   rƒ   r„   r   r   ZREQ_CALC_OPTION_PRICEr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r–   rQ   rO   r˜   r   rE   r6   )r   rw   rx   r´   r¬   rµ   rF   r™   ZoptPrcOptStrr°   r±   r7   rG   r   r   r   ÚcalculateOptionPriceÚ  s^    



zEClient.calculateOptionPricec             C   s   |   tƒ tƒ ¡ |  ¡ s6| j |t ¡ t ¡ d¡ dS |  	¡ t
k rd| j |t ¡ t ¡ d d¡ dS d}ttjƒt|ƒ t|ƒ }|  |¡ dS )z¹Call this function to cancel a request to calculate the option
        price and greek values for a supplied volatility and underlying price.

        reqId:TickerId - The request ID.  r!   Nz5  It does not support calculateImpliedVolatility req.r3   )r;   r   r=   r>   r   r?   rA   rB   r7   rD   r¯   r   r   r   ZCANCEL_CALC_OPTION_PRICEr6   )r   rw   rF   r7   r   r   r   ÚcancelCalculateOptionPrice#  s    
z"EClient.cancelCalculateOptionPrice)rw   rx   ÚexerciseActionÚexerciseQuantityÚaccountÚoverridec             C   s–  |   tƒ tƒ ¡ |  ¡ s6| j |t ¡ t ¡ d¡ dS |  	¡ t
k rj|jrj| j |t ¡ t ¡ d d¡ dS yÜd}g }|ttjƒt|ƒt|ƒg7 }|  	¡ t
kr¬|t|jƒg7 }|t|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒg	7 }|  	¡ t
kr|t|jƒg7 }|t|ƒt|ƒt|ƒt|ƒg7 }d |¡}	W n@ tk
r† }
 z | j ||
j|
j|
j d¡ dS d}
~
X Y nX |  |	¡ dS )ah  reqId:TickerId - The ticker id. multipleust be a unique value.
        contract:Contract - This structure contains a description of the
            contract to be exercised
        exerciseAction:int - Specifies whether you want the option to lapse
            or be exercised.
            Values are 1 = exercise, 2 = lapse.
        exerciseQuantity:int - The quantity you want to exercise.
        account:str - destination account
        override:int - Specifies whether your setting will override the system's
            natural action. For example, if your action is "exercise" and the
            option is not in-the-money, by natural action the option would not
            exercise. If you have override set to "yes" the natural action would
             be overridden and the out-of-the money option would be exercised.
            Values are: 0 = no, 1 = yes.r!   NzS  It does not support conId, multiplier, tradingClass parameter in exerciseOptions.r<   )r;   r   r=   r>   r   r?   rA   rB   r7   rD   rƒ   r„   r   r   r   ZEXERCISE_OPTIONSr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   rŽ   r   r˜   r   rE   r6   )r   rw   rx   r¸   r¹   rº   r»   rF   r™   r7   rG   r   r   r   ÚexerciseOptions=  sJ    


zEClient.exerciseOptions)ÚorderIdrx   Úorderc             C   sø  t |ƒ}t|ƒ}|  tƒ tƒ ¡ |  ¡ sF| j |t 	¡ t 
¡ d¡ dS |  ¡ tk rz|jrz| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk r²|jtkr²| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk ræ|jræ| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk r|jr| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk r^|js<|jr^| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk r¢|jr¢|jdkr¢| j |t 	¡ t 
¡ d	 d¡ dS |  ¡ tk rÞ|jd
krÞ| j |t 	¡ t 
¡ d d¡ dS |  ¡ tk r4|jr4x>|jD ]4}|jd
krü| j |t 	¡ t 
¡ d d¡ dS qüW |  ¡ tk rl|jrl| j |t 	¡ t 
¡ d d¡ dS |  ¡ t k r¤|j!r¤| j |t 	¡ t 
¡ d d¡ dS |  ¡ t"k rø|j#dksÖ|j$sÖ|j%sÖ|j&rø| j |t 	¡ t 
¡ d d¡ dS |  ¡ t'k rL|j(s*|j)s*|j*dks*|j+rL| j |t 	¡ t 
¡ d d¡ dS |  ¡ t,k rä|j-dkrä|j-t.krä|j/t.ks¾|j0tks¾|j1t.ks¾|j2s¾|j3tks¾|j4tks¾|j5rä| j |t 	¡ t 
¡ d d d¡ dS |  ¡ t6k rF|j7dkrF|j8rFx>|j8D ]4}|j9t.kr| j |t 	¡ t 
¡ d d¡ dS qW |  ¡ t:k r‚|j;t.kr‚| j |t 	¡ t 
¡ d d¡ dS |  ¡ t<k rº|j=rº| j |t 	¡ t 
¡ d d¡ dS |  ¡ t>k r|j?sà|j@sà|jAr| j |t 	¡ t 
¡ d d¡ dS |  ¡ tBk r:|jCr:| j |t 	¡ t 
¡ d d¡ dS |  ¡ tDk rr|jErr| j |t 	¡ t 
¡ d d¡ dS |  ¡ tFk rª|jGrª| j |t 	¡ t 
¡ d d¡ dS |  ¡ tHk râ|jIrâ| j |t 	¡ t 
¡ d d¡ dS |  ¡ tJk r&|jKjLs|jKjMr&| j |t 	¡ t 
¡ d d¡ dS |  ¡ tNk r^|jOr^| j |t 	¡ t 
¡ d d¡ dS |  ¡ tPk r¦|jQdks„|jRdkr¦| j |t 	¡ t 
¡ d d¡ dS |  ¡ tSk rî|jTdksÌ|jUdkrî| j |t 	¡ t 
¡ d d¡ dS |  ¡ tVk r&|jWr&| j |t 	¡ t 
¡ d d¡ dS |  ¡ tXk r^|jYr^| j |t 	¡ t 
¡ d  d¡ dS |  ¡ tZk r–|j[r–| j |t 	¡ t 
¡ d! d¡ dS |  ¡ t\k rÒ|j]tkrÒ| j |t 	¡ t 
¡ d" d¡ dS |  ¡ t^k r|j_tkr| j |t 	¡ t 
¡ d# d¡ dS |  ¡ t`k rF|jarF| j |t 	¡ t 
¡ d$ d¡ dS |  ¡ tbk r~|jcr~| j |t 	¡ t 
¡ d% d¡ dS |  ¡ tdk r¶|jer¶| j |t 	¡ t 
¡ d& d¡ dS |  ¡ tfk 	r&|jgtk	s |jhtk	s |jit.k	s |jjt.k	s |jkt.k	r&| j |t 	¡ t 
¡ d' d( d¡ dS y€|  ¡ tk 	r<d)nd*}g }|tltmjnƒg7 }|  ¡ tXk 	rp|tl|ƒg7 }|tl|ƒg7 }|  ¡ tk	rœ| otl|jƒ¡ |tl|jpƒtl|j7ƒtl|jqƒtl|jrƒtl|jsƒtl|jtƒtl|juƒtl|jvƒtl|jwƒtl|jxƒg
7 }|  ¡ t<k
r| otl|j=ƒ¡ |  ¡ tk
r8|tl|jƒtl|jƒg7 }| otl|jyƒ¡ |  ¡ tzk
rh| otl|j{ƒ¡ n| otlt||j{ƒƒ¡ | otl|j}ƒ¡ |  ¡ t6k 
r¼| otl|j~t.k
r²|j~ndƒ¡ n| ot|j~ƒ¡ |  ¡ t:k 
rü| otl|j€t.k
rò|j€ndƒ¡ nˆ| ot|j€ƒ¡ |tl|jƒtl|j‚ƒtl|jƒƒtl|j„ƒtl|j…ƒtl|j†ƒtl|j‡ƒtl|jˆƒtl|j‰ƒtl|jŠƒtl|j‹ƒtl|jŒƒtl|jƒtl|jŽƒg7 }|j7dkr8|jr¢t|jƒnd}| otl|ƒ¡ |dkr8xx|jD ]n}|sÔt‚|tl|jƒtl|j‘ƒtl|jyƒtl|juƒtl|j„ƒtl|j’ƒtl|j“ƒg7 }|  ¡ t”krÆ| otl|jƒ¡ qÆW |  ¡ t6kr¨|j7dkr¨|j8rdt|j8ƒnd}	| otl|	ƒ¡ |	r¨x*|j8D ] }|s’t‚| ot|j9ƒ¡ q„W |  ¡ t•kr|j7dkr|j–rÔt|j–ƒnd}
| otl|
ƒ¡ |
dkrx(|j–D ]}|tl|j—ƒtl|j˜ƒg7 }qøW |tldƒtl|j™ƒtl|jšƒtl|j›ƒtl|jœƒtl|jƒtl|jžƒtl|jŸƒg7 }|  ¡ tFkr~| otl|jGƒ¡ |tl|j’ƒtl|j“ƒg7 }|  ¡ t”kr´| otl|jƒ¡ | otl|j ƒ¡ |tl|j¡ƒtl|j¢ƒtl|j£ƒt|j¤ƒt|j¥ƒtld+ƒtld+ƒtt.ƒtl|j¦ƒt|j§ƒt|j¨ƒt|j©ƒt|jªƒt|j«ƒtl|j¬ƒt|j­ƒt|j®ƒtl|j¯ƒt|j°ƒg7 }|  ¡ t"krœ|j¯rœ|tl|j#ƒtl|j$ƒtl|j%ƒtl|j&ƒg7 }|  ¡ t'krÚ|j¯rÚ|tl|j(ƒtl|j)ƒtl|j*ƒtl|j+ƒg7 }|tl|j±ƒt|j²ƒt|j³ƒg7 }|  ¡ t:kr| ot|j;ƒ¡ |  ¡ tkr@|t|j´ƒt|jƒg7 }n|tldƒt|j´ƒg7 }| ot|j-ƒ¡ |  ¡ t,krÌ|j-t.krÌ|j-d,krÌ|t|j/ƒt|j0ƒt|j1ƒtl|j2ƒt|j3ƒt|j4ƒtl|j5ƒg7 }|  ¡ t>krú|tl|j?ƒtl|j@ƒtl|jAƒg7 }|  ¡ tkr0| otl|jƒ¡ |jr0| otl|jµƒ¡ |  ¡ t krN| otl|j!ƒ¡ |  ¡ t¶krt|tl|j·ƒtl|j¸ƒg7 }|  ¡ tkr’| otl|jƒ¡ |  ¡ tkrä|jrÖ|tld-ƒtl|jjƒtl|jj©ƒtl|jj9ƒg7 }n| otld+ƒ¡ |  ¡ tkrb| otl|jƒ¡ |jrb|j¹rt|j¹ƒnd}| otl|ƒ¡ |dkrbx(|j¹D ]}|tl|j—ƒtl|j˜ƒg7 }q@W |  ¡ tBkr€| otl|jCƒ¡ | otl|jºƒ¡ |  ¡ t»krÖd}|j¼rÈx|j¼D ]}|t½|ƒ7 }q²W | otl|ƒ¡ |  ¡ tDkrô| otl|jEƒ¡ |  ¡ t¾kr|tl|j¿ƒtl|jÀƒg7 }|  ¡ tÁkr|j}d.krd|tl|jÂƒtl|jÃƒtl|jÄƒtl|jÅƒtl|jÆƒg7 }| otlt|jÇƒƒ¡ t|jÇƒdkrÐx.|jÇD ]$}| otl| È¡ ƒ¡ || É¡ 7 }qW |tl|jÊƒtl|jËƒg7 }|tl|jÌƒtl|jÍƒtl|jÎƒtl|jÏƒtl|jÐƒtl|jÑƒtl|jÒƒg7 }|  ¡ tHkr.| otl|jIƒ¡ |  ¡ tJkrX|tl|jKjLƒtl|jKjMƒg7 }|  ¡ tNkrv| otl|jOƒ¡ |  ¡ tPkr¤| otl|jQƒ¡ | otl|jRƒ¡ |  ¡ tSkrÒ| otl|jTƒ¡ | otl|jUƒ¡ |  ¡ tVkrð| otl|jWƒ¡ |  ¡ tXkr| otl|jYƒ¡ |  ¡ tÓkr,| otl|jÔƒ¡ |  ¡ tZkrd| ot|j[dkrPtn|j[r\d/ndƒ¡ |  ¡ t\kr‚| otl|j]ƒ¡ |  ¡ t^kr | otl|j_ƒ¡ |  ¡ t`kr¾| otl|jaƒ¡ |  ¡ tbkrÜ| otl|jcƒ¡ |  ¡ tdkrú| otl|jeƒ¡ |  ¡ tfkrœd+}|jud0kr(| ot|jgƒ¡ |j}d1krf| ot|jhƒ¡ | ot|jiƒ¡ |jitÕkrvd-}n|j}d2krvd-}|rœ| ot|jjƒ¡ | ot|jkƒ¡ d Ö|¡}W n@ t×k
rè } z | j ||j	|j
|jØ d¡ dS d}~X Y nX |  Ù|¡ dS )3aH  Call this function to place an order. The order status will
        be returned by the orderStatus event.

        orderId:OrderId - The order id. You must specify a unique value. When the
            order START_APItus returns, it will be identified by this tag.
            This tag is also used when canceling the order.
        contract:Contract - This structure contains a description of the
            contract which is being traded.
        order:Order - This structure contains the details of tradedhe order.
            Note: Each client MUST connect with a unique clientId.r!   Nz+  It does not support delta-neutral orders.z=  It does not support Subsequent Level Size for Scale orders.z"  It does not support algo orders.z(  It does not support notHeld parameter.z5  It does not support secIdType and secId parameters.r   z&  It does not support conId parameter.éÿÿÿÿz+  It does not support exemptCode parameter.z#  It does not support hedge orders.z3  It does not support optOutSmartRouting parameter.zd  It does not support deltaNeutral parameters: ConId, SettlingFirm, ClearingAccount, ClearingIntent.zg  It does not support deltaNeutral parameters: OpenClose, ShortSale, ShortSaleSlot, DesignatedLocation.zU  It does not support Scale order parameters: PriceAdjustValue, PriceAdjustInterval, zDProfitOffset, AutoReset, InitPosition, InitFillQty and RandomPercentr~   z:  It does not support per-leg prices for order combo legs.z0  It does not support trailing percent parameterz;  It does not support tradingClass parameter in placeOrder.zO  It does not support scaleTable, activeStartTime and activeStopTime parametersz&  It does not support algoId parameterz0  It does not support order solicited parameter.z+  It does not support model code parameter.z,  It does not support ext operator parameterz% It does not support soft dollar tierz, It does not support cash quantity parameterz7 It does not support MIFID II decision maker parametersz2 It does not support MIFID II execution parametersz7 It does not support dontUseAutoPriceForHedge parameterz, It does not support oms container parameterz7 It does not support Use price management algo requestsz' It does not support duration attributez( It does not support postToAts attributez/ It does not support autoCancelParent attributez7  It does not support advanced error override attributez1  It does not support manual order time attributezX  It does not support PEG BEST / PEG MID order parameters: minTradeQty, minCompeteSize, z>competeAgainstBestOffset, midOffsetAtWhole and midOffsetAtHalfé   é-   Fg        Tz	PEG BENCHr3   ZIBKRATSzPEG BESTzPEG MID)Úr   r   r;   r   r=   r>   r   r?   rA   rB   r7   rD   r   r€   r   ZMIN_SERVER_VER_SCALE_ORDERS2ZscaleSubsLevelSizeÚUNSET_INTEGERZMIN_SERVER_VER_ALGO_ORDERSZalgoStrategyZMIN_SERVER_VER_NOT_HELDZnotHeldÚMIN_SERVER_VER_SEC_ID_TYPEÚ	secIdTypeÚsecIdZ MIN_SERVER_VER_PLACE_ORDER_CONIDr‚   ZMIN_SERVER_VER_SSHORTXZ
exemptCoder   ZMIN_SERVER_VER_HEDGE_ORDERSZ	hedgeTypeZ$MIN_SERVER_VER_OPT_OUT_SMART_ROUTINGZoptOutSmartRoutingZ"MIN_SERVER_VER_DELTA_NEUTRAL_CONIDZdeltaNeutralConIdZdeltaNeutralSettlingFirmZdeltaNeutralClearingAccountZdeltaNeutralClearingIntentZ'MIN_SERVER_VER_DELTA_NEUTRAL_OPEN_CLOSEZdeltaNeutralOpenCloseZdeltaNeutralShortSaleZdeltaNeutralShortSaleSlotZdeltaNeutralDesignatedLocationZMIN_SERVER_VER_SCALE_ORDERS3ZscalePriceIncrementZUNSET_DOUBLEZscalePriceAdjustValueZscalePriceAdjustIntervalZscaleProfitOffsetZscaleAutoResetZscaleInitPositionZscaleInitFillQtyZscaleRandomPercentZ%MIN_SERVER_VER_ORDER_COMBO_LEGS_PRICEr‡   ZorderComboLegsr”   ZMIN_SERVER_VER_TRAILING_PERCENTÚtrailingPercentrƒ   r„   ZMIN_SERVER_VER_SCALE_TABLEZ
scaleTableZactiveStartTimeZactiveStopTimeZMIN_SERVER_VER_ALGO_IDZalgoIdZMIN_SERVER_VER_ORDER_SOLICITEDZ	solicitedÚMIN_SERVER_VER_MODELS_SUPPORTÚ	modelCodeZMIN_SERVER_VER_EXT_OPERATORZextOperatorZMIN_SERVER_VER_SOFT_DOLLAR_TIERÚsoftDollarTierÚnameÚvalZMIN_SERVER_VER_CASH_QTYZcashQtyZMIN_SERVER_VER_DECISION_MAKERZmifid2DecisionMakerZmifid2DecisionAlgoZMIN_SERVER_VER_MIFID_EXECUTIONZmifid2ExecutionTraderZmifid2ExecutionAlgoZ#MIN_SERVER_VER_AUTO_PRICE_FOR_HEDGEZdontUseAutoPriceForHedgeZMIN_SERVER_VER_ORDER_CONTAINERZisOmsContainerZMIN_SERVER_VER_PRICE_MGMT_ALGOZusePriceMgmtAlgoZMIN_SERVER_VER_DURATIONÚdurationZMIN_SERVER_VER_POST_TO_ATSZ	postToAtsZ!MIN_SERVER_VER_AUTO_CANCEL_PARENTZautoCancelParentZ$MIN_SERVER_VER_ADVANCED_ORDER_REJECTZadvancedErrorOverrideÚ MIN_SERVER_VER_MANUAL_ORDER_TIMEZmanualOrderTimeZ%MIN_SERVER_VER_PEGBEST_PEGMID_OFFSETSZminTradeQtyZminCompeteSizeZcompeteAgainstBestOffsetZmidOffsetAtWholeZmidOffsetAtHalfr   r   ZPLACE_ORDERÚappendr†   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r’   Z#MIN_SERVER_VER_FRACTIONAL_POSITIONSÚtotalQuantityrV   Ú	orderTypeÚlmtPricer   ÚauxPriceÚtifÚocaGrouprº   Z	openCloseÚoriginÚorderRefÚtransmitÚparentIdZ
blockOrderZsweepToFillZdisplaySizeZtriggerMethodÚ
outsideRthÚhiddenrQ   ÚAssertionErrorr‘   ZshortSaleSlotZdesignatedLocationZMIN_SERVER_VER_SSHORTX_OLDZ)MIN_SERVER_VER_SMART_COMBO_ROUTING_PARAMSZsmartComboRoutingParamsÚtagÚvalueZdiscretionaryAmtZgoodAfterTimeZgoodTillDateZfaGroupZfaMethodZfaPercentageZ	faProfileÚocaTypeZrule80AZsettlingFirmZ	allOrNoneZminQtyZpercentOffsetZauctionStrategyZstartingPriceZstockRefPricer“   ZstockRangeLowerZstockRangeUpperZoverridePercentageConstraintsr´   ZvolatilityTypeZdeltaNeutralOrderTypeZdeltaNeutralAuxPriceZcontinuousUpdateZreferencePriceTypeÚtrailStopPriceZscaleInitLevelSizeZ
hedgeParamZMIN_SERVER_VER_PTA_ORDERSZclearingAccountZclearingIntentZ
algoParamsZwhatIfr–   ZorderMiscOptionsrO   Z'MIN_SERVER_VER_RANDOMIZE_SIZE_AND_PRICEZrandomizeSizeZrandomizePriceZ"MIN_SERVER_VER_PEGGED_TO_BENCHMARKZreferenceContractIdZisPeggedChangeAmountDecreaseZpeggedChangeAmountZreferenceChangeAmountZreferenceExchangeIdÚ
conditionsÚtypeZmake_fieldsZconditionsIgnoreRthZconditionsCancelOrderZadjustedOrderTypeZtriggerPriceZlmtPriceOffsetZadjustedStopPriceZadjustedStopLimitPriceZadjustedTrailingAmountZadjustableTrailingUnitZMIN_SERVER_VER_D_PEG_ORDERSZdiscretionaryUpToLimitPricer
   r˜   r   rE   r6   )r   r½   rx   r¾   r›   ZorderComboLegrF   r™   rš   ZorderComboLegsCountZsmartComboRoutingParamsCountÚtagValueZalgoParamsCountZ	algoParamZmiscOptionsStrÚcondZsendMidOffsetsr7   rG   r   r   r   Ú
placeOrder„  sx   


























&
&






























*zEClient.placeOrder)r½   ÚmanualCancelOrderTimec             C   sÎ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rh|rh| j |t ¡ t 	¡ d d¡ dS d}g }|ttjƒg7 }|t|ƒg7 }|t|ƒg7 }|  
¡ tkr¶|t|ƒg7 }d |¡}|  |¡ dS )z”Call this function to cancel an order.

        orderId:OrderId - The order ID that was specified previously in the call
            to placeOrder()r!   Nz8  It does not support manual order cancel time attributer3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rÍ   r   r   r   ZCANCEL_ORDERr˜   r6   )r   r½   rå   rF   r™   r7   r   r   r   ÚcancelOrderØ  s     
zEClient.cancelOrderc             C   sZ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ }|  |¡ dS )aÔ  Call this function to request the open orders that were
        placed from this client. Each open order will be fed back through the
        openOrder() and orderStatus() functions on the EWrapper.

        Note:  The client with a clientId of 0 will also receive the TWS-owned
        open orders. These orders will be associated with the client and a new
        orderId will be generated. This association will persist over multiple
        API and TWS sessions.  r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_OPEN_ORDERSr6   )r   rF   r7   r   r   r   ÚreqOpenOrders÷  s    

zEClient.reqOpenOrders)Ú	bAutoBindc             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
|ƒ }|  |¡ dS )a  Call this function to request that newly created TWS orders
        be implicitly associated with the client. When a new TWS order is
        created, the order will be associated with the client, and fed back
        through the openOrder() and orderStatus() functions on the EWrapper.

        Note:  This request can only be made from a client with clientId of 0.

        bAutoBind: If set to TRUE, newly created TWS orders will be implicitly
        associated with the client. If set to FALSE, no association will be
        made.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_AUTO_OPEN_ORDERSr6   )r   rè   rF   r7   r   r   r   ÚreqAutoOpenOrders  s    zEClient.reqAutoOpenOrdersc             C   sZ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ }|  |¡ dS )a4  Call this function to request the open orders placed from all
        clients and also from TWS. Each open order will be fed back through the
        openOrder() and orderStatus() functions on the EWrapper.

        Note:  No association is made between the returned orders and the
        requesting client.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ÚREQ_ALL_OPEN_ORDERSr6   )r   rF   r7   r   r   r   ÚreqAllOpenOrders*  s    
zEClient.reqAllOpenOrdersc             C   sZ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ }|  |¡ dS )zíUse this function to cancel all open orders globally. It
        cancels both API and TWS open orders.

        If the order was created in TWS, it also gets canceled. If the order
        was initiated in the API, it also gets canceled.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_GLOBAL_CANCELr6   )r   rF   r7   r   r   r   ÚreqGlobalCancel@  s    
zEClient.reqGlobalCancel)ÚnumIdsc             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
|ƒ }|  |¡ dS )a  Call this function to request from TWS the next valid ID that
        can be used when placing an order.  After calling this function, the
        nextValidId() event will be triggered, and the id returned is that next
        valid ID. That ID will reflect any autobinding that has occurred (which
        generates new IDs and increments the next valid ID therein).

        numIds:int - deprecatedr!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ÚREQ_IDSr6   )r   rí   rF   r7   r   r   r   ÚreqIdsU  s    	zEClient.reqIds)Ú	subscribeÚacctCodec          
   C   s¼   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS y8d}g }|t
tjƒt
|ƒt
|ƒt
|ƒg7 }d |¡}W n> tk
r¬ } z | j t|j|j	|j d¡ dS d}~X Y nX |  |¡ dS )aü  Call this function to start getting account values, portfolio,
        and last update time information via EWrapper.updateAccountValue(),
        EWrapperi.updatePortfolio() and Wrapper.updateAccountTime().

        subscribe:bool - If set to TRUE, the client will start receiving account
            and Portfoliolio updates. If set to FALSE, the client will stop
            receiving this information.
        acctCode:str -The account code for which to receive account and
            portfolio updates.r!   Nr<   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_ACCT_DATAr˜   r   rE   r6   )r   rð   rñ   rF   r™   r7   rG   r   r   r   ÚreqAccountUpdatesr  s     
zEClient.reqAccountUpdates)rw   Ú	groupNameÚtagsc          
   C   s¶   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS y2d}t
tjƒt
|ƒ t
|ƒ t
|ƒ t
|ƒ }W n> tk
r¦ } z | j ||j|j	|j d¡ dS d}~X Y nX |  |¡ dS )ag
  Call this method to request and keep up to date the data that appears
        on the TWS Account Window Summary tab. The data is returned by
        accountSummary().

        Note:   This request is designed for an FA managed account but can be
        used for any multi-account structure.

        reqId:int - The ID of the data request. Ensures that responses are matched
            to requests If several requests are in process.
        groupName:str - Set to All to returnrn account summary data for all
            accounts, or set to a specific Advisor Account Group name that has
            already been created in TWS Global Configuration.
        tags:str - A comma-separated list of account tags.  Available tags are:
            accountountType
            NetLiquidation,
            TotalCashValue - Total cash including futures pnl
            SettledCash - For cash accounts, this is the same as
            TotalCashValue
            AccruedCash - Net accrued interest
            BuyingPower - The maximum amount of marginable US stocks the
                account can buy
            EquityWithLoanValue - Cash + stocks + bonds + mutual funds
            PreviousDayEquityWithLoanValue,
            GrossPositionValue - The sum of the absolute value of all stock
                and equity option positions
            RegTEquity,
            RegTMargin,
            SMA - Special Memorandum Account
            InitMarginReq,
            MaintMarginReq,
            AvailableFunds,
            ExcessLiquidity,
            Cushion - Excess liquidity as a percentage of net liquidation value
            FullInitMarginReq,
            FullMaintMarginReq,
            FullAvailableFunds,
            FullExcessLiquidity,
            LookAheadNextChange - Time when look-ahead values take effect
            LookAheadInitMarginReq,
            LookAheadMaintMarginReq,
            LookAheadAvailableFunds,
            LookAheadExcessLiquidity,
            HighestSeverity - A measure of how close the account is to liquidation
            DayTradesRemaining - The Number of Open/Close trades a user
                could put on before Pattern Day Trading is detected. A value of "-1"
                means that the user can put on unlimited day trades.
            Leverage - GrossPositionValue / NetLiquidation
            $LEDGER - Single flag to relay all cash balance tags*, only in base
                currency.
            $LEDGER:CURRENCY - Single flag to relay all cash balance tags*, only in
                the specified currency.
            $LEDGER:ALL - Single flag to relay all cash balance tags* in all
            currencies.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_ACCOUNT_SUMMARYr   rE   r6   )r   rw   ró   rô   rF   r7   rG   r   r   r   ÚreqAccountSummary–  s    7.zEClient.reqAccountSummaryc             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
|ƒ }|  |¡ dS )zxCancels the request for Account Window Summary tab data.

        reqId:int - The ID of the data request being canceled.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZCANCEL_ACCOUNT_SUMMARYr6   )r   rw   rF   r7   r   r   r   ÚcancelAccountSummaryä  s    zEClient.cancelAccountSummaryc             C   sˆ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rd| j tt ¡ t 	¡ d d¡ dS d}ttjƒt|ƒ }|  |¡ dS )z2Requests real-time position data for all accounts.r!   Nz(  It does not support positions request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ÚMIN_SERVER_VER_POSITIONSr   r   r   ÚREQ_POSITIONSr6   )r   rF   r7   r   r   r   ÚreqPositionsø  s    

zEClient.reqPositionsc             C   sˆ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rd| j tt ¡ t 	¡ d d¡ dS d}ttjƒt|ƒ }|  |¡ dS )z#Cancels real-time position updates.r!   Nz(  It does not support positions request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r÷   r   r   r   ZCANCEL_POSITIONSr6   )r   rF   r7   r   r   r   ÚcancelPositions  s    

zEClient.cancelPositions)rw   rº   rÈ   c          
   C   sä   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rd| j tt ¡ t 	¡ d d¡ dS y2d}ttjƒt|ƒ t|ƒ t|ƒ t|ƒ }W n> tk
rÔ } z | j ||j|j	|j d¡ dS d}~X Y nX |  |¡ dS )zRequests positions for account and/or model.
        Results are delivered via EWrapper.positionMulti() and
        EWrapper.positionMultiEnd() r!   Nz.  It does not support positions multi request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rÇ   r   r   r   ZREQ_POSITIONS_MULTIr   rE   r6   )r   rw   rº   rÈ   rF   r7   rG   r   r   r   ÚreqPositionsMulti%  s    
.zEClient.reqPositionsMultic             C   sŽ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S d}ttjƒt|ƒ t|ƒ }|  |¡ d S )Nr!   z5  It does not support cancel positions multi request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rÇ   r   r   r   ZCANCEL_POSITIONS_MULTIr6   )r   rw   rF   r7   r   r   r   ÚcancelPositionsMultiF  s    zEClient.cancelPositionsMulti)rw   rº   rÈ   ÚledgerAndNLVc          
   C   sè   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS y:d}ttjƒt|ƒ t|ƒ t|ƒ t|ƒ t|ƒ }W n< tk
rØ } z| j ||j|j	|j ¡ dS d}~X Y nX |  |¡ dS )z2Requests account updates for account and/or model.r!   Nz4  It does not support account updates multi request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rÇ   r   r   r   ZREQ_ACCOUNT_UPDATES_MULTIr   rE   r6   )r   rw   rº   rÈ   rý   rF   r7   rG   r   r   r   ÚreqAccountUpdatesMulti\  s    6zEClient.reqAccountUpdatesMultic             C   sŽ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S d}ttjƒt|ƒ t|ƒ }|  |¡ d S )Nr!   z;  It does not support cancel account updates multi request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rÇ   r   r   r   ZCANCEL_ACCOUNT_UPDATES_MULTIr6   )r   rw   rF   r7   r   r   r   ÚcancelAccountUpdatesMulti}  s    z!EClient.cancelAccountUpdatesMultic          
   C   sÔ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S y&ttjƒt|ƒ t|ƒ t|ƒ }W n< tk
rÄ } z| j ||j|j	|j ¡ d S d }~X Y nX |  |¡ d S )Nr!   z"  It does not support PnL request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ÚMIN_SERVER_VER_PNLr   r   r   ZREQ_PNLr   rE   r6   )r   rw   rº   rÈ   r7   rG   r   r   r   ÚreqPnL—  s    &zEClient.reqPnLc             C   s‚   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z"  It does not support PnL request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r   r   r   r   Z
CANCEL_PNLr6   )r   rw   r7   r   r   r   Ú	cancelPnL±  s    
zEClient.cancelPnL)rw   rº   rÈ   Úconidc          
   C   sÜ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S y.ttjƒt|ƒ t|ƒ t|ƒ t|ƒ }W n< tk
rÌ } z| j ||j|j	|j ¡ d S d }~X Y nX |  |¡ d S )Nr!   z"  It does not support PnL request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r   r   r   r   ZREQ_PNL_SINGLEr   rE   r6   )r   rw   rº   rÈ   r  r7   rG   r   r   r   ÚreqPnLSingleÃ  s    .zEClient.reqPnLSinglec             C   s‚   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z"  It does not support PnL request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r   r   r   r   ZCANCEL_PNL_SINGLEr6   )r   rw   r7   r   r   r   ÚcancelPnLSingleÞ  s    
zEClient.cancelPnLSingle)rw   Ú
execFilterc          
   C   s  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS y†d}g }|t
tjƒt
|ƒg7 }|  ¡ tkrp|t
|ƒg7 }|t
|jƒt
|jƒt
|jƒt
|jƒt
|jƒt
|jƒt
|jƒg7 }d |¡}W n< tk
rø } z| j ||j|j	|j ¡ dS d}~X Y nX |  |¡ dS )aÚ  When this function is called, the execution reports that meet the
        filter criteria are downloaded to the client via the execDetails()
        function. To view executions beyond the past 24 hours, open the
        Trade Log in TWS and, while the Trade Log is displayed, request
        the executions again from the API.

        reqId:int - The ID of the data request. Ensures that responses are
            matched to requests if several requests are in process.
        execFilter:ExecutionFilter - This object contains attributes that
            describe the filter criteria used to determine which execution
            reports are returned.

        NOTE: Time format must be 'yyyymmdd-hh:mm:ss' Eg: '20030702-14:55'r!   Nr®   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_EXECUTIONSrD   Z#MIN_SERVER_VER_EXECUTION_DATA_CHAINrC   rñ   Útimer†   r‡   rŒ   Úsider˜   r   rE   r6   )r   rw   r  rF   r™   r7   rG   r   r   r   ÚreqExecutionsõ  s.    

zEClient.reqExecutions)rw   rx   c          
   C   sô  t |ƒ}|  tƒ tƒ ¡ |  ¡ s>| j tt 	¡ t 
¡ d¡ dS |  ¡ tk rv|jsV|jrv| j |t 	¡ t 
¡ d ¡ dS |  ¡ tk r¨|jr¨| j |t 	¡ t 
¡ d ¡ dS |  ¡ tk rÚ|jrÚ| j |t 	¡ t 
¡ d ¡ dS |  ¡ tk r|jr| j |t 	¡ t 
¡ d ¡ dS y”d}g }|ttjƒt|ƒg7 }|  ¡ tkrN|t|ƒg7 }|t|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|j ƒg7 }|  ¡ t!kr¶|t|j"ƒt|jƒg7 }nZ|  ¡ tkr|jr |j"dksä|j"d	kr |t|j"d
 |j ƒg7 }n|t|j"ƒg7 }|t|j#ƒt|j$ƒg7 }|  ¡ tkrF|t|jƒg7 }|t|j%ƒg7 }|  ¡ tkr||t|jƒt|jƒg7 }|  ¡ tkrš|t|jƒg7 }d &|¡}W n> t'k
rä } z| j ||j	|j
|j( ¡ dS d}~X Y nX |  )|¡ dS )a«  Call this function to download all details for a particular
        underlying. The contract details will be received via the contractDetails()
        function on the EWrapper.

        reqId:int - The ID of the data request. Ensures that responses are
            make_fieldatched to requests if several requests are in process.
        contract:Contract - The summary description of the contract being looked
            up.r!   Nz5  It does not support secIdType and secId parameters.zC  It does not support tradingClass parameter in reqContractDetails.zF  It does not support primaryExchange parameter in reqContractDetails.z?  It does not support issuerId parameter in reqContractDetails.é   ZBESTÚSMARTú:)*r   r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rÃ   rÄ   rÅ   r   rƒ   r„   r–   r   ZMIN_SERVER_VER_BOND_ISSUERIDZissuerIdr   r   ZREQ_CONTRACT_DATAZ"MIN_SERVER_VER_CONTRACT_DATA_CHAINr‚   r†   r‡   rˆ   r‰   rŠ   r‹   ZMIN_SERVER_VER_PRIMARYEXCHrŒ   rŽ   r   ÚincludeExpiredr˜   r   rE   r6   )r   rw   rx   rF   r™   r7   rG   r   r   r   ÚreqContractDetails-  s|    	




zEClient.reqContractDetailsc             C   sz   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒ}|  |¡ d S )Nr!   z5  It does not support market depth exchanges request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z&MIN_SERVER_VER_REQ_MKT_DEPTH_EXCHANGESr   r   r   ZREQ_MKT_DEPTH_EXCHANGESr6   )r   r7   r   r   r   ÚreqMktDepthExchangesŽ  s    
zEClient.reqMktDepthExchanges)rw   rx   ÚnumRowsÚisSmartDepthÚmktDepthOptionsc          
   C   s`  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rr|jsR|jdkrr| j |t ¡ t 	¡ d ¡ dS |  
¡ tk r¢|r¢| j |t ¡ t 	¡ d ¡ dS |  
¡ tk rÔ|jrÔ| j |t ¡ t 	¡ d ¡ dS y<d}g }|ttjƒt|ƒt|ƒg7 }|  
¡ tkr|t|jƒg7 }|t|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒg7 }|  
¡ tkrx|t|jƒg7 }|t|jƒt|jƒg7 }|  
¡ tkr®|t|jƒg7 }|t|ƒg7 }|  
¡ tkrØ|t|ƒg7 }|  
¡ tkr|rôtdƒ‚d}|t|ƒg7 }d  |¡}	W n> t!k
rP }
 z| j ||
j|
j	|
j" ¡ dS d}
~
X Y nX |  #|	¡ dS )	aI  Call this function to request market depth for a specific
        contract. The market depth will be returned by the updateMktDepth() and
        updateMktDepthL2() events.

        Requests the contract's market depth (order book). Note this request must be
        direct-routed to an exchange and not smart-routed. The number of simultaneous
        market depth requests allowed in an account is calculated based on a formula
        that looks at an accounts equity, commissions, and quote booster packs.

        reqId:TickerId - The ticker id. Must be a unique value. When the market
            depth data returns, it will be identified by this tag. This is
            also used when canceling the market depth
        contract:Contact - This structure contains a description of the contract
            for which market depth data is being requested.
        numRows:int - Specifies the numRowsumber of market depth rows to display.
        isSmartDepth:bool - specifies SMART depth request
        mktDepthOptions:TagValueList - For internal use only. Use default value
            XYZ.r!   Nr   zG  It does not support conId and tradingClass parameters in reqMktDepth.z) It does not support SMART depth request.z> It does not support primaryExchange parameter in reqMktDepth.rc   znot supported)$r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rƒ   r„   r‚   r   ÚMIN_SERVER_VER_SMART_DEPTHZ&MIN_SERVER_VER_MKT_DEPTH_PRIM_EXCHANGEr   r   r   ZREQ_MKT_DEPTHr†   r‡   rˆ   r‰   rŠ   r‹   rŒ   rŽ   r   r–   r—   r˜   r   rE   r6   )r   rw   rx   r  r  r  rF   r™   rœ   r7   rG   r   r   r   ÚreqMktDepthŸ  sf    


zEClient.reqMktDepth)rw   r  c             C   s¼   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rf|rf| j |t ¡ t 	¡ d ¡ dS d}g }|ttjƒt|ƒt|ƒg7 }|  
¡ tkr¤|t|ƒg7 }d |¡}|  |¡ dS )zöAfter calling this function, market depth data for the specified id
        will stop flowing.

        reqId:TickerId - The ID that was specified in the call to
            reqMktDepth().
        isSmartDepth:bool - specifies SMART depth requestr!   Nz( It does not support SMART depth cancel.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r  r   r   r   ZCANCEL_MKT_DEPTHr˜   r6   )r   rw   r  rF   r™   r7   r   r   r   ÚcancelMktDepthü  s"    

zEClient.cancelMktDepth)ÚallMsgsc             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
|ƒ }|  |¡ dS )a6  Call this function to start receiving news bulletins. Each bulletin
        will be returned by the updateNewsBulletin() event.

        allMsgs:bool - If set to TRUE, returns all the existing bulletins for
        the currencyent day and any new ones. If set to FALSE, will only
        return new bulletins. r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_NEWS_BULLETINSr6   )r   r  rF   r7   r   r   r   ÚreqNewsBulletins#	  s    zEClient.reqNewsBulletinsc             C   sZ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ }|  |¡ dS )z4Call this function to stop receiving news bulletins.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZCANCEL_NEWS_BULLETINSr6   )r   rF   r7   r   r   r   ÚcancelNewsBulletins:	  s    
zEClient.cancelNewsBulletinsc             C   sV   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ }|  |¡S )zæCall this function to request the list of managed accounts. The list
        will be returned by the managedAccounts() function on the EWrapper.

        Note:  This request can only be made when connected to a FA managed account.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_MANAGED_ACCTSr6   )r   rF   r7   r   r   r   ÚreqManagedAcctsO	  s    
zEClient.reqManagedAccts)ÚfaDatac             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
t|ƒƒ }|  |¡S )am  Call this function to request FA configuration information from TWS.
        The data returns in an XML string via a "receiveFA" ActiveX event.

        faData:FaDataType - Specifies the type of Financial Advisor
            configuration data beingingg requested. Valid values include:
            1 = GROUPS
            2 = PROFILE
            3 = ACCOUNT ALIASESr!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_FArV   r6   )r   r  rF   r7   r   r   r   Ú	requestFAc	  s    
zEClient.requestFA)rw   r  Úcxmlc          
   C   sÄ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS yFd}t
tjƒt
|ƒ t
t|ƒƒ t
|ƒ }|  ¡ tkrz|t
|ƒ7 }W n< tk
r¸ } z| j t|j|j	|j ¡ dS d}~X Y nX |  |¡S )aë  Call this function to modify FA configuration information from the
        API. Note that this can also be done manually in TWS itself.

        reqId:TickerId - request id
        faData:FaDataType - Specifies the type of Financial Advisor
            configuration data beingingg requested. Valid values include:
            1 = GROUPS
            2 = PROFILE
            3 = ACCOUNT ALIASES
        cxml: str - The XML string containing the new FA configuration
            information.  r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   Z
REPLACE_FArV   rD   ZMIN_SERVER_VER_REPLACE_FA_ENDr   rE   r6   )r   rw   r  r  rF   r7   rG   r   r   r   Ú	replaceFA|	  s    &zEClient.replaceFA)
rw   rx   ÚendDateTimeÚdurationStrÚbarSizeSettingÚ
whatToShowÚuseRTHÚ
formatDateÚkeepUpToDateÚchartOptionsc             C   sÌ  t |ƒ}|  tƒ tƒ ¡ |  ¡ s>| j |t ¡ t 	¡ d¡ dS |  
¡ tk rz|jsZ|jdkrz| j |t ¡ t 	¡ d ¡ dS |  
¡ tk r®|dkr®| j |t ¡ t 	¡ d ¡ dS yÎd}g }|ttjƒg7 }|  
¡ tk rä|t|ƒg7 }|t|ƒg7 }|  
¡ tkr|t|jƒg7 }|t|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒg
7 }|  
¡ tkr†|t|jƒg7 }|t|jƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒg7 }|jdkr|tt|j ƒƒg7 }x8|j D ].}|t|jƒt|j!ƒt|j"ƒt|jƒg7 }qâW |  
¡ tkr0|t|	ƒg7 }|  
¡ t#krrd}|
rdx|
D ]}|t$|ƒ7 }qNW |t|ƒg7 }d %|¡}W n> t&k
r¼ } z| j ||j|j	|j' ¡ dS d}~X Y nX |  (|¡ dS )	a^
  Requests contracts' historical data. When requesting historical data, a
        finishing time and date is required along with a duration string. The
        resulting bars will be returned in EWrapper.historicalData()

        reqId:TickerId - The id of the request. Must be a unique value. When the
            market data returns, it whatToShowill be identified by this tag. This is also
            used when canceling the market data.
        contract:Contract - This object contains a description of the contract for which
            market data is being requested.
        endDateTime:str - Defines a query end date and time at any point during the past 6 mos.
            Valid values include any date/time within the past six months in the format:
            yyyymmdd HH:mm:ss ttt

            where "ttt" is the optional time zone.
        durationStr:str - Set the query duration up to one week, using a time unit
            of seconds, days or weeks. Valid values include any integer followed by a space
            and then S (seconds), D (days) or W (week). If no unit is specified, seconds is used.
        barSizeSetting:str - Specifies the size of the bars that will be returned (within IB/TWS listimits).
            Valid values include:
            1 sec
            5 secs
            15 secs
            30 secs
            1 min
            2 mins
            3 mins
            5 mins
            15 mins
            30 mins
            1 hour
            1 day
        whatToShow:str - Determines the nature of data beinging extracted. Valid values include:

            TRADES
            MIDPOINT
            BID
            ASK
            BID_ASK
            HISTORICAL_VOLATILITY
            OPTION_IMPLIED_VOLATILITY
            SCHEDULE
        useRTH:int - Determines whether to return all data available during the requested time span,
            or only data that falls within regular trading hours. Valid values include:

            0 - all data is returned even where the market in question was outside of its
            regular trading hours.
            1 - only data within the regular trading hours is returned, even if the
            requested time span falls partially or completely outside of the RTH.
        formatDate: int - Determines the date format applied to returned bars. validd values include:

            1 - dates applying to bars returned in the format: yyyymmdd{space}{space}hh:mm:dd
            2 - dates are returned as a long integer specifying the number of seconds since
                1/1/1970 GMT.
        chartOptions:TagValueList - For internal use only. Use default value XYZ. r!   Nr   zM  It does not support conId and tradingClass parameters in reqHistoricalData.ZSCHEDULEz8  It does not support requesting of historical schedule.é   r~   ))r   r;   r   r=   r>   r   r?   rA   rB   r7   rD   rƒ   r„   r‚   r   Z"MIN_SERVER_VER_HISTORICAL_SCHEDULEr   r   ZREQ_HISTORICAL_DATAZ!MIN_SERVER_VER_SYNT_REALTIME_BARSr†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r  rQ   r   r‘   r’   r–   rO   r˜   r   rE   r6   )r   rw   rx   r  r  r   r!  r"  r#  r$  r%  rF   r™   r›   ZchartOptionsStrrâ   r7   rG   r   r   r   ÚreqHistoricalData¥	  s€    9



zEClient.reqHistoricalDatac             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
|ƒ }|  |¡ dS )zïUsed if an internet disconnect has occurred or the results of a query
        are otherwise delayed and the application is no longer interested in receiving
        the data.

        reqId:TickerId - The ticker ID. Must be a unique value.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZCANCEL_HISTORICAL_DATAr6   )r   rw   rF   r7   r   r   r   ÚcancelHistoricalData3
  s    zEClient.cancelHistoricalData)rw   rx   r!  r"  r#  c       	      C   sR  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j |t ¡ t 	¡ d ¡ d S y¢g }|ttjƒt|ƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|ƒt|ƒt|ƒg7 }d |¡}W n> tk
rB } z| j ||j|j	|j ¡ d S d }~X Y nX |   |¡ d S )Nr!   z/  It does not support head time stamp requests.)!r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z!MIN_SERVER_VER_REQ_HEAD_TIMESTAMPr   r   r   ZREQ_HEAD_TIMESTAMPr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r„   r  r˜   r   rE   r6   )	r   rw   rx   r!  r"  r#  r™   r7   rG   r   r   r   ÚreqHeadTimeStampL
  sB    
zEClient.reqHeadTimeStampc             C   s”   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j |t ¡ t 	¡ d ¡ d S g }|ttjƒt|ƒg7 }d |¡}|  |¡ d S )Nr!   z/  It does not support head time stamp requests.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z#MIN_SERVER_VER_CANCEL_HEADTIMESTAMPr   r   r   ZCANCEL_HEAD_TIMESTAMPr˜   r6   )r   rw   r™   r7   r   r   r   ÚcancelHeadTimeStampx
  s    

zEClient.cancelHeadTimeStamp)ÚtickerIdrx   r"  Ú
timePeriodc             C   sL  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S yœg }|ttjƒt|ƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|ƒt|ƒg7 }d |¡}W n> tk
r< } z| j ||j|j	|j ¡ d S d }~X Y nX |   |¡ d S )Nr!   z*  It does not support histogram requests..)!r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ÚMIN_SERVER_VER_REQ_HISTOGRAMr   r   r   ZREQ_HISTOGRAM_DATAr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r„   r  r˜   r   rE   r6   )r   r+  rx   r"  r,  r™   r7   rG   r   r   r   ÚreqHistogramDataŒ
  s@    
zEClient.reqHistogramData)r+  c             C   s‚   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z*  It does not support histogram requests..)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r-  r   r   r   ZCANCEL_HISTOGRAM_DATAr6   )r   r+  r7   r   r   r   ÚcancelHistogramData·
  s    zEClient.cancelHistogramData)	rw   rx   ÚstartDateTimer  r¦   r!  ÚuseRthr§   ÚmiscOptionsc
             C   s˜  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S yèg }
|
ttjƒt|ƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒg7 }
d}|	r0x|	D ]}|t|ƒ7 }qW |
t|ƒg7 }
d |
¡}W n> tk
rˆ } z| j ||j|j	|j  ¡ d S d }~X Y nX |  !|¡ d S )Nr!   z1  It does not support historical ticks requests..)"r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ZMIN_SERVER_VER_HISTORICAL_TICKSr   r   r   ZREQ_HISTORICAL_TICKSr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r„   r  rO   r˜   r   rE   r6   )r   rw   rx   r0  r  r¦   r!  r1  r§   r2  r™   ZmiscOptionsStringrâ   r7   rG   r   r   r   ÚreqHistoricalTicksÈ
  sR    

zEClient.reqHistoricalTicksc             C   sZ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ }|  |¡ dS )zCRequests an XML string that describes all possible scanner queries.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_SCANNER_PARAMETERSr6   )r   rF   r7   r   r   r   ÚreqScannerParameters  s    
zEClient.reqScannerParameters)rw   ÚsubscriptionÚscannerSubscriptionOptionsÚ scannerSubscriptionFilterOptionsc             C   s<  t |ƒ}|  tƒ tƒ ¡ |  ¡ s>| j tt 	¡ t 
¡ d¡ dS |  ¡ tk rr|dk	rr| j tt 	¡ t 
¡ d ¡ dS yzd}g }|ttjƒg7 }|  ¡ tk r¨|t|ƒg7 }|t|ƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|j ƒt|j!ƒt|j"ƒt|j#ƒt|j$ƒt|j%ƒt|j&ƒg7 }|  ¡ tkr d}|r’x|D ]}|t'|ƒ7 }q|W |t|ƒg7 }|  ¡ t(krâd}	|rÔx|D ]}|	t'|ƒ7 }	q¾W |t|	ƒg7 }d )|¡}
W n> t*k
r, } z| j ||j	|j
|j+ ¡ dS d}~X Y nX |  ,|
¡ dS )a   reqId:int - The ticker ID. Must be a unique value.
        scannerSubscription:ScannerSubscription - This structure contains
            possible parameters used to filter results.
        scannerSubscriptionOptions:TagValueList - For internal use only.
            Use default value XYZ.r!   NzD It does not support API scanner subscription generic filter optionsr   )-r   r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z#MIN_SERVER_VER_SCANNER_GENERIC_OPTSr   r   r   ZREQ_SCANNER_SUBSCRIPTIONr   ÚnumberOfRowsÚ
instrumentÚlocationCodeÚscanCodeÚ
abovePriceÚ
belowPriceÚaboveVolumeÚmarketCapAboveÚmarketCapBelowÚmoodyRatingAboveÚmoodyRatingBelowÚspRatingAboveÚspRatingBelowÚmaturityDateAboveÚmaturityDateBelowÚcouponRateAboveÚcouponRateBelowÚexcludeConvertibleÚaverageOptionVolumeAboveÚscannerSettingPairsÚstockTypeFilterrO   r–   r˜   r   rE   r6   )r   rw   r5  r6  r7  rF   r™   Z#scannerSubscriptionFilterOptionsStrÚtagValueOptZscannerSubscriptionOptionsStrr7   rG   r   r   r   ÚreqScannerSubscription  sl    	

zEClient.reqScannerSubscriptionc             C   sb   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS d}t
tjƒt
|ƒ t
|ƒ }|  |¡ dS )z2reqId:int - The ticker ID. Must be a unique value.r!   Nr3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZCANCEL_SCANNER_SUBSCRIPTIONr6   )r   rw   rF   r7   r   r   r   ÚcancelScannerSubscriptionf  s    z!EClient.cancelScannerSubscription)rw   rx   ÚbarSizer!  r"  ÚrealTimeBarsOptionsc             C   sà  t |ƒ}|  tƒ tƒ ¡ |  ¡ s>| j tt 	¡ t 
¡ d¡ dS |  ¡ tk rp|jrp| j |t 	¡ t 
¡ d ¡ dS y d}g }|ttjƒt|ƒt|ƒg7 }|  ¡ tkr´|t|jƒg7 }|t|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|jƒg
7 }|  ¡ tkr*|t|jƒg7 }|t|ƒt|ƒt|ƒg7 }|  ¡ tkr†d}	|rxx|D ]}
|	t|
ƒ7 }	qbW |t|	ƒg7 }d |¡}W n> t k
rÐ } z| j ||j	|j
|j! ¡ dS d}~X Y nX |  "|¡ dS )a;  Call the reqRealTimeBars() function to start receiving real time bar
        results through the realtimeBar() EWrapper function.

        reqId:TickerId - The Id for the request. Must be a unique value. When the
            data is received, it will be identified by this Id. This is also
            used when canceling the request.
        contract:Contract - This object contains a description of the contract
            for which real time bars are being requested
        barSize:int - Currently only 5 second bars are supported, if any other
            value is used, an exception will be thrown.
        whatToShow:str - Determines the nature of the data extracted. Valid
            values include:
            TRADES
            BID
            ASK
            MIDPOINT
        useRTH:bool - Regular Trading Hours only. Valid values include:
            0 = all data available during the time span requested is returned,
                including time intervals when the market in question was
                outside of regular trading hours.
            1 = only data within the regular trading hours for the product
                requested is returned, even if the time time span falls
                partially or completely outside.
        realTimeBarOptions:TagValueList - For internal use only. Use default value XYZ.r!   NzJ  It does not support conId and tradingClass parameter in reqRealTimeBars.r®   )#r   r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rƒ   r„   r   r   r   ÚREQ_REAL_TIME_BARSr‚   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r–   rO   r˜   r   rE   r6   )r   rw   rx   rP  r!  r"  rQ  rF   r™   ZrealTimeBarsOptionsStrrM  r7   rG   r   r   r   ÚreqRealTimeBars}  sX    


zEClient.reqRealTimeBarsc             C   sr   |   tƒ tƒ ¡ |  ¡ s6| j |t ¡ t ¡ d¡ dS d}g }|t	t
jƒt	|ƒt	|ƒg7 }d |¡}|  |¡ dS )z¦Call the cancelRealTimeBars() function to stop receiving real time bar results.

        reqId:TickerId - The Id that was specified in the call to reqRealTimeBars(). r!   Nr3   )r;   r   r=   r>   r   r?   rA   rB   r7   r   r   ZCANCEL_REAL_TIME_BARSr˜   r6   )r   rw   rF   r™   r7   r   r   r   ÚcancelRealTimeBarsÒ  s    

zEClient.cancelRealTimeBars)rw   rx   Ú
reportTypeÚfundamentalDataOptionsc          
   C   sÄ  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS y>d}|  
¡ tk rj| j tt ¡ t 	¡ d ¡ dS |  
¡ tk r–| j tt ¡ t 	¡ d ¡ dS g }|ttjƒt|ƒt|ƒg7 }|  
¡ tkrÒ|t|jƒg7 }|t|jƒt|jƒt|jƒt|jƒt|jƒt|jƒt|ƒg7 }|  
¡ tkrjd}|r0t|ƒnd}|rVx|D ]}	|t|	ƒ7 }q@W |t|ƒt|ƒg7 }d |¡}
W n> tk
r´ } z| j ||j|j	|j ¡ dS d}~X Y nX |  |
¡ dS )aL  Call this function to receive fundamental data for
        stocks. The appropriate market data subscription must be set up in
        Account Management before you can receive this data.
        Fundamental data will be returned at EWrapper.fundamentalData().

        reqFundamentalData() can handle conid specified in the Contract object,
        but not tradingClass or multiplier. This is because reqFundamentalData()
        is used only for stocks and stocks do not have a multiplier and
        trading class.

        reqId:tickerId - The ID of the data request. Ensures that responses are
             matched to requests if several requests are in process.
        contract:Contract - This structure contains a description of the
            contract for which fundamental data is being requested.
        reportType:str - One of the following XML reports:
            ReportSnapshot (company overview)
            ReportsFinSummary (financial summary)
            ReportRatios (financial ratios)
            ReportsFinStatements (financial statements)
            RESC (analyst estimates) r!   Nr<   z/  It does not support fundamental data request.z<  It does not support conId parameter in reqFundamentalData.r   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ÚMIN_SERVER_VER_FUNDAMENTAL_DATAr   rƒ   r   r   ZREQ_FUNDAMENTAL_DATAr‚   r†   r‡   rŒ   r   rŽ   r   r–   rQ   rO   r˜   r   rE   r6   )r   rw   rx   rU  rV  rF   r™   ZfundDataOptStrr°   ZfundDataOptionr7   rG   r   r   r   ÚreqFundamentalDataî  sP    


zEClient.reqFundamentalDatac             C   sŽ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS d}ttjƒt|ƒ t|ƒ }|  |¡ dS )zlCall this function to stop receiving fundamental data.

        reqId:TickerId - The ID of the data request.r!   Nz/  It does not support fundamental data request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   rW  r   r   r   ZCANCEL_FUNDAMENTAL_DATAr6   )r   rw   rF   r7   r   r   r   ÚcancelFundamentalData;  s    zEClient.cancelFundamentalDatac             C   sz   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒ}|  |¡ d S )Nr!   z-  It does not support news providers request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z!MIN_SERVER_VER_REQ_NEWS_PROVIDERSr   r   r   ZREQ_NEWS_PROVIDERSr6   )r   r7   r   r   r   ÚreqNewsProvidersX  s    
zEClient.reqNewsProviders)rw   ÚproviderCodeÚ	articleIdÚnewsArticleOptionsc       
   
   C   s   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ypg }|ttjƒt|ƒt|ƒt|ƒg7 }|  
¡ tkrÆd}|r¸x|D ]}|t|ƒ7 }q¤W |t|ƒg7 }d |¡}W n> tk
r }	 z| j ||	j|	j	|	j ¡ d S d }	~	X Y nX |  |¡ d S )Nr!   z+  It does not support news article request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ZMIN_SERVER_VER_REQ_NEWS_ARTICLEr   r   r   ZREQ_NEWS_ARTICLEÚ!MIN_SERVER_VER_NEWS_QUERY_ORIGINSrO   r˜   r   rE   r6   )
r   rw   r[  r\  r]  r™   ZnewsArticleOptionsStrrâ   r7   rG   r   r   r   ÚreqNewsArticlek  s2    

zEClient.reqNewsArticle)rw   r‚   ÚproviderCodesr0  r  ÚtotalResultsÚhistoricalNewsOptionsc          
   C   s2  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S y‚g }|ttjƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒg7 }|  
¡ tkrØd}	|rÊx|	D ]}
|	t|
ƒ7 }	q¶W |t|	ƒg7 }d |¡}W n> tk
r" } z| j ||j|j	|j ¡ d S d }~X Y nX |  |¡ d S )Nr!   z.  It does not support historical news request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z"MIN_SERVER_VER_REQ_HISTORICAL_NEWSr   r   r   ZREQ_HISTORICAL_NEWSr^  rO   r˜   r   rE   r6   )r   rw   r‚   r`  r0  r  ra  rb  r™   ZhistoricalNewsOptionsStrrâ   r7   rG   r   r   r   ÚreqHistoricalNews’  s8    

zEClient.reqHistoricalNewsc             C   sŽ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS d}ttjƒt|ƒ t|ƒ }|  |¡ dS )aU  API requests used to integrate with TWS color-grouped windows (display groups).
        TWS color-grouped windows are identified by an integer number. Currently that number ranges from 1 to 7 and are mapped to specific colors, as indicated in TWS.

        reqId:int - The unique number that will be associated with the
            response r!   Nz1  It does not support queryDisplayGroups request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r   r   ZQUERY_DISPLAY_GROUPSr6   )r   rw   rF   r7   r   r   r   ÚqueryDisplayGroupsÂ  s    zEClient.queryDisplayGroups)rw   ÚgroupIdc             C   s–   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS d}ttjƒt|ƒ t|ƒ t|ƒ }|  |¡ dS )zãreqId:int - The unique number associated with the notification.
        groupId:int - The ID of the group, currently it is a number from 1 to 7.
            This is the display group subscription request sent by the API to TWS.r!   Nz5  It does not support subscribeToGroupEvents request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r   r   ZSUBSCRIBE_TO_GROUP_EVENTSr6   )r   rw   re  rF   r7   r   r   r   ÚsubscribeToGroupEventsÝ  s    "zEClient.subscribeToGroupEvents)rw   ÚcontractInfoc          
   C   sØ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS y*d}ttjƒt|ƒ t|ƒ t|ƒ }W n< tk
rÈ } z| j t|j|j	|j ¡ dS d}~X Y nX |  |¡ dS )až  reqId:int - The requestId specified in subscribeToGroupEvents().
        contractInfo:str - The encoded value that uniquely represents the
            contract in IB. Possible values include:

            none = empty selection
            contractID@exchange - any non-combination contract.
                Examples: 8314@SMART for IBM SMART; 8314@ARCA for IBM @ARCA.
            combo = if any combo is selected.r!   Nz1  It does not support updateDisplayGroup request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r   r   ZUPDATE_DISPLAY_GROUPr   rE   r6   )r   rw   rg  rF   r7   rG   r   r   r   ÚupdateDisplayGroup÷  s    
&zEClient.updateDisplayGroupc             C   sŽ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS d}ttjƒt|ƒ t|ƒ }|  |¡ dS )z@reqId:int - The requestId specified in subscribeToGroupEvents().r!   Nz9  It does not support unsubscribeFromGroupEvents request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r   r   ZUNSUBSCRIBE_FROM_GROUP_EVENTSr6   )r   rw   rF   r7   r   r   r   ÚunsubscribeFromGroupEvents  s    z"EClient.unsubscribeFromGroupEvents)ÚapiNameÚ
apiVersionc          
   C   sþ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS | jsˆ| j tt ¡ t 	¡ d ¡ dS y*d}ttjƒt|ƒ t|ƒ t|ƒ }W n< tk
rî } z| j t|j|j	|j ¡ dS d}~X Y nX |  |¡ dS )ztFor IB's internal purpose. Allows to provide means of verification
        between the TWS and third party programs.r!   Nz+  It does not support verification request.zN  Intent to authenticate needs to be expressed during initial connect request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r&   ÚBAD_MESSAGEr   r   ZVERIFY_REQUESTr   rE   r6   )r   rj  rk  rF   r7   rG   r   r   r   ÚverifyRequest3  s&    &zEClient.verifyRequest)ÚapiDatac          
   C   sÐ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS y"d}ttjƒt|ƒ t|ƒ }W n< tk
rÀ } z| j t|j|j	|j ¡ dS d}~X Y nX |  |¡ dS )ztFor IB's internal purpose. Allows to provide means of verification
        between the TWS and third party programs.r!   Nz+  It does not support verification request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r   r   ZVERIFY_MESSAGEr   rE   r6   )r   rn  rF   r7   rG   r   r   r   ÚverifyMessageW  s    zEClient.verifyMessage)rj  rk  ÚopaqueIsvKeyc          
   C   s  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS | jsˆ| j tt ¡ t 	¡ d ¡ dS y2d}ttjƒt|ƒ t|ƒ t|ƒ t|ƒ }W n< tk
rö } z| j t|j|j	|j ¡ dS d}~X Y nX |  |¡ dS )ztFor IB's internal purpose. Allows to provide means of verification
        between the TWS and third party programs.r!   Nz+  It does not support verification request.zN  Intent to authenticate needs to be expressed during initial connect request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r&   rl  r   r   ZVERIFY_AND_AUTH_REQUESTr   rE   r6   )r   rj  rk  rp  rF   r7   rG   r   r   r   ÚverifyAndAuthRequestu  s&    .zEClient.verifyAndAuthRequest)rn  ÚxyzResponsec          
   C   sØ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS y*d}ttjƒt|ƒ t|ƒ t|ƒ }W n< tk
rÈ } z| j t|j|j	|j ¡ dS d}~X Y nX |  |¡ dS )ztFor IB's internal purpose. Allows to provide means of verification
        between the TWS and third party programs.r!   Nz+  It does not support verification request.r3   )r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r–   r   r   r   ZVERIFY_AND_AUTH_MESSAGEr   rE   r6   )r   rn  rr  rF   r7   rG   r   r   r   ÚverifyAndAuthMessage›  s    &zEClient.verifyAndAuthMessage)rw   ÚunderlyingSymbolÚfutFopExchangeÚunderlyingSecTypeÚunderlyingConIdc       	   
   C   sî   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS |  
¡ tk rb| j tt ¡ t 	¡ d ¡ dS y@g }|ttjƒt|ƒt|ƒt|ƒt|ƒt|ƒg7 }d |¡}W n< tk
rÞ } z| j ||j|j	|j ¡ dS d}~X Y nX |  |¡ dS )añ  Requests security definition option parameters for viewing a
        contract's option chain reqId the ID chosen for the request
        underlyingSymbol futFopExchange The exchange on which the returned
        options are trading. Can be set to the empty string "" for all
        exchanges. underlyingSecType The type of the underlying security,
        i.e. STK underlyingConId the contract ID of the underlying security.
        Response comes via EWrapper.securityDefinitionOptionParameter()r!   Nz9  It does not support security definition option request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z%MIN_SERVER_VER_SEC_DEF_OPT_PARAMS_REQr   r   r   ZREQ_SEC_DEF_OPT_PARAMSr˜   r   rE   r6   )	r   rw   rt  ru  rv  rw  r™   r7   rG   r   r   r   ÚreqSecDefOptParamsº  s*    
zEClient.reqSecDefOptParamsc             C   sV   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS t
tjƒt
|ƒ }|  |¡ dS )zËRequests pre-defined Soft Dollar Tiers. This is only supported for
        registered professional advisors and hedge and mutual funds who have
        configured Soft Dollar Tiers in Account Management.r!   N)r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_SOFT_DOLLAR_TIERSr6   )r   rw   r7   r   r   r   ÚreqSoftDollarTiersã  s    
zEClient.reqSoftDollarTiersc             C   sz   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒ}|  |¡ d S )Nr!   z+  It does not support family codes request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ZMIN_SERVER_VER_REQ_FAMILY_CODESr   r   r   ZREQ_FAMILY_CODESr6   )r   r7   r   r   r   ÚreqFamilyCodesô  s    
zEClient.reqFamilyCodes)rw   Úpatternc          
   C   sÌ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S yttjƒt|ƒ t|ƒ }W n< tk
r¼ } z| j ||j|j	|j ¡ d S d }~X Y nX |  |¡ d S )Nr!   z/  It does not support matching symbols request.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   Z#MIN_SERVER_VER_REQ_MATCHING_SYMBOLSr   r   r   ZREQ_MATCHING_SYMBOLSr   rE   r6   )r   rw   r{  r7   rG   r   r   r   ÚreqMatchingSymbols  s    zEClient.reqMatchingSymbols)ÚapiOnlyc             C   sV   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ dS t
tjƒt
|ƒ }|  |¡ dS )a  Call this function to request the completed orders. If apiOnly parameter 
        is true, then only completed orders placed from API are requested. 
        Each completed order will be fed back through the
        completedOrder() function on the EWrapper.r!   N)r;   r   r=   r>   r   r?   r@   rA   rB   r7   r   r   ZREQ_COMPLETED_ORDERSr6   )r   r}  r7   r   r   r   ÚreqCompletedOrders  s    
zEClient.reqCompletedOrdersc          
   C   sÄ   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S yttjƒt|ƒ }W n< tk
r´ } z| j ||j|j	|j ¡ d S d }~X Y nX |  |¡ d S )Nr!   z' It does not support WSHE Calendar API.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ÚMIN_SERVER_VER_WSHE_CALENDARr   r   r   ZREQ_WSH_META_DATAr   rE   r6   )r   rw   r7   rG   r   r   r   ÚreqWshMetaData0  s    zEClient.reqWshMetaDatac             C   s‚   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z' It does not support WSHE Calendar API.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r  r   r   r   ZCANCEL_WSH_META_DATAr6   )r   rw   r7   r   r   r   ÚcancelWshMetaDataH  s    
zEClient.cancelWshMetaData)rw   ÚwshEventDatac          
   C   s  |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S |  
¡ tk rª|jdksŠ|jsŠ|jsŠ|jrª| j tt ¡ t 	¡ d ¡ d S |  
¡ tk rô|jdksÔ|jdksÔ|jtkrô| j tt ¡ t 	¡ d ¡ d S yÌg }| ttjƒ¡ | t|ƒ¡ | t|jƒ¡ |  
¡ tkrv| t|jƒ¡ | t|jƒ¡ | t|jƒ¡ | t|jƒ¡ |  
¡ tkr´| t|jƒ¡ | t|jƒ¡ | t|jƒ¡ d |¡}W n> tk
rþ } z| j ||j|j	|j ¡ d S d }~X Y nX |  |¡ d S )Nr!   z' It does not support WSHE Calendar API.z, It does not support WSH event data filters.z1 It does not support WSH event data date filters.) r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r  r   Z%MIN_SERVER_VER_WSH_EVENT_DATA_FILTERSÚfilterZfillWatchlistZfillPortfolioZfillCompetitorsZ*MIN_SERVER_VER_WSH_EVENT_DATA_FILTERS_DATEÚ	startDateÚendDateZ
totalLimitrÂ   rÎ   r   r   ZREQ_WSH_EVENT_DATAr‚   r˜   r   rE   r6   )r   rw   r‚  r™   r7   rG   r   r   r   ÚreqWshEventDataZ  sF    zEClient.reqWshEventDatac             C   s‚   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z' It does not support WSHE Calendar API.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   r  r   r   r   ZCANCEL_WSH_EVENT_DATAr6   )r   rw   r7   r   r   r   ÚcancelWshEventDataŠ  s    
zEClient.cancelWshEventDatac             C   s‚   |   tƒ tƒ ¡ |  ¡ s6| j tt ¡ t 	¡ d¡ d S |  
¡ tk rb| j tt ¡ t 	¡ d ¡ d S ttjƒt|ƒ }|  |¡ d S )Nr!   z( It does not support user info requests.)r;   r   r=   r>   r   r?   r@   rA   rB   r7   rD   ZMIN_SERVER_VER_USER_INFOr   r   r   ZREQ_USER_INFOr6   )r   rw   r7   r   r   r   ÚreqUserInfoœ  s    
zEClient.reqUserInfo)N)N)ur   Ú
__module__Ú__qualname__Úranger.   rN   rW   ZREDIRECTr    r   r-   r6   r;   rH   rM   rZ   r>   rb   re   rg   rh   ri   rq   rs   rD   rV   ru   rv   ZTickerIdr   rO   ÚboolZTagValueListr   rž   r    r¢   r¤   r©   rª   Úfloatr²   r³   r¶   r·   r¼   ZOrderIdr	   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  r  r  Z
FaDataTyper  r  r'  r(  r)  r*  r.  r/  r3  r4  r   rN  rO  rS  rT  rX  rY  rZ  r_  rc  rd  rf  rh  ri  rm  ro  rq  rs  rx  ry  rz  r|  r~  r€  r  ZWshEventDatar†  r‡  rˆ  r   r   r   r   r   (   s  

Y
"w".HGE    X$N! 8a\') +*:MSL'/%$%'0r   )(Ú__doc__r"   r   rY   Úibapir   r   r   Zibapi.connectionr   Zibapi.messager   Zibapi.commonZibapi.contractr   Zibapi.orderr	   r
   Zibapi.executionr   Zibapi.scannerr   Z
ibapi.commr   r   Zibapi.utilsr   r   Zibapi.errorsZibapi.server_versionsr   Zibapi.converterr   r   r   Ú	getLoggerr   r1   Úobjectr   r   r   r   r   Ú<module>   s&   
