B
     9-eP-                 @   s   d dl mZ d dlZd dlZd dlmZ d dlmZ dd Z	d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G dd deZdS )    )exitN)IBCpp)SymbolStatusc             C   s   t | tr4| r.t| } t | tr2t| } qHi } nt | tr@nt| } t| d | d | d d}x,dD ]$}| |d}|dkrht||| qhW |S )NsecTypesymbolcurrency)r   r   r   )
r   r   primaryExchangeexchanger   lastTradeDateOrContractMonthstrikeright
multiplierlocalSymbol )	
isinstancestrjsonloadsdictvarsSecuritygetsetattr)contractansparatmp 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\IBridgePy\quantopian.pyfrom_contract_to_security   s    




r   c             C   sD   | j | j| j| j| j| j| jt| j| j	| j
| j| jd}t|S )N)r   r   r	   r   r   includeExpiredr
   r   r   r   r   conId)r   r   r	   r   r   r    expiryfloatr   r   r   r   r!   r   dumps)securityr   r   r   r   from_security_to_contract    s    
r&   c               @   sZ   e Zd Zddddddddddddddddejfdd	Zd
d Zdd Zdd Zdd Z	dS )r   NUSDr   g        Fr   c             C   sj   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _d S )N)r   r   r   r	   r   r"   r   r   r   r    sidr!   r   security_namesecurity_start_datesecurity_end_datesymbolStatus)selfr   r   r   r	   r   r"   r   r   r   r    r)   r!   r   r*   r+   r,   r-   r   r   r   __init__2   s"    zSecurity.__init__c             C   s~   | j dkr"d| j | j| j| jf S | j dkr<d| j| jf S | j dkrfd| j| j| j| j| j| jf S d| j | j| jf S d S )N)FUTBONDz%s,%s,%s,%sCASHz
CASH,%s,%sOPTzOPT,%s,%s,%s,%s,%s,%sz%s,%s,%s)r   r   r   r"   r   r   r   )r.   r   r   r   __str__V   s    


 zSecurity.__str__c             C   s   |   |  kS )N)
full_print)r.   r%   r   r   r   __eq__`   s    zSecurity.__eq__c             C   s   t | S )N)id)r.   r   r   r   __hash__c   s    zSecurity.__hash__c             C   s   | j dkr*d| j | j| j| j| j| jf S | j dkrPd| j | j| j| j| jf S d| j | j| j| j| j| jd| j| j| j	| j
f
 S d S )N)r0   r1   z%s,%s,%s,%s,%s,%s)r2   STKZCMDTYINDCFDz%s,%s,%s,%s,%sz%s,%s,%s,%s,%s,%s,%s,%s,%s,%sz{:10.2f})r   r   r	   r   r   r"   formatr   r   r   r   )r.   r   r   r   r5   f   s    
 
zSecurity.full_print)
__name__
__module____qualname__r   DEFAULTr/   r4   r6   r8   r5   r   r   r   r   r   1   s*   
r   c               @   sH   e Zd ZdZdd Zdd Zdd Zdd	d
ZdddZe	dd Z
dS )
QDataClasszO
    This is a wrapper to match quantopian's data.current and data.history
    c             C   s   i | _ i | _|| _d S )N)dataZdataHashparentTrader)r.   rC   r   r   r   r/   w   s    zQDataClass.__init__c             C   s   t |tkrDt |tkrDi }x|D ]}| ||||< q"W t|S t |tkrt |tkri }x6|D ].}i ||< x |D ]}| |||| |< qxW qfW t|S t |tkrt |tkri }x|D ]}| ||||< qW t|S | ||S d S )N)typelistcurrent_onepdSeries	DataFrame)r.   r%   fieldr   ctZct1Zct2r   r   r   current|   s$    






zQDataClass.currentc             C   sL   | j  td||f   |dkr2| j ||S |dkrH| j ||S d S )Nz%::current_one: security=%s version=%s)Z	ask_priceZ	bid_pricepriceZ
last_priceopenhighlowclose)Zask_sizeZbid_sizevolume)rC   ZgetLognotsetr=   show_real_time_priceshow_real_time_size)r.   r%   versionr   r   r   rF      s
    zQDataClass.current_oneTc             C   s  d }|dkr@d}|dkr2t t|d d d }qt |d }n|dkr^d	}t |d
 d }nj|dkrd}t t|d d d }nD|dks|dkrt t|d d d }nttdt |   t  t|tkr| ||||||S t|t kr4i }x*|D ]"}| ||||||||< qW t	
|S i }	x*|D ]"}| |||||||	|< q>W i }x:|D ]2}
i ||
< x"|D ]}|	| |
 ||
 |< qW qnW t	j
|| dS d S )NZ1dz1 dayim  g     v@   z Yz DZ1mz1 min<   z SZ30mz30 minsg      *@   z1 hourZ1hg      @z+::history: EXIT, cannot handle frequency=%s)columns)r   intprintr=   r   rD   rE   history_onetailrG   rI   keys)r.   r%   fieldsZ	bar_count	frequencyfollowUpgoBackr   secr   Zfldr   r   r   history   sB    
"

"

 zQDataClass.historyc             C   sN   | j j||||d}t|dkr(t S |j|jd}|d jdd || S )N)rb   r   )rM   rM   pad)method)rC   request_historical_datalenrG   rH   assignrQ   fillna)r.   r%   r`   rc   ra   rb   r   r   r   r   r]      s    zQDataClass.history_onec             C   s   | rdS dS )a)  
        This function is provided by Quantopian.
        IBridgePy supports the same function.
        However, as of 20180128, IBridgePy will not check if the str_security is
        tradeable.
        In the future, IBridgePy will check it.
        Input: Security
        Output: Bool
        Tr   )r%   r   r   r   	can_trade   s    zQDataClass.can_tradeN)T)T)r=   r>   r?   __doc__r/   rL   rF   re   r]   staticmethodrl   r   r   r   r   rA   r   s   
'
rA   c               @   s   e Zd ZdddZdd ZdS )TimeBasedRulesanyNc             C   s(   || _ || _|| _|| _|| _|| _d S )N)onNthMonthDayonNthWeekDayonHouronMinuteonSecondfunc)r.   rq   rr   rs   rt   ru   rv   r   r   r   r/      s    zTimeBasedRules.__init__c             C   sB   t | jd t | j d t | j d t | j d t | j S )N )r   rq   rr   rs   rt   rv   )r.   r   r   r   r4      s    zTimeBasedRules.__str__)rp   rp   rp   rp   rp   N)r=   r>   r?   r/   r4   r   r   r   r   ro      s        
ro   c               @   s   e Zd ZdZdZdS )	calendars)	         r   )   rz      r   N)r=   r>   r?   ZUS_EQUITIESZ
US_FUTURESr   r   r   r   rx      s   rx   c               @   s<   e Zd ZG dd deZG dd deZG dd deZdS )
time_rulesc               @   s   e Zd ZdddZdS )ztime_rules.market_openr   rW   c             C   s   || _ || _d| _d| _d S )Nr   market_open)hourminutesecondrV   )r.   hoursminutesr   r   r   r/      s    ztime_rules.market_open.__init__N)r   rW   )r=   r>   r?   r/   r   r   r   r   r      s   r   c               @   s   e Zd ZdddZdS )ztime_rules.market_closer   rW   c             C   s   || _ || _d| _d| _d S )Nr   market_close)r   r   r   rV   )r.   r   r   r   r   r   r/      s    z time_rules.market_close.__init__N)r   rW   )r=   r>   r?   r/   r   r   r   r   r      s   r   c               @   s   e Zd ZdddZdS )ztime_rules.spot_timer   c             C   s   || _ || _|| _d| _d S )N	spot_time)r   r   r   rV   )r.   r   r   r   r   r   r   r/     s    ztime_rules.spot_time.__init__N)r   r   r   )r=   r>   r?   r/   r   r   r   r   r     s   r   N)r=   r>   r?   objectr   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 )
date_rulesc               @   s   e Zd Zdd ZdS )zdate_rules.every_dayc             C   s
   d| _ d S )N	every_day)rV   )r.   r   r   r   r/     s    zdate_rules.every_day.__init__N)r=   r>   r?   r/   r   r   r   r   r     s   r   c               @   s   e Zd ZdddZdS )zdate_rules.week_startr   c             C   s   || _ d| _d S )N
week_start)weekDayrV   )r.   days_offsetr   r   r   r/     s    zdate_rules.week_start.__init__N)r   )r=   r>   r?   r/   r   r   r   r   r     s   r   c               @   s   e Zd ZdddZdS )zdate_rules.week_endr   c             C   s   || _ d| _d S )Nweek_end)r   rV   )r.   r   r   r   r   r/     s    zdate_rules.week_end.__init__N)r   )r=   r>   r?   r/   r   r   r   r   r     s   r   c               @   s   e Zd ZdddZdS )zdate_rules.month_startr   c             C   s   || _ d| _d S )Nmonth_start)monthDayrV   )r.   r   r   r   r   r/   #  s    zdate_rules.month_start.__init__N)r   )r=   r>   r?   r/   r   r   r   r   r   "  s   r   c               @   s   e Zd ZdddZdS )zdate_rules.month_endr   c             C   s   || _ d| _d S )N	month_end)r   rV   )r.   r   r   r   r   r/   )  s    zdate_rules.month_end.__init__N)r   )r=   r>   r?   r/   r   r   r   r   r   (  s   r   N)	r=   r>   r?   r   r   r   r   r   r   r   r   r   r   r     s
   r   )sysr   pandasrG   r   	IBridgePyr   IBridgePy.constantsr   r   r&   r   r   rA   ro   rx   r~   r   r   r   r   r   <module>   s   Ah