a
     9-e4                     @   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\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
fv rP|   nL| jjtjfv 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rt	
| 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rt	
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   ^   s>    	





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 rU   )r   Zterminate_all_clients)r-   r/   r/   r0   	terminate   s    zMarketManager.terminateN)T)
r   
__module____qualname__r1   r?   r6   r8   r:   rX   rY   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&fv r>| j#| j_'| j | _(t)*| j+j,| _-t.| j/j0d | j| _1|r|2|  || _3| jjt4j5t4j6fv rt7|  | 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)logInMemoryra   ZBalanceLog_)r^   r_   ra   r`   rb   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   rb   ZdateTimeStrZsysLogFileNamer/   r/   r0   setup_services   sX    



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initPortfolioValuerm   Zset_updateAccountValuer
   )r.   r   r   Z	initValuer/   r/   r0    setup_backtest_account_init_info   s$    


r   )r!   r    rg   re   rd   rr   ry   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