B
     9-eEc                 @   s  d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlZddlZddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZmZmZ ddlmZ ddlmZ dddddddddddddZ ddd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\d2d3Z*d4d5 Z+d6d7 Z,d8d9 Z-d:d; Z.d<d= Z/d]d>d?Z0d@dA Z1dBdC Z2dDdE Z3dFdG Z4dHdI Z5dJdK Z6dLdM Z7dNdO Z8dPdQ Z9dRdS Z:dTdU Z;dVdW Z<dXdY Z=dZd[ Z>dS )^a)  
There is a risk of loss when trading stocks, futures, forex, options and other
financial instruments. Please trade with capital you can afford to
lose. Past performance is not necessarily indicative of future results.
Nothing in this computer program/code is intended to be a recommendation, explicitly or implicitly, and/or
solicitation to buy or sell any stocks or futures or options or any securities/financial instruments.
All information and computer programs provided here is for education and
entertainment purpose only; accuracy and thoroughness cannot be guaranteed.
Readers/users are solely responsible for how to use these information and
are solely responsible any consequences of using these information.

If you have any questions, please send email to IBridgePy@gmail.com
All rights reserved.
    N)copy)exit)Decimal)get_system_info)PROJECTBROKER_CLIENT)IBCpp)SymbolStatusExchangeName)Securityfrom_security_to_contractfrom_contract_to_security)ReqHistParam)IbridgePyOrder            <   x      i,  i  i  i  iQ )z1 secz5 secsz15 secsz30 secsz1 minz2 minsz3 minsz5 minsz15 minsz30 minsz1 hourz1 dayi iR i :L)SDWMYc             C   s   t | |} d }d|kr8| tjt|d d d d }nd|krb| tjt|d d d d }ntd|kr| tjt|d d d	 }nNd
|kr| tjt|d d d d }n$d|kr| | jt|d d  }|| fS )Nr   i  )secondsr      )daysr   )weeksr   r   r   )adjust_endTimedt	timedeltaintreplaceyear)endTimegoBackbarSize	startTime 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\IbridgepyTools.pycalculate_startTime;   s    
"""r-   c             C   s,   t t | d d t| dd    t|  S )Nr   )r$   ibGoBardLetterToSecondsMapbarSizeToSecondMap)r(   r)   r+   r+   r,   convert_goBack_barSizeK   s    r1   c             C   s   t | tkr*tj| d} td| } |dkr@| jdd} n`|t	j
jkr\| jddd} nD|dkrv| jdddd} n*|d	kr| jddddd
} n| jddd} | S )Nz%Y%m%d %H:%M:%S %ZUTCz1 secondr   )microsecond)secondr3   )z1 hourz4 hours)minuter4   r3   z1 day)hourr5   r4   r3   )typestrr"   datetimestrptimepytztimezonelocalizer%   r   ZBarSizeZONE_MIN)r'   r)   r+   r+   r,   r!   P   s    r!   c          	   C   sh   | j tjkr| S ttjtjtj	t
d}t|| j| j| jd| _t|| j| j| jd| _| S )zh
    security_info.csv must stay in this directory with this file
    :param security:
    :return:
    zsecurity_info.csvexchangeprimaryExchange)symbolStatusr	   SUPER_SYMBOLpdread_csvospathjoindirnamerealpath__file__search_security_in_filesecTypesymbolcurrencyr>   r?   )securityZ	stockListr+   r+   r,   3add_exchange_primaryExchange_to_security_deprecatedb   s    $rO   c             C   s   t | }|S )a2  
    IBridgePy::Trader has self.symbol that will be used by IBridgePy users.
    This symbol will be used by other purposes.
    For example, symbol in the following line
    histIngestionPlan.add(Plan(security=symbol('SPY'), barSize='1 min', fileName='xxx.csv'))
    :param str_security:
    :return:
    )from_symbol_to_security)str_securityrN   r+   r+   r,   rL   v   s    	rL   c              G   s$   g }x| D ]}| t| q
W |S )N)appendrL   )argsansitemr+   r+   r,   symbols   s    
rV   c             C   s   d| krd| f } |  dd  }|  dd  }|  dd  }|dkr^t|||dS td| f  td	 td
 t  d S )N,z
STK,%s,USDr   r   r   )CASHSTK)rK   rL   rM   zDefinition of %s is not clear!z/Please use superSymbol to define a str_securityz=http://www.ibridgepy.com/ibridgepy-documentation/#superSymbol)splitstripr   printr   )s1rK   tickerrM   r+   r+   r,   rP      s    
rP   c             C   s`  d| krt td  t  | d}|d  }|dkr~|d  }|d  }|d  }|d  }t|||||tjd	S |d
kr|d  }|d  }|d  }|d  }|d  }t||||||tjdS |d  }|d  }|d  }|d  }|d  }t|d  }|d  }	|d  }
t||||||||	|
tjd
S d S )NrW   z6::from_string_to_security: EXIT, format is not correctr   )rX   rY   r   r         )rK   rL   rM   r>   r?   r@   )FUTBONDr   )rK   rL   rM   r>   r?   expiryr@            )
rK   rL   rM   r>   r?   rc   strikeright
multiplierr@   )	r\   __name__r   rZ   r[   r   r	   STRING_CONVERTEDfloat)stZstListrK   r?   r>   r^   rM   rc   rg   rh   ri   r+   r+   r,   from_string_to_security   sB    




rn   USD         Fc             C   s   t |tsttd  t  t |ts8ttd  t  t |tsTttd  t  t |	tspttd  t  | dkrt|dkstt| |||||||||	|
t	j
dS )Nz,::superSymbol: EXIT, strike must be a float!z-::superSymbol: EXIT, expiry must be a string!z2::superSymbol: EXIT, localSymbol must be a string!z1::superSymbol: EXIT, multiplier must be a string!)ra   OPTrf   )rK   rL   rM   r>   localSymbolr?   rc   rg   rh   ri   includeExpiredr@   )
isinstancerl   r\   rj   r   r8   lenAssertionErrorr   r	   rA   )rK   rL   rM   r>   r?   rs   rc   rg   rh   ri   rt   r+   r+   r,   superSymbol   s"    



rx   c             C   s   t jt  d| }t|S )N	IBridgePy)rD   rE   rF   getcwdread_hash_config)fileNamefull_file_pathr+   r+   r,   read_in_hash_config   s    r~   c          	   C   sP   t j| r4t| }| }W d Q R X |d  S tdt| f  t  d S )Nr   z%hash.conf file is missing at %s. EXIT)	rD   rE   isfileopen	readlinesr[   r\   r8   r   )r}   fliner+   r+   r,   r{      s    
r{   c             C   s   | | d |k| d |k@ | d |k@  }|j d dkr|d jd }|d jd }|dkr~t|tkrx|dkrrd	S d S q|S q|dkrt|tkrd S |S ttd
|f   t  n0|j d dkrttd|||f   t  nd S d S )NSymbolrK   rM   r   r   r>   r?   rY   ZSMARTz6::search_security_in_file: EXIT cannot handle param=%szf::search_security_in_file: EXIT (%s %s %s) must be a unique combination in IBridgePy/security_info.csv)shapevaluesr7   rl   r\   rj   r   )dfrK   r^   rM   paramZtmp_dfr>   r?   r+   r+   r,   rJ      s,    (rJ   c             C   sb   | dkrdS |dkr6| dkr(| |d kS | |d kS n(|dkrF| |kS t td|f   t  d S )NanyTZ	monthWeekr   r   Z
hourMinutez(::_match: EXIT, cannot handle version=%s)r\   rj   r   )targetvalversionr+   r+   r,   special_match  s    r   c          	   C   s   xBdD ]:}yt |t| j| W q tk
r>   t |d Y qX qW x@dD ]8}yt |t| | W qJ tk
r   t |d Y qJX qJW d S )N)conIdrL   rK   LastTradeDateOrContractMonthrg   rh   ri   r>   rM   rs   r?   tradingClassrt   	secIdTypesecId	comboLegs	underCompcomboLegsDescripz	not found)&
marketNameminTickpriceMagnifier
orderTypesvalidExchanges
underConIdlongNamecontractMonthindustrycategorysubcategory
timeZoneIdtradingHoursliquidHoursevRuleevMultipliermdSizeMultiplieraggGroup	secIdListunderSymbolunderSecTypemarketRuleIdsrealExpirationDatecusipratings
descAppendbondType
couponTypecallableputablecouponconvertiblematurity	issueDatenextOptionDatenextOptionTypenextOptionPartialnotesznot found in contractDetails)r\   getattrsummaryAttributeError)contractDetailsrU   r+   r+   r,   display_all_contractDetails!  s    

r   c             C   sb  t |}t|tst|}i }|rJ|jtjkr8d|d< nttd  t  |dkr\d|d< n|dk rld|d< | |d< ||d	< t	t
||d
< |j|d< |j|d< t	|
|d< ||d< |d k	r||d< |d k	r||d< |d k	r||d< |	d k	r|	|d< |jdkrn<|jdkr|j|d< n"|jdkr8|j|d< n|jdkrZ|j|d< |j|d< n|jdkr|jd k	r||j|d< |jd k	r|j|d< |j|d< |d dkr|j|j |d< n|d dkr@|j|j |d< nd|jdkr,|jd k	r|j|d< |jd k	r|j|d< |jd k	r@|j|d< nttd|jf   d|d< d|d < t|||d!}|S )"NThiddenz6::create_order: EXIT, only ISLAND accept hidden ordersr   BUYactionSELLorderIdZaccounttotalQuantity	orderTypetiforderRef
outsideRthocaGroupocaTypetransmitparentId)MKTZMOCLMTZlmtPriceSTPZauxPricezSTP LMTzTRAIL LIMITZtrailingPercentZtrailStopPriceTRAILz/::create_order: EXIT,Cannot handle orderType=%sFZ
eTradeOnlyZfirmQuoteOnly)requestedContractrequestedOrdercreatedTime)r   ru   r   r>   r
   ISLANDr\   rj   r   r8   absr   r   Zlimit_priceZ
stop_priceZtrailing_amountZtrailing_percentZlimit_offsetr   )r   accountCoderN   amountZorderDetailsr   r   r   r   r   r   r   r   contractorderZan_orderr+   r+   r,   create_order=  sv    










r   c             C   s   t | }t|S )N)r   -stripe_exchange_primaryExchange_from_security)r   rN   r+   r+   r,   -stripe_exchange_primaryExchange_from_contract  s    r   c             C   s   t | }d|_d|_|S )Nrp   )r   r>   r?   )rN   Zcopy_securityr+   r+   r,   r     s    r   c             C   sj   | j dkrdddg}n*| j dkr.ddddg}nddddddd	g}x$|D ]}t| |t||krFd
S qFW dS )N)rY   rX   rK   rL   rM   ra   rc   rg   rh   ri   FT)rK   r   )Zsec1Zsec2itemsparar+   r+   r,   check_same_security  s    



r   c             C   s   i }t |tkr|g}x|D ]}|dkrdt| jd d j|rZt| jd d j|||< qd||< q|dkrt| jd d |rt| jd d |||< qd||< q|dkr| jd d dgf S ttd|f   t	  qW |S )	N)r   rL   rK   r   rg   rh   ri   r>   rM   rs   r?   r   rt   r   r   r   r   r   r   r   z	not found)&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   r   r   r   r   r   r   r   r   r   r   rN   z-::_extract_contractDetails: Invalid item = %s)
r7   r8   hasattrilocr   r   locr\   rj   r   )r   fieldrT   rU   r+   r+   r,   extract_contractDetails  s"    



r   c             C   s4   | dkrdS | dkrdS t td| f   t  d S )N)rY   ra   INDrb   ZTRADES)rX   rr   CFDZCONTFUTASKzM::request_historical_data: EXIT, security.secType=%s must specify whatToShow.)r\   rj   r   )rK   r+   r+   r,   choose_whatToShow  s    r   c             C   s2   | sdS d}x | D ]}|d|| | f 7 }qW |S )z

    :param decisions: a dict key = security object, value = int number of shares to buy or sell
    :return: str rep of decisions.
    zEmpty decisionrp   z%s:%s
r+   )Z	decisionsrT   rN   r+   r+   r,   print_decisions  s    
r   c             C   s:   dd }t || d}tj|dddgd}|d}|S )a  
    Convert market hours that are returned from get_contract_details to pd.DataFrame
    :param hoursString: market hours that are returned from get_contract_details
    :return: pd.DataFrame, columns=['open', 'close'] int=hour * 60 + minute; index=datetime.date
    c             S   s   i }d| kr|  d}|d  d\}}tj|d|d< t|dd d t|dd  |d	< |d
  dd
 }t|dd d t|dd  |d< n0|  d\}}tj|d|d< ||d	< ||d< |S )z
        Input looks like this, returned from get_contract_details
        20200724:0930-20200724:1600
        20200725:CLOSED
        -r   :z%Y%m%ddateNr   r   r   r   close)rZ   r"   r9   r:   r$   )xrT   x1abttr+   r+   r,   convert_one_day_hour_string  s    
(*z?convert_market_hours_to_df.<locals>.convert_one_day_hour_string;r   r   r   )columns)maprZ   rB   	DataFrame	set_index)ZhoursStringr   vddr+   r+   r,   convert_market_hours_to_df  s
    
r   c                sn   t  tjst| d  fdd| d< ttt| d }t	|d}|t
|krZd}| | d || k S )NrN   c                s   t j| jd  jS )Nz%Y%m%d)r"   r9   r:   rc   r   )r   )dt_targetExpiryr+   r,   <lambda>      z closest_expiry.<locals>.<lambda>expr   )ru   r"   r9   rw   applysortedlistsetbisectbisect_leftrv   )r   r   
sorted_expr   r+   )r   r,   closest_expiry  s    r	  c             C   sz   t |tjr| }t |tjr(| }t |tjs8tt |tjsHt| d dd | d< | | d |k| d |k@  S )NrN   c             S   s   t j| jd S )Nz%Y%m%d)r"   r9   r:   rc   r   )r   r+   r+   r,   r     r   z%choose_expiry_range.<locals>.<lambda>r  )ru   r"   r9   r   rw   r  )r   Zdt_startExpiry_inclusiveZdt_endExpiry_inclusiver+   r+   r,   choose_expiry_range  s    r
  c                s~   t  tst|  }|d  fdd|d< ttt|d }t	|d}|t
|kr`d}|j|d || kd d f S )NrN   c                s
   | j   S )N)rg   )r   )targetStriker+   r,   r     r   z closest_strike.<locals>.<lambda>rg   r   r   )ru   rl   rw   r   r  r  r  r  r  r  rv   r   )Zdffr  r   r  r   r+   )r  r,   closest_strike  s    r  c        
   	   C   s2  t  \} }}tjtjtjtddd}tj|ddd}t	|j
d d  }t	|j
d d  }t|j
d	 d  }|| ks||ks|t|krtd
| ||f  td|||f  td td|||f  t  t|j
d d  }d|jkr.t|d}	|	d W d Q R X |r.t  d S )Nz..ry   zidentity.csvr   )header	index_colsysvaluepythonr   zThe environment is "%s %s %s"z#IBridgePy package is for "%s %s %s"zThey don't match!zdPlease visit https://ibridgepy.com/download/ and download the correct IBridgePy package for %s %s %sstartupr   z
startup, False)r   rD   rE   rF   rG   abspathrI   rB   rC   r8   r   r[   r$   r\   r   boolindexr   writeupdate_docker_ip)
platform
pythonNameZpythonVersion	file_pathZdf_identityZibpySysZ
ibpyPythonZibpyVersionZisDockerr   r+   r+   r,   check_user_sys_compatibility  s$    "r  c           	   C   s   t jt jtd d} td dd r.d S t }|s<d S t| }| }W d Q R X d}x&t	t
|D ]}d||  krjP qjW |r|d |d  d| d	g ||d d   }t| d
}|d| W d Q R X d S )NrootFolderPathzsettings.py	IB_CLIENThostr   z'IB_CLIENT': {r   z        'host': 'z',
wrp   )rD   rE   rF   r   r   getfind_ipr   r   rangerv   r[   r  )PATHipr   linesir+   r+   r,   r  7  s     
.r  c             C   sF   t | }d }x2|dD ]$}d|ks.d|kr|dd }P qW |S )N
zprvt.dyno.rt.heroku.comzhost.docker.internal r   )
subprocess	getoutputrZ   )cmdresultrT   lnr+   r+   r,   find_docker_ipQ  s    
r.  c              C   s   t d} | st d} | S )Nzgetent ahostsz"getent ahosts host.docker.internal)r.  )r$  r+   r+   r,   r!  [  s    r!  )NNro   rp   rp   rp   rp   rq   rp   rp   F)NNNNrp   FF)?__doc__r  r9   r"   rD   r)  r   r  r   decimalr   pandasrB   r;   BasicPyLib.BasicToolsr   ZConfig.base_settingsr   r   ry   r   IBridgePy.constantsr	   r
   IBridgePy.quantopianr   r   r   &broker_client_factory.BrokerClientDefsr   Zmodels.Orderr   r0   r/   r-   r1   r!   rO   rL   rV   rP   rn   rx   r~   r{   rJ   r   r   r   r   r   r   r   r   r   r   r	  r
  r  r  r  r.  r!  r+   r+   r+   r,   <module>   s   '          

! 
I!
"

