B
     9-eª4  ã               @   s¸   d dl Zd dlZd dlZd dlZd dlZd dl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mZmZ d dlmZ d dlmZ d dlmZ G d	d
„ d
eƒZdd„ Zdd„ ZdS )é    N)ÚRepeaterÚEvent)ÚIbpyEmailClient)ÚSimpleLogger)ÚTraderRunModeÚLogLevelÚBrokerClientNameÚLiveBacktest)ÚUpdateAccountValueRecord)ÚDataFromServer)ÚSingleTraderc               @   sF   e Z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S )ÚMarketManagerc             C   sº   || _ |j| _|j| _|jj| _|jj| _|jj| _|j| _|j	| _	|j
| _
|jj| _|jj| _|j| _| j td ¡ tj ¡ | _d| _|jj| _|jj| _|j| _|j| _|j| _ dS )a“  
        Change to this way because MarketManager is used to run multiple fileNames
        Trader is not combined into userConfig because trader.funcs needs to be exposed to users
        If dataProvider is IB or other real dataProvider, a client to the dataProvider is needed.
        In this case, userConfig_dataProvider is needed to build a dataProvider that has a valid dataProviderClient
        z
::__init__r   N)!Ú_userConfigÚlogÚ_logÚtraderÚprojectConfigÚshowTimeZoneÚ
repBarFreqÚaccountCodeÚrepeaterConfigÚmarketManagerConfigÚtraderConfigÚrootFolderPathÚliveOrBacktestÚ_liveOrBacktestÚmarketCalendarÚ_marketCalendarÚdebugÚ__name__ÚdtÚdatetimeÚnowZlastCheckConnectivityTimeZnumberOfConnectionÚautoReconnectPremiumÚ_autoReconnectPremiumÚautoReconnectFreqÚ_autoReconnectFreqÚ
balanceLogÚ_balanceLogÚtransactionLogÚ_transactionLogÚuserLogÚ_userLog)ÚselfÚ
userConfig© 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\MarketManagerBase.pyÚ__init__   s(    






zMarketManager.__init__Tc             C   sà   | j  td| jjf  ¡ | j ¡  |r2| j ¡  | jjtj	tj
gkrP|  ¡  nL| jjtjgkrj|  ¡  n2| jjtjkr‚|  ¡  n| j  td| jjf  ¡ | j ¡  | j ¡  | j  ¡  | j ¡  | j  | jjj› d¡ d S )Nz::run: START, runMode=%sz,::run: cannot handle traderConfig.runMode=%sz END)r   r   r   r   ÚrunModer   ÚconnectZinitialize_Functionr   ÚREGULARÚSUDO_RUN_LIKE_QUANTOPIANÚrun_regularÚRUN_LIKE_QUANTOPIANÚrun_qÚHFTÚrun_hftÚerrorr(   Zwrite_all_messages_to_filer*   r,   Úinfor   r   ÚfileName)r-   Úrun_initr/   r/   r0   Úrun2   s     








zMarketManager.runc             C   s”   | j  td ¡ t| jj| jj| jj| j ƒ}t	 
| jj| jj¡}t	 
| j| jj¡}| |¡ | |¡ | jrˆt	 
| j| jj¡}| |¡ | ¡  dS )zs
        Run handle_data every second(configurable), ignoring any market time or holidays
        :return:
        z::run_regularN)r   r   r   r   r   ÚslowdownInSecondr   Úget_next_timeÚgetWantToEndr   ÚRepeatedEventr   ÚbaseFreqOfProcessMessageÚprocessMessagesr   Úrepeat_FunctionÚschedule_eventr$   r&   Úget_heart_beatsÚrepeat)r-   ÚreÚ	repeater1Ú	repeater2Z	repeater3r/   r/   r0   r6   G   s    


zMarketManager.run_regularc             C   s  | j  td ¡ t| jj| jj| jj| j ƒ}t	 
| jj| jj¡}t	j
| j| jj| jjd}t	j| jj| jjd| jj| jjd}| jtjkrÊ| |¡ | |¡ | |¡ | jrÈt	 
d| jj¡}| |¡ nF| jtjkrö| |¡ | |¡ | |¡ n| j  d| jf ¡ tƒ  |  ¡  dS )z©
        Run handle_data every minute when US market is open, observing market time or holidays configured by setting.MARKET_MANAGER.marketName
        :return:
        z::run_q)ÚpassFuncr   )ZonSecondZdo_somethingrM   é<   z%Cannot handle self._liveOrBacktest=%sN)!r   r   r   r   r   r@   r   rA   rB   r   rC   r   rD   rE   r   rF   r   Zis_market_open_at_this_momentZSpotTimeEventÚbeforeTradeStartHourÚbeforeTradeStartMinuteZbefore_trade_start_FunctionÚisTradingDayr   r	   ÚLIVErG   r$   rH   ÚBACKTESTr;   ÚexitrI   )r-   rJ   rK   rL   Z	repeater4Z	repeater5r/   r/   r0   r8   ^   s8    





zMarketManager.run_qc             C   sV   t | j| jj| jj| jƒ}t | jj¡}t | jj	¡}| 
|¡ | 
|¡ | ¡  d S )N)r   r   r   rA   rB   r   r   ZHftEventrE   rF   rG   rI   )r-   rJ   rK   rL   r/   r/   r0   r:      s    

zMarketManager.run_hftc             C   s4   | j  d¡ | j ¡  ¡  ¡  |¡ | j  d¡ d S )Nz&####     Data ingestion starts    ####z)####     Data ingestion COMPLETED    ####)r   r<   r   ZgetBrokerServiceÚgetBrokerClientZgetDataProviderZingest_hists)r-   ÚhistIngestionPlanr/   r/   r0   Úingest_historical_data™   s    z$MarketManager.ingest_historical_datac             C   s   | j  ¡  d S )N)r   Zterminate_all_clients)r-   r/   r/   r0   Ú	terminatež   s    zMarketManager.terminateN)T)
r   Ú
__module__Ú__qualname__r1   r?   r6   r8   r:   rW   rX   r/   r/   r/   r0   r      s   
/r   c             C   s¤  t  t› d¡ d}| jjtjkr&d}t d¡}dt d¡ d }t	d| d d	t
j | jjd
¡dd| _t	|| jj|| d| _t	d| d d	dt
j | jjd
¡|d| _t	d| d d	dt
j | jjd
¡|d| _| j | j¡| _t| jƒ| _tƒ | _| j | ¡| _t | ¡| _ | j! "| ¡| _#| jj$t%j&gkr>| j#| j_'| j | _(t) *| j+j,¡| _-t.| j/j0d | jƒ| _1|r‚| 2| ¡ || _3| jjt4j5t4j6gkr t7| ƒ | S )zœ
    stay here to avoid cyclic imports
    trader  <----> brokerService -----> brokerClient <-----> dataProvider
             ----> dataProviderService
    z::setup_servicesFTz%Y_%m_%d_%H_%M_%SZ
TraderLog_z%Y-%m-%dz.txtZuserLog_ÚNOTSETÚOutput)ÚfilenameÚlogLevelÚ
folderPathÚaddTime)ÚlogInMemoryr`   ZBalanceLog_)r]   r^   r`   r_   ra   ZTransactionLog_ÚapiKey)8Úloggingr   r   r   r   r	   rS   ÚtimeÚstrftimer   ÚosÚpathÚjoinr   r+   r^   r   r'   r)   ÚtimeGeneratorFactoryZget_timeGeneratorÚtimeGeneratorConfigÚtimeGeneratorr   ÚsingleTraderr   ÚdataFromServerÚbrokerClientFactoryÚget_brokerClient_by_userConfigÚbrokerClientÚbroker_service_factoryZget_brokerServiceÚbrokerServiceÚdataProviderFactoryZget_dataProvider_by_userConfigÚdataProviderÚnamer   ÚLOCALZ_dataProviderÚdataProviderServiceÚmarket_calendar_factoryZget_marketCalendarr   Ú
marketNamer   r   ÚemailClientConfigÚIBRIDGEPY_EMAIL_CLIENTÚemailClientZupdate_from_userConfigr   r   ÚDEBUGr[   Úprint)r.   r   ra   ZdateTimeStrZsysLogFileNamer/   r/   r0   Úsetup_services¢   sP    






r   c          	   C   sn   | j j}| j j}t| jjƒ}| j ||td|d|ƒ¡ | j ||td|d|ƒ¡ | j ||tddd|ƒ¡ d S )NZTotalCashValueÚUSDZNetLiquidationZGrossPositionValueg        )	r   Ú
brokerNamer   ÚfloatÚbacktesterConfigÚinitPortfolioValuerl   Zset_updateAccountValuer
   )r.   r   r   Z	initValuer/   r/   r0   Ú setup_backtest_account_init_infoê   s    


r…   )r!   r    rf   rd   rc   rq   rx   ZBasicPyLib.repeaterr   r   ZBasicPyLib.sendEmailr   ZBasicPyLib.simpleLoggerr   ÚIBridgePy.constantsr   r   r   r	   Zmodels.AccountInfor
   Zmodels.Datar   Zmodels.SingleTraderr   Úobjectr   r   r…   r/   r/   r/   r0   Ú<module>   s     H