Ë
    ?å®j„
  ã                  ó<   — d dl mZ d dlZd dlmZmZ  G d„ d«      Zy)é    )ÚannotationsN)ÚdefaultdictÚdequec                  ó*   — e Zd ZdZddd„Zdd„Zd	d„Zy)
ÚPaperTraderzHLong-only moving-average paper trader with a fixed virtual cash balance.c                ó  ‡— d|cxk  rdk  rn t        d«      ‚|‰k\  rt        d«      ‚t        |«      | _        t        |«      | _        || _        ‰| _        || _        t        ˆfd„«      | _        i | _	        g | _
        y )Nr   é   zFallocation must be in (0, 1] and fast_window must be below slow_windowc                 ó   •— t        ‰ ¬«      S )N)Úmaxlen)r   )Úslow_windows   €úpaper_trader.pyú<lambda>z&PaperTrader.__init__.<locals>.<lambda>   s   ø€ ÄEÐQ\ÔD]€ ó    )Ú
ValueErrorÚfloatÚinitial_cashÚcashÚfast_windowr   Ú
allocationr   ÚhistoryÚ	positionsÚtrades)Úselfr   r   r   r   s      ` r   Ú__init__zPaperTrader.__init__
   s{   ø€ Ø�:Ô" Ô"ÜÐeÓfÐfð '2°[Ò&@ÜÐeÓfÐfÜ! $›KˆÔÜ˜$“KˆŒ	Ø&ˆÔØ&ˆÔØ$ˆŒÜ0;Ó<]Ó0^ˆŒØ68ˆŒØ"$ˆ�r   c                óp  — | j                   |   }|j                  t        |«      «       t        |«      | j                  k  ry t        t        |«      | j                   d  «      | j                  z  }t        |«      | j                  z  }| j                  j                  |«      }||kD  r–|€”| j                  | j                  z  }||z  }| xj                  |z  c_
        |t        |«      dœ| j                  |<   | j                  j                  t        t        j                  «       «      |dt        |«      |dœ«       y||k  rr|�p|d   }| xj                  ||z  z  c_
        | j                  |= | j                  j                  t        t        j                  «       «      |dt        |«      |dœ«       yy )N)ÚquantityÚentry_priceÚbuy)ÚtimeÚpairÚsideÚpricer   r   Úsell)r   Úappendr   Úlenr   ÚsumÚlistr   r   Úgetr   r   r   Úintr   )	r   r    r"   ÚpricesÚfastÚslowÚpositionÚspendr   s	            r   ÚstepzPaperTrader.step   s‡  € Ø—‘˜dÑ#ˆØ�‰”e˜E“lÔ#Üˆv‹;˜×)Ñ)Ò)ØÜ”4˜“< ×!1Ñ!1Ð 1Ð 2Ð3Ó4°t×7GÑ7GÑGˆÜ�6‹{˜T×-Ñ-Ñ-ˆØ—>‘>×%Ñ% dÓ+ˆØ�$Š;˜8Ð+Ø—I‘I §¡Ñ/ˆEØ˜u‘}ˆHØ�IŠI˜Ñ�IØ08ÌÈuËÑ#VˆD�N‰N˜4Ñ Ø�K‰K×Ñ¬¬D¯I©I«KÓ(8À$ÐPUÔ`eÐfkÓ`lð  {Cñ   Dô  EØØ�$Š;˜8Ð/Ø 
Ñ+ˆHØ�IŠI˜ EÑ)Ñ)�IØ—‘˜tÐ$Ø�K‰K×Ñ¬¬D¯I©I«KÓ(8À$ÐPVÔafÐglÓamð  |Dñ   Eô  FØØr   c                ón  ‡— t        ˆfd„| j                  j                  «       D «       «      }| j                  |z   }| j                  | j                  |||| j                  z  dz
  dz  | j                  j                  «       | j                  dd  d| j                  | j                  | j                  dœdœS )Nc              3  óZ   •K  — | ]"  \  }}|d    ‰j                  ||d   «      z  –— Œ$ y­w)r   r   N)r(   )Ú.0r    Úposr*   s      €r   ú	<genexpr>z'PaperTrader.snapshot.<locals>.<genexpr>.   s1   øè ø€ ÒzÑV_ÐVZÐ\_˜3˜z™?¨V¯Z©Z¸¸cÀ-Ñ>PÓ-QÕQÑzùs   ƒ(+r	   éd   iìÿÿÿzMoving-average crossover)Únamer   r   r   )r   r   Úmarket_valueÚequityÚ
return_pctr   r   Ústrategy)
r&   r   Úitemsr   r   Úcopyr   r   r   r   )r   r*   r7   r8   s    `  r   ÚsnapshotzPaperTrader.snapshot-   s¶   ø€ ÜÓzÐcg×cqÑcq×cwÑcwÓcyÔzÓzˆØ—‘˜\Ñ)ˆà ×-Ñ-Ø—I‘IØ(ØØ! D×$5Ñ$5Ñ5¸Ñ9¸SÑ@ØŸ™×,Ñ,Ó.Ø—k‘k # $Ð'Ø!;ÈD×L\ÑL\Ðmq×m}Ñm}ð  NR÷  N]ñ  N]ñ  ^ñ	
ð 		
r   N)i'  é   é   g      Ð?)r   r   r   r)   r   r)   r   r   )r    Ústrr"   r   Úreturnz
str | None)r*   zdict[str, float]rA   Údict)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   r=   © r   r   r   r      s   „ ÙRô
%óô.
r   r   )Ú
__future__r   r   Úcollectionsr   r   r   rG   r   r   ú<module>rJ      s   ðÝ "ã ß *÷2
ò 2
r   