B
     9-e                 @   s   d dl mZ d dlmZ d dlm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 )    )exit)IBCpp)PrintableIIc               @   s   e Zd ZdddZdS )TickPriceRecordNc             C   s"   || _ || _|| _|| _|| _d S )N)str_securitytickTypepricecanAutoExecute	timestamp)selfr   r   r   r	   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\models\Data.py__init__	   s
    zTickPriceRecord.__init__)N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd ZdS )TickSizeRecordc             C   s   || _ || _|| _d S )N)r   r   size)r   r   r   r   r   r   r   r      s    zTickSizeRecord.__init__N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd ZdS )TickStringRecordc             C   s   || _ || _|| _d S )N)r   r   value)r   r   r   r   r   r   r   r      s    zTickStringRecord.__init__N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd ZdS )TickOptionComputationRecordc             C   sF   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
d S )N)r   r   
tickAttrib
impliedVoldeltaoptPrice
pvDividendgammavegathetaundPrice)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r       s    z$TickOptionComputationRecord.__init__N)r   r   r   r   r   r   r   r   r      s   r   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )KeyedTickInfoRecordsz
    tickPrice, tickSize, tickString and tickOptionComputation
    All of them are stored in same way, 1st key = str_security and 2nd key = tickType.
    So that one KeyedTickInfoRecords is needed as a template for 4 records
    c             C   s   i | _ || _d S )N)keyedTickInfoRecordsfieldNameAsKey)r   r"   r   r   r   r   7   s    zKeyedTickInfoRecords.__init__c             C   sl   t | jdkrdt| f S d}x>| jD ]4}x.| j| D ] }|d||| j| | f 7 }q8W q(W |d d S )Nr   z Empty keyedTickInfoRecords id=%s z	%s:%s:%s
)lenr!   id)r   ansr   keyr   r   r   __str__;   s    $zKeyedTickInfoRecords.__str__c             C   s   t |ds$ttd|df   t  |j}t|tsPttdt|f   t  || jkrdi | j|< t || j	rt
|| j	}|| j| |< nttd|| j	f   t  d S )Nr   z+::update: EXIT, %s does not have attr of %sz6::update: EXIT, type of str_security=%s is not correct)hasattrprintr   r   r   
isinstancestrtyper!   r"   getattr)r   tickInfoRecordr   r(   r   r   r   updateD   s    



zKeyedTickInfoRecords.updatec             C   s
   || j kS )N)r!   )r   r   r   r   r   _hasSecurityW   s    z!KeyedTickInfoRecords._hasSecurityc             C   s   |  |o|| j| kS )N)r2   r!   )r   r   r   r   r   r   _hasSecurityAndTickTypeZ   s    z,KeyedTickInfoRecords._hasSecurityAndTickTypec             C   s@   |  }| ||r<t| j| | |r<t| j| | |S d S )N)
full_printr3   r*   r!   r/   )r   securityr   	fieldNamer   r   r   r   	get_value]   s
    zKeyedTickInfoRecords.get_valueN)
r   r   r   __doc__r   r)   r1   r2   r3   r7   r   r   r   r   r    0   s   	r    c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )DataFromServerz0
    The interface for outside world to use
    c             C   s:   t dd| _t dd| _t dd| _t dd| _i | _d S )Nr   )r"   )r    tickPriceRecordstickSizeRecordstickStringRecordstickOptionComputationRecordslatest_5_second_real_time_bar)r   r   r   r   r   p   s
    zDataFromServer.__init__c             C   s4   d}x"| j | jgD ]}|d|f 7 }qW |d d S )Nz#Print models::Data::DataFromServer
z%s
r$   )r:   r;   )r   r'   itemr   r   r   r)   w   s    zDataFromServer.__str__c             C   s~   t |tr| j| nbt |tr0| j| nJt |trH| j| n2t |tr`| j	| nt
tdt|   t  d S )Nz1::set_tickInfoRecord: EXIT, cannot handle type=%s)r,   r   r:   r1   r   r;   r   r<   r   r=   r+   r   r.   r   )r   r0   r   r   r   set_tickInfoRecord}   s    



z!DataFromServer.set_tickInfoRecordc          
   C   s"   ||||||||	|
d	| j |< d S )N)	timeopenhighlowclosevolumewapcountr
   )r>   )r   r   ZaTimeZ
price_openZ
price_highZ	price_lowZprice_closerF   rG   rH   r
   r   r   r   set_5_second_real_time_bar   s    z)DataFromServer.set_5_second_real_time_barc             C   s   |t jjt jjt jjt jjt jjt jjt jjgkrB| j	
|||S |t jjt jjt jjt jjgkrr| j
|||S |t jjt jjt jjt jjgkr| j
|||S |t jjt jjgkr| j
|||S ttd|f   t  d S )Nz,::get_value: EXIT, cannot handle tickType=%s)r   TickTypeASKBIDLASTOPENHIGHLOWCLOSEr:   r7   VOLUMEBID_SIZEASK_SIZE	LAST_SIZEr;   ASK_OPTION_COMPUTATIONBID_OPTION_COMPUTATIONLAST_OPTION_COMPUTATIONMODEL_OPTIONr=   OPTION_CALL_OPEN_INTERESTOPTION_PUT_OPEN_INTERESTr+   r   r   )r   r5   r   r6   r   r   r   r7      s    zDataFromServer.get_valuec             C   s   | j | d }|S )N)r>   getr4   )r   r5   r'   r   r   r   get_5_second_real_time_bar   s    z)DataFromServer.get_5_second_real_time_barN)
r   r   r   r8   r   r)   r@   rI   r7   r]   r   r   r   r   r9   k   s   r9   N)sysr   	IBridgePyr   BasicPyLib.Printabler   r   r   r   objectr   r    r9   r   r   r   r   <module>   s   	;