
    pj+                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZmZmZ dd	lmc mZ  G d
 d      Zy	)u   
VRP 4-regime book — live adapter over ``live_ibkr_trader.py``.

Keeps execution parity with the monolithic script while fitting the platform
orchestrator (shared IB session, portfolio snapshot, risk gates).
    )annotations)Path)Any)check_and_reserve_entryrecord_entry_submittedrelease_entry_reservation)
RiskActionStrategyContextStrategyCycleReport)count_spy_option_positions)DEFAULT_STRATEGY_CONFIG_PATH.apply_strategy_params_to_vrp_backtester_moduleload_strategy_config_file.sync_live_constants_from_vrp_backtester_moduleNc                  p    e Zd ZdZdZddZddZdd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZdd	Z	y
)VrpIbkrStrategyu2   Daily VRP options on SPY via IB (R1–R4 regimes).vrp_corec                6   t        t        |j                  j                  dd                  }|j	                         s|j
                  |z  j                         }t        t        |j                  j                  dd                  }|j	                         s|j
                  |z  j                         }t        t        |j                  j                  dt                          }|j	                         s|j
                  |z  j                         }|||fS )N
state_pathz%RenTech/data/live_state/vrp_core.jsonrecommend_outz0RenTech/data/logs/ibkr_trade_recommendation.jsonstrategy_config_path)r   strstrategy_configgetis_absolute	repo_rootresolver   )selfctxstatereccfgs        </opt/rentech/trading_bot/RenTech/live/strategies/vrp_ibkr.py_resolve_pathszVrpIbkrStrategy._resolve_paths#   s    ##''6]^_
   "]]U*335E##''#F
  ==3&//1C##''(>@\]^
  ==3&//1Cc3    c                   |j                         rUt        |      t        _        t	        t        j                  j
                         t        t               t        d|        y d t        _        t        d| d       y )Nz[vrp_core][PARITY] z[vrp_core][PARITY] missing u    — built-in constants)is_filer   vrp_PARITY_CFGr   strategy_paramsr   print)r   cfg_paths     r#   _apply_parityzVrpIbkrStrategy._apply_parity:   s^    7ACO:3??;Z;Z[:3?'z23"CO/z9PQRr%   F)ignore_state_checkc                  K   |	rGt        j                  |j                  ||||||d||

       d{    |xj                  dz  c_        yt	        |j
                  |j                  |j                  |j                  |j                        \  }}|s|j                  j                  d|        yt        |j                  d      xs g       }	 t        j                  |j                  ||||||d||

       d{    t        |j                  d      xs g       }||k  rLt        |j
                  |j                  |j                         |j                  j                  d	| d
       yt!        |j
                  |j                  |j                  |j                  |d       d|j"                  d<   |xj                  dz  c_        y7 7 # t        $ r. t        |j
                  |j                  |j                          w xY ww)zOReserve ledger slot, place entry, record on success. Returns True if attempted.T)max_entry_qtyrecommend_onlyrecommendation_outr.   N   )todayzentry ledger: F
strategiesz"place_entry_with_gtc did not open z (no state change)vrp_ibkr)r4   regimesourceentry_ledger_recorded)r(   place_entry_with_gtcibentries_attemptedr   	state_dirstrategy_idrun_idmax_new_entries_per_dayr4   messagesappendlenr   	Exceptionr   r   metadata)r   r   r    r7   netspyspy_liver   r0   rec_onlyr.   reportallowedreasonn_beforen_afters                   r#   _place_entry_legz VrpIbkrStrategy._place_entry_legD   s      **+##0#5   $$)$1MMOOJJ''))
 OO""^F8#<=uyy.4"5	**+$#0#5    eii-34h%cmmS__CIIVOO""%GxOa#bcMMOOJJ))	
 48/0  A% y8  	%cmmS__CIIV	s;   /HGBH,G =G>G CHG 7HHc                  K   | j                  |      \  }}}| j                  |       t        j                  |j                  |       d {   }t        | j                  |dk(  d| gt        |      |d      S 7 0w)N)r   r   zaudit exit code )r   
audit_code)r>   okrA   rE   )r$   r-   r(   run_ib_state_auditr;   r   r>   r   )r   r   r   _r,   codes         r#   auditzVrpIbkrStrategy.audit   s     "&"5"5c":
Ax8$++CFFzJJ"((qy(/0$'
O4H	
 	
 Ks   AB A>1B c                  K   | j                  |      \  }}}| j                  |       |t        _        t	        | j
                  d      }|j                  j                  d      }|t        |      nd }t        j                  |      }|j                  }	|j                  }
|
sU|j                  j                  r?t        j                  |j                  ||	       d {    |xj                   dz  c_        n|
r|j"                  j%                  d       ddlm}m}  |dd	d
      }|j                  j-                  |       d {     |ddd
      }	 |j                  j-                  |       d {    |j0                  j2                  }t        j4                  |j                  |       d {   \  }}t        j6                  |j                  |d|       d {   }t        j6                  |j                  |d       d {   }t9        |j:                        j=                  dd      D cg c]  }t        |       c}\  }}|j>                  jA                  ||dd      }|jB                  xs |j>                  |k\  }||k\  }tE        |j0                        }|jF                  jI                  |||||||jJ                  ||jL                  d	       t        jN                  |jP                  | j
                  |j>                  jS                         |
||||t        jT                  |      ||t9        |      d       |s|j"                  j%                  d       |S |s+|j"                  j%                  d|j:                   d       |S |jV                  jX                  tZ        j\                  k(  r$|j"                  j%                  d       d|_/        |S |jV                  j`                  s4|j"                  j%                  d|jV                  jb                          |S |jd                  s|j"                  j%                  d       |S ||jL                  k\  rB|j                  d      s1d| d}tg        d|        |j"                  j%                  |       |S |j                  d      r|
s|j"                  j%                  d       |S t        jT                  |      }||jF                  d<   |d k(  r|}|ji                  |jj                  d!z   |jl                  z         }|ji                  |jj                  d"z   |jl                  z         }| jo                  ||d ||||
r|n|||
|#
       d {    | jo                  ||d$||||
r|n|||
d|%       d {    n#| jo                  |||||||||
|#
       d {    t        jp                  |       |j"                  j%                  d&| d'|jr                          |S 7 )7 7 # t.        $ r3  |ddd
      }|j                  j-                  |       d {  7   Y w xY w7 7 r7 Lc c}w 7 7 7 w)(NT)r>   rR   r0   r3   z'recommend_only: skipped exit managementr   )IndexStockSPYSMARTUSDVIXCBOE)exchangecurrency)fallback:)hourminutesecondmicrosecond)	net_liq_usdrH   sma200vix_livespy_gt_sma200entry_time_gate_passcapital_budget_usdspy_option_legs_ibmax_open_positions)platform_run_idr>   
created_atr1   rg   rH   rh   ri   
regime_nowrj   rk   r   u*   SPY < SMA200 — cash/wait, no new entrieszbefore entry gate z ETu   platform HALT — no entriesFzentries blocked: zenabled_for_entries=falser5   zIB has uI    SPY option leg(s) but state is empty — reconciliation gap; block entryz[vrp_core][WARN] u0   open positions in state — skip duplicate entryr7   diagonal_r2a_diagonal_r2b_spread)r   r0   rI   rJ   	r2_spread)r   r0   rI   r.   rJ   zregime=z entries_attempted=):r$   r-   r(   
STATE_PATHr   r>   r   r   int_load_state_pathr4   r1   platform_riskallow_exitsmanage_open_positionsr;   exits_attemptedrA   rB   	ib_insyncrX   rY   qualifyContractsAsyncrD   	portfolionet_liquidation_usdget_spy_sma200snapshot_pricer   entry_after_etsplitnow_etreplaceforce_entry_nowr   rE   updaterl   rn   _write_live_signal_stater?   	isoformatregime_from_vixstrategy_riskactionr	   HALT_ALLrR   allow_new_entriesreasonsenabled_for_entriesr+   	with_namestemsuffixrO   _save_stater<   ) r   r   r   r   r,   rJ   max_qtyr0   r    r4   rI   rX   rY   rG   vixrF   rh   spy_histrH   ri   xhhmmgateentry_time_okspy_bullspy_opt_legsmsgregbaserec_arec_bs                                    r#   	run_cyclezVrpIbkrStrategy.run_cycle   s    .2.A.A#.F+
M88$#$1A1AdK%%))/:(/(;G$$Z0		%%C--99++CFFE5AAA""a'"OO""#LM*E7E*ff**3///E65)	4&&..s333
 mm//!$!3!3CFFC!@@++CFFCRR++CFFC??"%c&8&8"9"?"?Q"GHQ#a&HBzz!!r"QA!N++AszzT/Av%1#--@"$ $!)(5&)&<&<&2&)&<&<
	
 	$$#&::#//!jj224"*"$ $!11(;!)(5!*o	
" OO""#OPMOO""%78J8J7K3#OPM##z':'::OO""#ABFIM  22OO""%6s7H7H7P7P6Q#RSM&&OO""#>?M3111%))L:Q, (2 2  %cU+,OO""3'M99\"8OO""#UVM!!(+$'!* DNN499#>#LMENN499}#<t{{#JKE'''/e]+! (    '''/e]+!#' (    ''++! (    	-@AYAY@Z[\Y B 	0 4 	4?C&&..s333	4
 AR?H\s   CY#XA'Y#X
Y#X 4X5X 99Y#2Y3-Y# Y!(Y#	Y
+Y#5YL-Y#4Y5'Y#Y#Y# Y!AY#
Y#X 2YYYY#YY#Y#Y#Y#Y#!Y#N)r   r
   returnztuple[Path, Path, Path])r,   r   r   None)r   r
   r    zdict[str, Any]r7   r   rF   floatrG   r   rH   r   r   r   r0   z
int | NonerI   boolr.   r   rJ   r   r   r   )r   r
   r   r   )
__name__
__module____qualname____doc__r>   r$   r-   rO   rV   r    r%   r#   r   r      s    <K.S, $)MM M 	M
 M M M M "M M !M $M 
M^	
Zr%   r   )r   
__future__r   pathlibr   typingr   RenTech.live.entry_ledgerr   r   r   RenTech.live.protocolsr	   r
   r   RenTech.live.risk_gater   *RenTech.strategy_stack.vrp_strategy_configr   r   r   r   'RenTech.strategy_stack.live_ibkr_traderstrategy_stacklive_ibkr_traderr(   r   r   r%   r#   <module>r      sI    #   
 T S =  6 5Z Zr%   