B
     9-eb7                 @   s   d dl mZ d dlmZ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dS )    )PrintableII)print_IBCpp_contractprint_IBCpp_order)OrderStatus)exitc               @   s    e Zd ZdZdd Zdd ZdS )OrderStatusRecordz<
    This class is to match the callback of orderStatus
    c             C   s\   t |tsttd  t  || _|| _|| _|| _|| _	|| _
|| _|| _|	| _|
| _d S )NzC::OrderStatusRecord::__init__: EXIT, ibpyOrderId must be an integer)
isinstancestrprint__name__r   _ibpyOrderIdstatusfilled	remainingavgFillPricepermIdparentIdlastFillPriceclientIdwhyHeld)selfibpyOrderIdr   r   r   r   r   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\Order.py__init__   s    
zOrderStatusRecord.__init__c             C   s   | j S )N)r   )r   r   r   r   getIbpyOrderId*   s    z OrderStatusRecord.getIbpyOrderIdN)r   
__module____qualname____doc__r   r   r   r   r   r   r      s   r   c               @   s    e Zd ZdZdd Zdd ZdS )OpenOrderRecordz:
    This class is to match the callback of openOrder
    c             C   s8   t |tsttd  t  || _|| _|| _|| _dS )z
        Called back from IB server
        :param ibpyOrderId: string
        :param contract: IBCpp::Contract
        :param order:  IBCpp::Order
        :param orderState: IBCpp::OrderStatus
        zA::OpenOrderRecord::__init__: EXIT, ibpyOrderId must be an integerN)	r   r	   r
   r   r   r   contractorder
orderState)r   r   r    r!   r"   r   r   r   r   2   s    
zOpenOrderRecord.__init__c             C   s   | j S )N)r   )r   r   r   r   r   C   s    zOpenOrderRecord.getIbpyOrderIdN)r   r   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S )ExecDetailsRecordz<
    This class is to match the callback of execDetails
    c             C   s2   t |tsttd  t  || _|| _|| _d S )NzC::ExecDetailsRecord::__init__: EXIT, ibpyOrderId must be an integer)r   r	   r
   r   r   r   r    	execution)r   r   r    r$   r   r   r   r   K   s    
zExecDetailsRecord.__init__c             C   s   | j S )N)r   )r   r   r   r   r   T   s    z ExecDetailsRecord.getIbpyOrderIdN)r   r   r   r   r   r   r   r   r   r   r#   G   s   	r#   c               @   s\   e Z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d Zdd ZdS )KeyedIbridgePyOrdersc             C   s   i | _ || _|| _d S )N)keyedIbridgePyOrdersaccountCode_log)r   r'   logr   r   r   r   Y   s    zKeyedIbridgePyOrders.__init__c             C   s@   t | jdkrdS d}x$| jD ]}|d|| j| f 7 }qW |S )Nr   zEmpty KeyedIbridgePyOrdersz$models::Order::KeyedIbridgePyOrders
z%s:%s
)lenr&   )r   ansr   r   r   r   __str__^   s    zKeyedIbridgePyOrders.__str__c             C   s   || j krt|| j |< n d S )N)r&   IbridgePyOrder)r   r   r   r   r   createFromPlaceOrderf   s    
z)KeyedIbridgePyOrders.createFromPlaceOrderc             C   sF   | j td|f   | }|| jkr6t|| j|< || j| _d S )Nz?::KeyedIbridgePyOrders::updateFromOpenOrder: openOrderRecord=%s)r(   notsetr   r   r&   r-   openOrderRecord)r   r0   r   r   r   r   updateFromOpenOrdern   s
    
z(KeyedIbridgePyOrders.updateFromOpenOrderc             C   s0   |  }|| jkr t|| j|< || j| _d S )N)r   r&   r-   orderStatusRecord)r   r2   r   r   r   r   updateFromOrderStatusu   s    
z*KeyedIbridgePyOrders.updateFromOrderStatusc             C   s0   |  }|| jkr t|| j|< || j| _d S )N)r   r&   r-   execDetailsRecord)r   r4   r   r   r   r   updateFromExecDetails|   s    
z*KeyedIbridgePyOrders.updateFromExecDetailsc             C   s
   || j kS )N)r&   )r   r   r   r   r   has_ibpyOrderId   s    z$KeyedIbridgePyOrders.has_ibpyOrderIdc             C   s8   |  |r| j| S | jtd| j|f   t  dS )z
        Get ibridgePyOrder, Must return one, Otherwise exit
        :param ibpyOrderId:
        :return: models::Order::IbridgePyOrder
        zK::get_ibridgePyOrder: EXIT, cannot get order. accountCode=%s ibpyOrderId=%sN)r6   r&   r(   errorr   r'   r   )r   r   r   r   r   get_ibridgePyOrder   s    

z'KeyedIbridgePyOrders.get_ibridgePyOrderc             C   s   t | j S )N)listr&   keys)r   r   r   r   get_all_ibpyOrderId   s    z(KeyedIbridgePyOrders.get_all_ibpyOrderIdc             C   s
   i | _ d S )N)r&   )r   r   r   r   delete_every_order   s    z'KeyedIbridgePyOrders.delete_every_orderN)r   r   r   r   r,   r.   r1   r3   r5   r6   r8   r;   r<   r   r   r   r   r%   X   s   r%   c               @   s  e Zd Zd2ddZdd Zedd Zedd	 Zed
d Zedd Z	edd Z
edd Zedd Zedd Zdd Zdd Zdd Zedd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d- Zed.d/ Zed0d1 ZdS )3r-   Nc             C   sR   |d k	r$t |ts$ttd  t  || _d | _d | _d | _|| _	|| _
|| _d S )Nz>::IbridgePyOrder::__init__: EXIT, ibpyOrderId must be a string)r   r	   r
   r   r   r   r0   r2   r4   requestedContractrequestedOrdercreated)r   r   r=   r>   createdTimer   r   r   r      s    zIbridgePyOrder.__init__c             C   s.  | j d k	r,d| j| jt| j t| jf }n| jd krNd|  | jddf }n| ddkr| jj	d dkrd|  | jt| jj	t| jj
f }n&d|  | jt| jj	t| jj
f }nn| jj	d dkrd|  | jt| jj	t| jj
| df }n.d	|  | jt| jj	t| jj
| df }|S )
Nz/{ibpyOrderId=%s status=%s order=%s contract=%s}NONEr    orderId)r   z*{permId=%s status=%s order=%s contract=%s}z:{ibpyOrderId=%s status=%s order=%s contract=%s whyHeld=%s}z6{permId=%s status=%s order=%s contract=%s  whyHeld=%s})r>   r   r   r   r   r=   r0   r   get_value_by_tagr!   r    )r   r+   r   r   r   r,      s,    

zIbridgePyOrder.__str__c             C   s   | j S )N)r   )r   r   r   r   rC      s    zIbridgePyOrder.orderIdc             C   s   | j d k	r| j jS tjS d S )N)r2   r   r   PRESUBMITTED)r   r   r   r   r      s    
zIbridgePyOrder.statusc             C   s$   | j d k	r| j jd S | jd S d S )NtotalQuantity)r0   r!   r>   )r   r   r   r   amount   s    
zIbridgePyOrder.amountc             C   s   | j d k	r| j jS d S d S )N)r2   r   )r   r   r   r   r      s    
zIbridgePyOrder.filledc             C   s   | j d k	r| j jS d S d S )N)r2   r   )r   r   r   r   r      s    
zIbridgePyOrder.remainingc             C   s   | j d k	r| j jS d S d S )N)r2   r   )r   r   r   r   r      s    
zIbridgePyOrder.avgFillPricec             C   s
   |  dS )Nr   )rE   )r   r   r   r   r      s    zIbridgePyOrder.lastFillPricec             C   s"   | j d k	r| j jdd S d S d S )Naction)r0   r!   get)r   r   r   r   rI      s    
zIbridgePyOrder.actionc             C   s$   | j r| j jddS | jd S dS )zA
        get IBCpp::Order().orderId
        :return: int
        rC   N)r0   r!   rJ   r>   )r   r   r   r   getIbOrderId   s    zIbridgePyOrder.getIbOrderIdc             C   s   | j S )z@
        get IBridgePy order id
        :return: string
        )r   )r   r   r   r   r      s    zIbridgePyOrder.getIbpyOrderIdc             C   s   t | |rt| |S |dkrF| jr.t| j|S ttd|f   dS nz|dkrZt| j|S |dkr| jrx| jj|dS t| j	|S n:|dkrt| jj
|S |dkr| S ttd	|f   t  dS )
z
        Convenient function for IBridgePy internal
        :param tag: str, name of the field
        :return: value of the field of the given tag
        )	r   r   r   r   r   r   r   r   r   zy::get_value_by_tag: missing orderStatusRecord tag=%s return empty string to mitigate the issue that comes from IB server.rB   )r$   )	orderTypeorderReftifocaGroupocaTypeaccountN)	symbolsecTypeexchangeprimaryExchangeexpiry
multiplierrightstrikelocalSymbolr-   z5::IbridgePyOrder::get_value: EXIT, cannot find tag=%s)hasattrgetattrr2   r
   r   r4   r0   r!   rJ   r>   r    r   )r   tagr   r   r   rE     s&    

zIbridgePyOrder.get_value_by_tagc             C   s   d d S )Nr   )r   r   r   r   sid'  s    zIbridgePyOrder.sidc             C   s   t d S )N)NotImplementedError)r   r   r   r   limit_reached+  s    zIbridgePyOrder.limit_reachedc             C   s   t d S )N)r_   )r   r   r   r   stop_reached/  s    zIbridgePyOrder.stop_reachedc             C   s   | j d k	r| j jjS d S d S )N)r4   r$   time)r   r   r   r   
filledTime3  s    

zIbridgePyOrder.filledTimec             C   s"   | j d k	r| j jdd S d S d S )NauxPrice)r0   r!   rJ   )r   r   r   r   stop:  s    
zIbridgePyOrder.stopc             C   s$   | j d k	r| j jd S | jd S d S )NlmtPrice)r0   r!   r>   )r   r   r   r   limitB  s    
zIbridgePyOrder.limitc             C   s   | j d k	r| j jjS d S d S )N)r0   r"   
commission)r   r   r   r   rh   I  s    

zIbridgePyOrder.commissionc             C   s   | j d k	r| j jS | jS d S )N)r0   r    r=   )r   r   r   r   r    P  s    
zIbridgePyOrder.contractc             C   s   | j d k	r| j jS | jS d S )N)r0   r!   r>   )r   r   r   r   r!   W  s    
zIbridgePyOrder.orderc             C   s   | j d k	r| j jS d S d S )N)r0   r"   )r   r   r   r   r"   ^  s    
zIbridgePyOrder.orderStatec             C   s"   | j d k	r| j jdd S d S d S )Nr   )r0   r!   rJ   )r   r   r   r   parentOrderIde  s    
zIbridgePyOrder.parentOrderId)NNNN)r   r   r   r   r,   propertyrC   r   rH   r   r   r   r   rI   rK   r   rE   r^   r`   ra   rc   re   rg   rh   r    r!   r"   ri   r   r   r   r   r-      s0   

!r-   N)BasicPyLib.Printabler   models.utilsr   r   IBridgePy.constantsr   sysr   r   r   r#   objectr%   r-   r   r   r   r   <module>   s   @