B
     9-eÜ  ã               @   sL   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d	S )
é    )Úexit)Úcheck_same_securityc               @   s    e Zd Zdd„ Zedd„ ƒZdS )ÚContextc             C   s\   || _ i | _|| _x| jD ]}t||ƒ| j|< qW t| jƒdkrRt| jƒd | _nd | _d S )Né   r   )ÚparentTraderÚ
portfolioQÚaccountCodeSetÚ	PortfolioÚlenÚlistÚaccountCode)Úselfr   r   ÚacctCode© 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\trader_defs.pyÚ__init__   s    zContext.__init__c             C   s   | j | j S )N)r   r   )r   r   r   r   Ú	portfolio   s    zContext.portfolioN)Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr   r   r   r   r   r      s   r   c               @   sP   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d„ Z
dd„ ZdS )Ú	Positionsz÷
    Learned from Quantopian
    When there is no position, it is an empty dict.
    When key is missing, it creates an instance.
    IBridgePy take advantage of __missing__ to process something like context.portfolio.positions[symbol('SPY')]
    c             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r       s    zPositions.__init__c             C   s   | j  || j¡S )N)r   Úget_positionr   )r   Úsecurityr   r   r   Ú__missing__$   s    zPositions.__missing__c             C   s   | j  | j¡}t|ƒS )N)r   Úget_all_positionsr   r
   )r   ÚallPositionsr   r   r   Ú__len__'   s    zPositions.__len__c             C   s   | j  | j¡}t|ƒS )N)r   r   r   Ústr)r   r   r   r   r   Ú__str__+   s    zPositions.__str__c             c   s   x|   ¡ D ]
}|V  q
W d S )N)Úkeys)r   Úctr   r   r   Ú__iter__/   s    zPositions.__iter__c             C   s$   x|   ¡ D ]}t||ƒr
dS q
W dS )NTF)r    r   )r   Úitemr   r   r   r   Ú__contains__3   s    
zPositions.__contains__c             C   s   | j  | j¡}t| ¡ ƒS )N)r   r   r   r   r    )r   r   r   r   r   r    9   s    zPositions.keysc             C   s   | j  | j¡}t| ¡ ƒS )N)r   r   r   r   Úitems)r   r   r   r   r   r%   =   s    zPositions.itemsN)r   r   r   Ú__doc__r   r   r   r   r"   r$   r    r%   r   r   r   r   r      s   r   c               @   sh   e Z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dS )r	   c             C   s,   || _ || _d| _d | _t| j | jƒ| _d S )Nr   )r   r   Ústarting_cashÚ	startDater   Ú	positions)r   r   r   r   r   r   r   C   s
    zPortfolio.__init__c             C   s(   | j dkrttd ƒ tƒ  | j | j S )Nr   z9::Portfolio::returns: start_cash is not initialized, EXIT)r'   Úprintr   r   Úcash)r   r   r   r   Úcapital_usedJ   s    
zPortfolio.capital_usedc             C   s   | j  ¡  | jd¡S )NÚTotalCashValue)r   ÚgetBrokerServiceÚget_account_infor   )r   r   r   r   r+   Q   s    zPortfolio.cashc             C   s   | j  ¡  | jd¡S )NZUnrealizedPnL)r   r.   r/   r   )r   r   r   r   ÚpnlU   s    zPortfolio.pnlc             C   s   | j  ¡  | jd¡S )NÚNetLiquidation)r   r.   r/   r   )r   r   r   r   Úportfolio_valueY   s    zPortfolio.portfolio_valuec             C   s   | j  ¡  | jd¡S )NÚGrossPositionValue)r   r.   r/   r   )r   r   r   r   Úpositions_value]   s    zPortfolio.positions_valuec             C   s.   | j dkrttd ƒ tƒ  | j| j  | j  S )Nr   z9::Portfolio::returns: start_cash is not initialized, EXIT)r'   r*   r   r   r2   )r   r   r   r   Úreturnsa   s    
zPortfolio.returnsc             C   s"   | j d krttd ƒ tƒ  | j S )Nz<::Portfolio::start_date: start_date is not initialized, EXIT)r(   r*   r   r   )r   r   r   r   Ú
start_dateh   s    
zPortfolio.start_dateN)r   r   r   r   r   r,   r+   r0   r2   r4   r5   r6   r   r   r   r   r	   B   s   r	   N)	Úsysr   ÚIBridgePy.IbridgepyToolsr   Úobjectr   Údictr   r	   r   r   r   r   Ú<module>   s   +