B
     9-ef;                 @   s  d dl mZmZ d dlmZmZ d dlmZ d dlZ	d dl
Z
G dd deZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZG d+d, d,eZG d-d. d.eZ G d/d0 d0eZ!G d1d2 d2eZ"G d3d4 d4eZ#G d5d6 d6eZ$G d7d8 d8eZ%dS )9    )	CONSTANTSTimer)print_IBCpp_orderprint_IBCpp_contract)exitNc               @   s   e Zd ZdZdZdS )IgnoringErrorTFN)__name__
__module____qualname__ERROR_IS_IGNOREDERROR_NEEDS_ATTENTION r   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\broker_client_factory\BrokerClientDefs.pyr   	   s   r   c               @   s,   e Zd ZG dd deZG dd deZdS )ReqAttrc               @   s   e Zd ZdZdZdZdZdS )zReqAttr.Status	CompletedCreated	SubmittedZStartedN)r   r	   r
   	COMPLETEDCREATED	SUBMITTEDZSTARTEDr   r   r   r   Status   s   r   c               @   s   e Zd ZdZdZdS )zReqAttr.FollowUpTFN)r   r	   r
   	FOLLOW_UPDO_NOT_FOLLOW_UPr   r   r   r   FollowUp   s   r   N)r   r	   r
   r   r   r   r   r   r   r   r      s   r   c               @   s\   e Zd ZG dd deZG dd deZG dd deZG dd deZG d	d
 d
eZdS )ReqHistParamc               @   s   e Zd ZdZdZdZdS )zReqHistParam.NamebarSizegoBackendTimeN)r   r	   r
   ZBAR_SIZEZGO_BACKZEND_TIMEr   r   r   r   Name   s   r   c               @   s   e Zd ZdZdZdS )zReqHistParam.BarSizez1 minz1 dayN)r   r	   r
   ONE_MINONE_DAYr   r   r   r   BarSize    s   r!   c               @   s   e Zd ZdZdZdS )zReqHistParam.GoBackz1 Dz5 DN)r   r	   r
   r    Z	FIVE_DAYSr   r   r   r   GoBack$   s   r"   c               @   s   e Zd ZdZdZdS )zReqHistParam.FormatDate      N)r   r	   r
   Z	DATE_TIME
UTC_SECONDr   r   r   r   
FormatDate(   s   r&   c               @   s   e Zd ZdZdZdS )zReqHistParam.UseRTHr#   r   N)r   r	   r
   DATA_IN_REGULAR_HOURSZALL_DATAr   r   r   r   UseRTH,   s   r(   N)	r   r	   r
   r   r   r!   r"   r&   r(   r   r   r   r   r      s
   r   c               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'S )(ActiveRequestBatchc             C   s6   || _ g | _i | _t | _x|D ]}| | q W d S )N)	nextReqId_requestIdListactiveRequestsDictr   timer_add)selfZrequestsuuidrequestr   r   r   __init__2   s    
zActiveRequestBatch.__init__c             C   s8   d}x&|   D ]}|t| j| d 7 }qW |d d S )N 
)get_request_idsstrr,   )r/   ansreqIdr   r   r   __str__B   s    zActiveRequestBatch.__str__c             C   s
   || j kS )N)r,   )r/   r9   r   r   r   is_reqId_within_activeRequestsH   s    z1ActiveRequestBatch.is_reqId_within_activeRequestsc             C   s   | j S )N)r+   )r/   r   r   r   r6   K   s    z"ActiveRequestBatch.get_request_idsc             C   s*   | j  }| j| || j|< ||_dS )z
        Use nextReqId as Key, called reqId, use aRequest as Value
        :param aRequest: ReqDataBase
        :return: None
        N)r*   ZuseOner+   appendr,   r9   )r/   aRequestr9   r   r   r   r.   N   s    

zActiveRequestBatch._addc             C   s
   || j kS )N)r,   )r/   r9   r   r   r   	has_reqIdY   s    zActiveRequestBatch.has_reqIdc             C   s8   || j kr| j | S ttd|f   |   t  d S )Nz,::get_by_reqId_otherwise_exit: EXIT reqId=%s)r,   printr   print_activeRequestr   )r/   r9   r   r   r   get_by_reqId_otherwise_exit\   s
    

z.ActiveRequestBatch.get_by_reqId_otherwise_exitc             C   s>   x8| j D ].}d| j | jkr|| j | jd kr6|S qqW dS )z

        :param int_orderId:
        :return: reqId if found, Otherwise return None. It is normal that reqId is not found when order is not place in this session.
        int_orderIdN)r,   param)r/   rB   r9   r   r   r   find_reqId_by_int_orderIdd   s    z,ActiveRequestBatch.find_reqId_by_int_orderIdc             C   sH   x"| j D ]}| j | j|kr|S qW ttd|f   |   t  dS )zK

        :param reqType: string
        :return: a list of reqIds
        z9::find_a_reqId_by_reqType_otherwise_exit: EXIT reqType=%sN)r,   reqTyper?   r   r@   r   )r/   rE   r9   r   r   r   &find_a_reqId_by_reqType_otherwise_exity   s    z9ActiveRequestBatch.find_a_reqId_by_reqType_otherwise_exitc             C   s.   | j | jrtjS || j | jkr(tjS tjS )N)r,   ZignoringAllErrosr   r   ignoringTheseErrorsr   )r/   r9   Z	errorCoder   r   r   ignoringErrorCode   s
    z$ActiveRequestBatch.ignoringErrorCodec             C   s,   x&| j D ]}| j | jtjjkrdS qW dS )NFT)r,   statusr   r   r   )r/   r9   r   r   r   check_all_completed   s    z&ActiveRequestBatch.check_all_completedc             C   sJ   g }x@| j D ]6}| j | }|jtjjkr| j |jkr|| qW |S )N)	r,   rI   r   r   r   r-   elapsedInSecondwaitForFeedbackInSecondsr<   )r/   r8   r9   r=   r   r   r   find_failed_requests   s    
z'ActiveRequestBatch.find_failed_requestsc             C   s^   xX| j D ]N}| j | }|jtjjkr| j |jkr|jdkrtjj|_t	| d qW d S )NFzA is changed from uncompleted to completed because followUp=False.)
r,   rI   r   r   r   r-   rK   rL   followUpr?   )r/   r9   r=   r   r   r   .label_uncompleted_to_completed_if_not_followup   s    


zAActiveRequestBatch.label_uncompleted_to_completed_if_not_followupc             C   s2   g }x(| j D ]}| j | j|kr|| qW |S )N)r,   rE   r<   )r/   rE   r8   r9   r   r   r   _find_reqIds_by_reqType   s
    z*ActiveRequestBatch._find_reqIds_by_reqTypec             C   s   || j kr|| j | _d S )N)r,   rI   )r/   r9   rI   r   r   r   $set_a_request_of_a_reqId_to_a_status   s    
z7ActiveRequestBatch.set_a_request_of_a_reqId_to_a_statusc             C   s"   |  |}|d k	r|| j| _d S )N)rD   r,   rI   )r/   orderIdrI   r9   r   r   r   'set_a_request_of_an_orderId_to_a_status   s    
z:ActiveRequestBatch.set_a_request_of_an_orderId_to_a_statusc             C   s(   |  |}x|D ]}|| j| _qW d S )N)rP   r,   rI   )r/   rE   rI   	reqIdListr9   r   r   r   )set_all_requests_of_a_reqType_to_a_status   s    

z<ActiveRequestBatch.set_all_requests_of_a_reqType_to_a_statusc             C   s4   |  |}x$|D ]}|| j| _|| j| _qW d S )N)rP   r,   rI   returnedResult)r/   rE   rI   resultrT   r9   r   r   r   8set_all_requests_of_a_reqType_to_a_status_and_set_result   s    

zKActiveRequestBatch.set_all_requests_of_a_reqType_to_a_status_and_set_resultc             C   s.   x(| j D ]}ttd  t| j |  qW d S )Nz::print_activeRequest)r,   r?   r   )r/   r9   r   r   r   r@      s    z&ActiveRequestBatch.print_activeRequestN)r   r	   r
   r2   r:   r;   r6   r.   r>   rA   rD   rF   rH   rJ   rM   rO   rP   rQ   rS   rU   rX   r@   r   r   r   r   r)   1   s&   	
r)   c               @   s,   e Zd ZejjejjdfddZdd Z	dS )Request   c             C   sH   || _ d | _|| _|| _i | _d| _t | _d| _d| _	d | _
|| _d S )NFr#   r   )rI   r9   rE   rN   rC   ZignoringAllErrorssetrG   ZnumberOfTotalSendingZcurrentNumberOfSendingrV   rL   )r/   rE   rN   rI   rL   r   r   r   r2      s    zRequest.__init__c             C   s   d| j | j| j| j| jf }d}x| jD ]z}|dkrL|dt| j|  7 }q(|dkrl|dt| j|  7 }q(|dkr|d| j|   7 }q(|d	|| j| f 7 }q(W |d
7 }|d|f 7 }|S )NzG{reqId=%s,status=%s,reqType=%s,followUp=%s,waitForFeedbackInSeconds=%s,{orderz	order:%s,contractzcontract:%s,securityzsecurity:%s,z%s:%s,}z	param=%s})	r9   rI   rE   rN   rL   rC   r   r   
full_print)r/   r8   tmpkeyr   r   r   r:      s    zRequest.__str__N)
r   r	   r
   r   r   r   r   r   r2   r:   r   r   r   r   rY      s   rY   c               @   s   e Zd ZdddZdS )
ReqConnect   c             C   s   t j| d|d d S )N
reqConnect)rE   rL   )rY   r2   )r/   rL   r   r   r   r2      s    zReqConnect.__init__N)re   )r   r	   r
   r2   r   r   r   r   rd      s   rd   c               @   s   e Zd Zdd ZdS )ReqPositionsc             C   s   t j| dd t | _d S )NreqPositions)rE   )rY   r2   pd	DataFramerV   )r/   r   r   r   r2      s    zReqPositions.__init__N)r   r	   r
   r2   r   r   r   r   rg      s   rg   c               @   s   e Zd Zdd ZdS )ReqAccountUpdatesc             C   s&   t j| dd || jd< || jd< dS )z
        constructor
        :param subscribe: bool, should be true for most of time
        :param accountCode: string
        reqAccountUpdates)rE   	subscribeaccountCodeN)rY   r2   rC   )r/   rm   rn   r   r   r   r2      s    
zReqAccountUpdates.__init__N)r   r	   r
   r2   r   r   r   r   rk      s   rk   c               @   s   e Zd ZdddZdS )ReqAccountSummaryAll0TotalCashValue,GrossPositionValue,NetLiquidationc             C   s&   t j| dd || jd< || jd< d S )NreqAccountSummary)rE   grouptag)rY   r2   rC   )r/   rs   rt   r   r   r   r2      s    
zReqAccountSummary.__init__N)rp   rq   )r   r	   r
   r2   r   r   r   r   ro      s   ro   c               @   s   e Zd Zdd ZdS )ReqIdsc             C   s   t j| dd d S )NreqIds)rE   )rY   r2   )r/   r   r   r   r2     s    zReqIds.__init__N)r   r	   r
   r2   r   r   r   r   ru     s   ru   c               @   s   e Zd ZdddZdS )ReqHeartBeats
   c             C   s   t j| d|d d S )NreqHeartBeats)rE   rL   )rY   r2   )r/   rL   r   r   r   r2     s    zReqHeartBeats.__init__N)rx   )r   r	   r
   r2   r   r   r   r   rw     s   rw   c               @   s   e Zd ZdZdd ZdS )ReqOneOrderz)
    Only available to TD Ameritrade
    c             C   s   t j| dd || jd< d S )NreqOneOrder)rE   rR   )rY   r2   rC   )r/   rR   r   r   r   r2     s    zReqOneOrder.__init__N)r   r	   r
   __doc__r2   r   r   r   r   rz     s   rz   c               @   s   e Zd Zdd ZdS )ReqAllOpenOrdersc             C   s   t j| dd d S )NreqAllOpenOrders)rE   )rY   r2   )r/   r   r   r   r2     s    zReqAllOpenOrders.__init__N)r   r	   r
   r2   r   r   r   r   r}     s   r}   c               @   s   e Zd Zdd ZdS )ReqCurrentTimec             C   s   t j| dd d S )NreqCurrentTime)rE   )rY   r2   )r/   r   r   r   r2     s    zReqCurrentTime.__init__N)r   r	   r
   r2   r   r   r   r   r     s   r   c               @   s.   e Zd Zejjejjde	ddfddZ
dS )ReqHistoricalDatarZ   z
US/EasternTc             C   sp   t j| d||
d || jd< || jd< || jd< || jd< || jd< || jd< || jd	< |	| jd
< t | _d S )NreqHistoricalData)rE   rL   rN   r_   r   r   r   
whatToShowuseRTH
formatDatetimezoneOfReturn)rY   r2   rC   ri   rj   rV   )r/   r_   r   r   r   r   r   r   rL   r   rN   r   r   r   r2   $  s    








zReqHistoricalData.__init__N)r   r	   r
   r   r(   r'   r&   r%   pytztimezoner2   r   r   r   r   r   #  s
   r   c               @   s   e Zd ZdddZdS )	
ReqMktDataN101FTrZ   c             C   sB   t j| d|d || jd< || jd< || jd< || jd< || _d S )N
reqMktData)rE   rL   r_   genericTickListsnapshottickTypeClientAsked)rY   r2   rC   rN   )r/   r_   r   r   r   rN   rL   r   r   r   r2   ?  s    



zReqMktData.__init__)Nr   FTrZ   )r   r	   r
   r2   r   r   r   r   r   >  s   r   c               @   s   e Zd Zdd ZdS )CancelMktDatac             C   s"   t j| dd || jd< d| _d S )NcancelMktData)rE   r_   F)rY   r2   rC   rN   )r/   r_   r   r   r   r2   I  s    
zCancelMktData.__init__N)r   r	   r
   r2   r   r   r   r   r   H  s   r   c               @   s   e Zd ZdddZdS )ReqRealTimeBars   Tc             C   s@   t j| dd || jd< || jd< || jd< || jd< || _d S )NreqRealTimeBars)rE   r_   r   r   r   )rY   r2   rC   rN   )r/   r_   r   r   r   rN   r   r   r   r2   P  s    



zReqRealTimeBars.__init__N)r   TT)r   r	   r
   r2   r   r   r   r   r   O  s   r   c               @   s   e Zd ZdddZdS )ReqContractDetailsx   c             C   s(   t j| d|d || jd< t | _d S )NreqContractDetails)rE   rL   r_   )rY   r2   rC   ri   rj   rV   )r/   r_   rL   r   r   r   r2   Z  s    
zReqContractDetails.__init__N)r   )r   r	   r
   r2   r   r   r   r   r   Y  s   r   c               @   s   e Zd Zdd ZdS )CalculateImpliedVolatilityc             C   s0   t j| dd || jd< || jd< || jd< d S )NcalculateImpliedVolatility)rE   r_   optionPrice
underPrice)rY   r2   rC   )r/   r_   r   r   r   r   r   r2   a  s    

z#CalculateImpliedVolatility.__init__N)r   r	   r
   r2   r   r   r   r   r   `  s   r   c               @   s   e Zd ZdddZdS )
PlaceOrderrZ   c             C   s*   t j| d||d || jd< || jd< d S )N
placeOrder)rE   rN   rL   r^   r]   )rY   r2   rC   )r/   r^   r]   rN   rL   r   r   r   r2   i  s    
zPlaceOrder.__init__N)rZ   )r   r	   r
   r2   r   r   r   r   r   h  s   r   c               @   s   e Zd ZdddZdS )ModifyOrderrZ   c             C   s4   t j| d||d || jd< || jd< || jd< d S )NmodifyOrder)rE   rN   rL   ibpyOrderIdr^   r]   )rY   r2   rC   )r/   r   r^   r]   rN   rL   r   r   r   r2   p  s    

zModifyOrder.__init__N)rZ   )r   r	   r
   r2   r   r   r   r   r   o  s   r   c               @   s   e Zd ZdddZdS )ReqScannerSubscriptiondefaultrZ   c             C   sF   t j| d|d || jd< |dkr.g | jd< n
|| jd< t | _d S )NreqScannerSubscription)rE   rL   subscriptionr   tagValueList)rY   r2   rC   ri   rj   rV   )r/   r   r   rL   r   r   r   r2   x  s    

zReqScannerSubscription.__init__N)r   rZ   )r   r	   r
   r2   r   r   r   r   r   w  s   r   c               @   s   e Zd ZdddZdS )CancelScannerSubscriptionFc             C   s   t j| d|d || jd< d S )NcancelScannerSubscription)rE   rN   ZtickerId)rY   r2   rC   )r/   ZscannerReqIdrN   r   r   r   r2     s    z"CancelScannerSubscription.__init__N)F)r   r	   r
   r2   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )CancelOrderc             C   s&   t j| dd || jd< d | jd< d S )NcancelOrder)rE   r   rB   )rY   r2   rC   )r/   r   r   r   r   r2     s    
zCancelOrder.__init__N)r   r	   r
   r2   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )ReqScannerParametersc             C   s   t j| dd d S )NreqScannerParameters)rE   )rY   r2   )r/   r   r   r   r2     s    zReqScannerParameters.__init__N)r   r	   r
   r2   r   r   r   r   r     s   r   )&BasicPyLib.BasicToolsr   r   Zmodels.utilsr   r   sysr   pandasri   r   r   r   r   objectr)   rY   rd   rg   rk   ro   ru   rw   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s>     	

