
    pj                        d Z ddlmZ ddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZ dd	lmZmZmZ dd
ZddZddZddZddZddZddZdd	 	 	 	 	 	 	 	 	 	 	 ddZddZdd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dZy)!z;Centralized fail-safes before any strategy places new risk.    )annotationsN)datedatetime)Path)Any)count_entries_submitted_today)PlatformConfigStrategySlot)PortfolioSnapshot
RiskActionRiskVerdictc                    | j                         sy| j                  d      j                         j                         }|dv S )NFutf-8encoding)1HALTSTOPKILLYESTRUE)is_file	read_textstripupper)pathtexts     2/opt/rentech/trading_bot/RenTech/live/risk_gate.py_read_kill_switchr      s<    <<>>>7>+11399;D???    c                    | dz  S )Nzplatform_day.json )	state_dirs    r   _day_state_pathr$      s    ***r    c                L   t        |       }|j                         si S 	 t        j                  |j	                  d            }t        |t              si S t        |j                  d            |j                         k7  ri S |S # t        j
                  t        f$ r i cY S w xY w)Nr   r   r   )r$   r   jsonloadsr   JSONDecodeErrorOSError
isinstancedictstrget	isoformat)r#   todaypdatas       r   _load_day_stater2      s    	"A99;	zz!++w+78 dD!	
488F 11	K   '* 	s   %B B#"B#c                   | j                  dd       t        |       }d|j                         i|}|j                  d      }|j	                  t        j                  |d      dz   d	       |j                  |       y )
NT)parentsexist_okr   z.tmp   )indent
r   r   )mkdirr$   r.   with_suffix
write_textr&   dumpsreplace)r#   r/   payloadr0   bodytmps         r   _save_day_staterA   )   sk    OOD4O0	"AEOO%11D
--
CNN4::d1-4wNGKKNr    c                    t        | |      }|rt        |j                  d|            n|}|rt        |j                  d|            n|}||kD  r|}|st        | |||d       |S t        | |||d       |S )Nopening_nav_usdpeak_nav_usdrC   rD   )r2   floatr-   rA   )r#   r/   navdayopeningpeaks         r   _update_peak_navrK   2   s    
)U
+C8;eCGG-s34G255-.3D
Tz #T:	
 K 	 '>	

 Kr    c                :    t        d | j                  D              S )z?Count non-flat SPY option legs (proxy for open VRP structures).c              3     K   | ]<  }|j                   d k(  r+|j                  dk(  rt        |j                        dk\  rd > yw)SPYOPTg&.>   N)symbolsec_typeabsposition).0r0   s     r   	<genexpr>z-count_spy_option_positions.<locals>.<genexpr>I   s>      88uu!4QZZD9P 	
s   AA)sum	positions)	portfolios    r   count_spy_option_positionsrZ   G   s"     $$  r    c                    t        |       j                         j                  dd      }t        |      dk7  rt	        d|       t        |d         t        |d         fS )N:rP   r6   zexpected HH:MM, got r   )r,   r   splitlen
ValueErrorint)hhmmpartss     r   _parse_hhmmrc   P   sX    IOO##C+E
5zQ/x899uQx=#eAh-''r    )ibc               t   t        t        j                  dd      }| j                  }|s|j                  r|j                  d       |S |j                  rbt        | j                        rMt        j                  |_
        d|_        d|_        |j                  j                  d| j                          |S |j                  }||j                   k  rPt        j                  |_
        d|_        d|_        |j                  j                  d|dd|j                   d       |j"                  >|j$                  }||j"                  k  r#|j                  d	|dd|j"                  d       |j&                  |j(                  kD  r-|j                  d
|j&                  dd|j(                  d       t+        | j,                  ||      }	|j.                  H|	dkD  rC|	|z
  |	z  }
|
|j.                  k\  r,|j                  d|
dd|j.                  dd|	dd|dd	       t1        | j,                  |      }|rt3        |j5                  d|            n|}|st7        | j,                  |||d       ||z
  }|j8                  =|t;        |j8                         k  r$|j                  d| dd|j8                  d       |j<                  B|dkD  r=| |z  }|dk  r2||j<                  k\  r#|j                  d|dd|j<                  d       |j>                  r!|ddl m!}  ||      r|j                  d       |S )NT)actionallow_exitsallow_new_entriesz$recommend_only mode (no live orders)Fzkill switch active: zNetLiq $z,.2fz below min $zExcessLiquidity $zmargin utilization z.1%z > cap r   zdrawdown from peak z.2%z >= cap z (peak=$z nav=$)rC   rE   zdaily loss $z exceeds max_daily_loss_usd $zdaily loss z  exceeds max_daily_loss_pct_nav )has_pending_orderszpending IB orders on account)"r   r   ALLOWriskrecommend_onlymerge_block_entrieshalt_on_kill_switchr   kill_switch_pathHALT_ALLrf   rh   rg   reasonsappendnet_liquidation_usdmin_net_liq_usdmin_excess_liquidity_usdexcess_liquidity_usdmargin_utilizationmax_margin_utilizationrK   r#   max_drawdown_pct_from_peakr2   rF   r-   rA   max_daily_loss_usdrS   max_daily_loss_pct_navblock_if_pending_ordersRenTech.live.ibkr_sessionrj   )cfgrY   r/   rm   rd   verdictrkrG   excessrJ   dd_fracrH   rI   day_pnlloss_pctrj   s                   r   evaluate_platform_riskr   W   s@    !1!1tW[\G	B**##$JK	"3C4H4H"I#,,$)!"!5c6J6J5KLM

'
'C
R#,,$)!"#d<@R@RSW?XYZ	"".//B///''#F4=R=X=XY]<^_ ##b&?&??##!)">">s!C72KdKdehJij	
 CMM5#6D	$$0TAX#:%b333''%gc](2;X;XY\:] ^tF3t*A7
 #--
/C8;eCGG-s34Gu#WZ.[\GmG	(WR=R=R9S8S-S##G8D/)FrG\G\]aFbc	
 
  ,18g%Q;8r'@'@@''hs^+KBLeLefiKjk 
!!bn@b!''(FGNr    c                   | j                   j                         }|j                  }|dk(  r| j                  | j                  nd}||z  S |dk(  rt	        | j
                  xs d      S |dk(  r|S t        d|d| j                         )Nnav_pctg        	fixed_usdfull_navzUnknown capital_budget_mode z for strategy )capital_budget_modelowerrt   capital_budget_nav_pctrF   capital_budget_usdr_   id)slotrY   moderG   pcts        r   strategy_capital_budgetr      s    ##))+D

'
'Cy-1-H-H-Td))Z]Sy{T,,344z

3D8>$''S
TTr    F)force_entry_nowc          	     T   t        |j                  t        |j                        |j                  |j
                        }	|j
                  s|	S | j                  s|	j                  d| j                   d       t        || j                  |      }
|
| j                  k\  r/|	j                  d| j                   d|
 d| j                   d       t        |      }|| j                  k\  r.|	j                  d| j                   d| d| j                          |st        |      \  }}|j                  ||d	d	
      }||k  r"|	j                  d| j                   d| d       | j                  r^t        | j                        \  }}|j                  ||d	d	
      }||kD  r,|	j                  d| j                   d| j                   d       |d	k  r!|	j                  d| j                   d       |	S ||j                   dz  kD  r#|	j                  d| j                   d|dd       |	S )N)rf   rr   rg   rh   z	strategy z: enabled_for_entries=falsez: daily entries /z already submittedz: SPY option legs z >= max_open_positions r   )hourminutesecondmicrosecondz: before entry_after_et z ETz: after entry_before_et z: zero capital budgetg?z
: budget $z,.0fz exceeds NAV)r   rf   listrr   rg   rh   enabled_for_entriesrn   r   r   max_new_entries_per_dayrZ   max_open_positionsrc   r=   entry_before_etrt   )r   rY   platformr   r#   r/   now_etentry_after_etr   r   	submittedspy_optshhmm
after_gatebhbmbefore_gates                     r   evaluate_strategy_riskr      s<    X%%&(("44	G %%####iy8S$TU-i%HID000##y 01T=Y=Y<ZZlm	
 *)4H4***##y 28*<STXTkTkSlm	
 ^,B^^Bqa^P
J''DGG9$<^<LCP  !5!56FB ..bAST.UK#++y(@AUAU@VVYZ Q##iy8M$NO
 N	 
i;;dB	B##y
+=d*C<P	
 Nr    )r   r   returnbool)r#   r   r   r   )r#   r   r/   r   r   r+   )r#   r   r/   r   r>   r+   r   None)r#   r   r/   r   rG   rF   r   rF   )rY   r   r   r`   )ra   r,   r   ztuple[int, int])r   r	   rY   r   r/   r   rm   r   rd   z
Any | Noner   r   )r   r
   rY   r   r   rF   )r   r
   rY   r   r   r   r   rF   r#   r   r/   r   r   r   r   r,   r   r   r   r   )__doc__
__future__r   r&   r   r   pathlibr   typingr   RenTech.live.entry_ledgerr   RenTech.live.platform_configr	   r
   RenTech.live.protocolsr   r   r   r   r$   r2   rA   rK   rZ   rc   r   r   r   r"   r    r   <module>r      s   A "  #   C E M M@+*( I	I I I
 I 	I IX
U. "9
9 9 9
 9 9 9 9 9 9 9r    