ó
    ´]ßjX  ã                  ó|   • S r SSKJr  SSKJr  SSKJrJrJr   " S S\5      r	\ " S S5      5       r
 " S	 S
5      rg)z1Risk controls: kill switch, inventory, fills/day.é    )Úannotations)Ú	dataclass)ÚAnyÚOptionalÚProtocolc                  óP   • \ rS rSrS	S jrS	S jrS
S jrS	S jr\SS j5       r	Sr
g)Ú
EngineLikeé   c                ó   • g ©N© ©ÚselfÚmids     Úsrc/risk.pyÚday_pnl_pctÚEngineLike.day_pnl_pct	   s   € °ó    c                ó   • g r   r   r   s     r   Úday_pnlÚEngineLike.day_pnl
   s   € ¨Cr   c                ó   • g r   r   ©r   s    r   Úfills_todayÚEngineLike.fills_today   s   €  #r   c                ó   • g r   r   r   s     r   ÚequityÚEngineLike.equity   s   € ¨3r   c                ó   • g r   r   r   s    r   ÚstateÚEngineLike.state   s   € Ør   r   N)r   ÚfloatÚreturnr"   )r#   Úint)r#   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r   r   Úpropertyr    Ú__static_attributes__r   r   r   r	   r	      s   † Ü3Ü/Ü%Ü.àÛó Ûr   r	   c                  óN   • \ rS rSr% SrS\S'   SrS\S'   SrS\S'   SrS	\S
'   Sr	g)ÚRiskDecisioné   TÚboolÚ	allow_bidÚ	allow_askFÚkilledÚ ÚstrÚreasonr   N)
r%   r&   r'   r(   r/   Ú__annotations__r0   r1   r4   r*   r   r   r   r,   r,      s*   ‡ à€IˆtÓØ€IˆtÓØ€FˆDÓØ€FˆCÖr   r,   c                  ó>   • \ rS rSr S   SS jjrS	S jrS
S jrSrg)ÚRiskManageré   Nc                ón   • Xl         X l        SU l        SU l        Uc  S U l        g [	        U5      U l        g )NFr2   )ÚcfgÚcapitalr1   r4   r"   Úmax_inventory_btc)r   r:   Úcapital_usdr<   s       r   Ú__init__ÚRiskManager.__init__   s?   € ð ŒØ"ŒØˆŒØˆŒð &Ñ-ˆDð 	ÕÜ38Ð9JÓ3Kð 	Õr   c           	     ó¤  • U R                   (       a  [        SSSU R                  5      $ UR                  U5      nX0R                  R
                  ::  ac  SU l         SUS SU R                  R
                   SUR                  U5      S SU R                  S	 S
3	U l        [        SSSU R                  5      $ UR                  5       U R                  R                  :¼  a=  SU l         SU R                  R                   3U l        [        SSSU R                  5      $ [        UR                  R                  =(       d    S5      n[        U5      U-  nSnSnSnSU R                  R                  -  n	XY:¼  a  US:”  a  SOSn
SU
 SUS	 S3n[        U R                  R                  5      nX[:¼  a  US:”  a  SnSnOSnSnU R                  nUb,  US:”  a&  XL:¼  a  SnSUS SUS S3nOXL* ::  a  SnSUS SUS S3n[!        UR#                  U5      S5      nX]-  nXàR                  R$                  S-  :”  a  US:”  a  SnOSnS US! S"3n[        XgSU5      $ )#NFTzkill: day PnL z.3fz% <= z% (~z.2fz$ / capital z.0fz$)zkill: max fills/day g        r2   g333333ë?r   ÚlongÚshortzsoft inventory z $z (skew only)u"   hard inventory long â€” block bidsu#   hard inventory short â€” block askszhard inv long z.4fz>=u    BTC â€” block bidszhard inv short z<=-u    BTC â€” block asksg      ð?g      ô?zhard leverage z.1fu   x â€” block heavy side)r1   r,   r4   r   r:   Úkill_day_pnl_pctr   r;   r   Úmax_fills_per_dayr"   r    Úinventory_btcÚabsÚmax_notional_usdr<   Úmaxr   Úsoft_leverage_max)r   Úenginer   Úday_pctÚinvÚinv_notionalr/   r0   r4   Úsoft_capÚsideÚhardÚmax_invÚeqÚlevs                  r   ÚevaluateÚRiskManager.evaluate*   si  € Ø�;�;Ü  u¨d°D·K±KÓ@Ð@à×$Ñ$ SÓ)ˆØ—h‘h×/Ñ/Ó/ØˆDŒKà  ¨ ¨U°4·8±8×3LÑ3LÐ2Mð NØ—^‘^ CÓ(¨Ð-¨\¸$¿,¹,ÀsÐ9KÈ2ðOð ŒKô    u¨d°D·K±KÓ@Ð@à×ÑÓ 4§8¡8×#=Ñ#=Ó=ØˆDŒKØ0°·±×1KÑ1KÐ0LÐMˆDŒKÜ  u¨d°D·K±KÓ@Ð@ä�F—L‘L×.Ñ.×5°#Ó6ˆÜ˜3“x #‘~ˆØˆ	Øˆ	Øˆð ˜$Ÿ(™(×3Ñ3Ñ3ˆØÓ#Ø  1›W‘6¨'ˆDØ& t f¨B¨|¸CÐ.@ÀÐMˆFô �T—X‘X×.Ñ.Ó/ˆØÓØ�Q‹wØ!�	Ø=‘à!�	Ø>�ð ×(Ñ(ˆØÑ 7¨Q£;Ø‹~Ø!�	Ø)¨#¨c¨°"°W¸S°MÐATÐU‘Ø˜“Ø!�	Ø*¨3¨s¨)°3°w¸s°mÐCVÐW�ä�—‘˜sÓ# SÓ)ˆØÑˆà—‘×+Ñ+¨dÑ2Ó2Ø�Q‹wØ!‘	à!�	Ø% c¨# YÐ.DÐEˆFä˜I°%¸Ó@Ð@r   c                ó4   • U R                   U R                  S.$ )N©r1   r4   rW   r   s    r   ÚstatusÚRiskManager.statush   s   € ØŸ+™+°·±Ñ=Ð=r   )r;   r:   r1   r<   r4   r   )r=   r"   r<   zOptional[float])rJ   r	   r   r"   r#   r,   )r#   Údict)r%   r&   r'   r(   r>   rT   rX   r*   r   r   r   r7   r7      s,   † ð
 .2ð	
ð ð
ð +õ	
ô<A÷|>r   r7   N)Ú__doc__Ú
__future__r   Údataclassesr   Útypingr   r   r   r	   r,   r7   r   r   r   Ú<module>r_      sE   ðÙ 7Ý "å !ß *Ñ *ô �ô  ð ÷ð ó ð÷O>ò O>r   