
    :Vqj                       d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlZddlZddlmZmZmZmZmZ dd	lmZ dd
lmZmZmZ ddlmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZD ddlEmFZFmGZG  ed      ZH eeI      j                         j                  d   ZLeLdz  dz  dz  ZMeMdz  ZNd9dZOddd:d ZPd;d!ZQd<d"ZRd=d#ZSd$d%d>d&ZTd?d'ZUd@d(ZVd)d$d*d+dd,	 	 	 	 	 	 	 	 	 	 	 dAd-ZWe"dd.	 	 	 	 	 	 	 	 	 	 	 	 	 dBd/ZX	 	 	 	 dCd0ZYddd1dd2d2d3	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dDd4ZZdd1d5d6	 	 	 	 	 	 	 dEd7Z[dFd8Z\y)Gz
Live **stock-only Best Ideas** signals from IBKR + Yahoo.

Writes ``RenTech/data/logs/live_stock_only_signals.json`` for the stock command center.
    )annotationsN)datetime)Path)Any)ZoneInfo)_load_tactical_config_portfolio_payload_spy_regime_gates_tactical_gate_checks _tactical_targets_from_portfolio)fetch_daily_panel)
connect_ibdisconnect_ibensure_positions_loaded)BrokerConfigload_platform_config)fetch_portfolio_snapshot)DEFAULT_DIP_MAX_HOLDINGSJOHANSEN_TRIPLETSMACRO_TICKERSMA_INVERSE_TICKERSSTOCK_ONLY_WEIGHTSSTOCK_SLEEVE_LABELSTSMOM_TICKERSVOL_EDGE_TICKERScompare_sleeve_targetsdip_open_symbols_from_ib_mvdip_per_name_budget_usdsleeve_budget_usd)_ib_stock_mv)
DataLoader) _compute_daily_backtest_features)_high_low_for_atr_wilder_atr)MaSlopeCrossSectionalMaSlopeCrossSectionalConfig)MaSlopeInverseConfigMaSlopeInverseSleeve)TacticalAllWeatherManager)PORT_VOL_TARGETSIGNAL_LOOKBACKSTARGET_ASSET_VOLUNIVERSE
VOL_WINDOW)VolEdgeConfigtarget_weightszAmerica/New_York   RenTechdatalogszlive_stock_only_signals.jsonc                     t         j                  j                  t              j	                         j                  d       S )N)tz)pd	TimestampnowNY	normalizetz_localize     ;/opt/rentech/trading_bot/RenTech/live/stock_only_signals.py_todayr@   E   s.    <<r",,.::4@@r>   2yperiodc                  t               }i }| D ]u  }|j                  ||      }||j                  r%t        |      }t	        j
                  |j                        j                  d       |_        |j                         ||<   w |S )NrB   )	r!   fetch_dailyemptyr"   r7   to_datetimeindexr<   
sort_index)tickersrC   loaderouttrawdfs          r?   _panel_from_yahoorP   I   s    \F#%C !  6 2;#))-c2>>"((+77=A! Jr>   c                v    t        |      }| j                         D ]  \  }}|	|j                  r|||<    |S N)dictitemsrF   )ib_panelyahoo_panelrL   kvs        r?   _merge_panelsrY   V   sA    
{
C  1=CF Jr>   c                   | j                   D cg c]  }|t        v s| }}| |   j                  d      j                         } | j	                         }| j                  d      j                         j                  }t        d t        D              }t        j                  d|      }ddd	}t        t        |            D ]  }|| j                  vr0| j                  | j                  |k     }	t        |	      d
k(  r=|	d   }| j                  j                  |      }
|
|t         z   k  rjt        j                  d|      }d
}t        D ]  \  }}|
|z
  }|
|z
  }|d
k  s|d
k  r| j"                  |   }| j"                  |   }||j%                  d
t&        j(                        z  dz
  j+                  d      }|||j-                         j/                         dz   z  z  }|dz  } |d
k(  r,||z  }t'        j0                  |      }|j"                  t        d
|
t         z
        |
 }|j3                  d      t'        j4                  d      z  }|j%                  d
t&        j(                        j+                  d      }|t6        |z  z  }|j-                         |z  j9                         }|d
kD  r@t:        |z  }|j-                         j9                         }|d
kD  rt=        |d|z        }||z  }t?        |j-                         j9                               }|dk  r]||z  j+                  d      }ddtA        t        jB                  |      jE                               ||D ci c](  }|tG        t?        |jI                  |d
            d      * c}d} n |D ci c],  }t-        t?        ||               dkD  s|t?        ||         . }}|sd|d<   ||fS c c}w c c}w c c}w )NallhowBMEc              3  &   K   | ]	  \  }}|  y wrR   r=   ).0lb_s      r?   	<genexpr>z-_tsmom_targets_from_prices.<locals>.<genexpr>c   s     2A2s           rH   rF   live_pricesstatussourcer         ?g:0yE>   ddof   g?      @&.>ok   )rh   ri   rebalance_dategross_exposuresignalsg{Gz?flatrh   )%columnsr-   dropnaffill
pct_changeresamplelastrH   maxr+   r7   Seriesreversedlistlenget_locr.   ilocreplacenpnanfillnaabsmeansignstdsqrtr,   sumr*   minfloatstrr8   dateroundget)pricesrM   rJ   retsrebal_datesmax_lbweightsmetardpriori_nowsignal_votesvalidra   skipi_pasti_skip	price_now
price_past
ret_signal	directionvol_window_datarealized_volasset_weightgross_vol_estimate
port_scaledenomgrosstargetss                                r?   _tsmom_targets_from_pricesr   ^   s    ..:QAMq:G:G_###.446FD//%(--/55K2!122Fii7+G&-GDtK() /V\\!LL!34E5zQrB$$R(6J&&yyG4( 		HBRZFT\FzVaZF+IV,J#j&8&8BFF&CCcIQQRUVJJ*..*:*?*?*AD*HIILQJE		 A:GGL)	))C5:+=$>G&***2RWWS\A#++Arvv6==dC $4|$CD*..0<?DDF!(+==J $$&**,Eqy S5[9
J&Ll&&(,,./4<%'//4#!",,r"2"7"7"9:#LSTq5|'7'71'=!>BBT
 	_/b .5VE'!*<M8NQU8Uq%
##VGVXD=y ;j U Ws   OO(-O$!O)O)c                 d   ddl m}  ddlm} t	               } |       }|j
                  st        |      dk  ri dddfS |j                  }|d   j                  t              }|d	   j                  t              } | |      }t        |      d
z
  }|j                  t              }	t        |	j                  t        d||j                  z
  d
z         |d
z    j                         j                  d
      t        j                   d      z  dz        }
t        |j                  |         |
z
  }t        |j                  |         }|t        |      k  rt        |j                  |         n
t        d      }t#        |j$                  |||      \  }}i }|dkD  r||d<   |dkD  r||d<   ddt'        ||   d      rt)        ||   j+                               nt)        ||         t-        |d      t-        |d      ||k(  rt-        |d      nd ||k(  rt/        ||k        nd |||j$                  d
}||fS )Nr   )_load_vix3m_series)load_spy_vix_from_yfinance   rF   zinsufficient VIX historyrh   errorclose	vix_closerl   rm   ro   d   r   )variantevrpvixvix3mgMbP?SVIXVIXYrr   yfinance_vixr   rs   r1   )
rh   ri   as_ofr   r   r   contangotarget_w_shorttarget_w_longr   )6RenTech.strategy_stack.spx_regime_state_space.featuresr   %RenTech.strategy_stack.vrp_backtesterr   r/   rF   r   rH   astyper   r   r~   rv_lookbackr{   r   mathr   r0   r   hasattrr   r   r   bool)r   r   cfgpanelidx	spy_closer   r   ispy_srvr   vix_vvix3m_vt_shortt_longr   r   s                     r?   _vol_edge_live_targetsr      s   YP
/C&(E{{c%j2og0JKKK
++Cg%%e,I


#
#E
*Cs#EC1AU#E	

3q!coo-12QU;FFHLLRSLTW[W`W`adWeehkk
B !"D#((1+E&'#e*neEJJqM"%,G$	OGV !#G!~  '.s1vv'>SV[[]#CAKdAUA&-&8w"d-4-?D)T!;;D D=r>   
   top_nc                |   ddl m} t        dddd      }	  |dd	d
      }t        |      }|j                  ||       }dd| d}|j                  ri |fS t        j                  |d         j                  j                         |d<   t               }||d   |kD     }	t        |	      r|	d   j                         }
d}n||d   |k     d   j                         }
d}||d   |
k(  |d   j!                  t"              dkD  z     }|j%                         D ci c]   \  }}t	        |d         t#        |d         " }}}|j'                  d|t	        t        j(                  |
      j+                               t-        |j/                               |j0                  |d   dk(  df   j!                  t              j3                         |j0                  |d   |
k(  |d   dk(  z  df   j!                  t              j3                         d       ||fS # t        $ r}i dt	        |      dfcY d }~S d }~ww xY wc c}}w )Nr   )load_equity_panel_dictdual_productmonthly	atr_trailg       @)rank_metric	rebalance	stop_modeatr_multipliersp1005yF)universedaily_periodrefresh_cacher   r   configr   rF   yahoo_sp500)rh   ri   r   effective_dateupcomingcurrentweighttickerrr   is_new_entryTis_exit_from_prior)rh   moder   rJ   new_entriesexits_from_prior).RenTech.strategy_stack.equity_universe_loadersr   r&   	Exceptionr   r%   generate_rebalance_logrF   r7   rG   dtr;   r@   r   r   r~   r   r   iterrowsupdater8   r   r   keysloctolist)r   r   r   equity_dictexcengrebalr   todayfutureeffr   grprb   rr   s                   r?   _ma_slope_topn_targetsr     sN   U
%"	C:,
  s
+C&&{%&@E&-QVWD{{4x nnU3C-DEHHRRTE
HE5)*U23F
6{%&**,E*+u456FGKKM
'(C/E(O4J4J54QTU4UV
WC@CO1s1X;q{!33OGOKK!",,s"3"8"8":;GLLN+773~#6$#>#HIPPQTU\\^ %		'(C/E:N4OSW4WX! VC[VX	
 D=G  :gC999:& Ps#   H %H8	H5H0*H50H5c                   t        dddd      }t        |      }|j                  ||       }ddd	}|j                  ri |fS t	        j
                  |d
         j                  j                         |d
<   |j                  d   }t        |j                  dd      xs d      }t        |j                  dd            }|dkD  r||ini }	|j                  dt        |d
   j                               t        |dkD        |d       |	|fS )Nbear_dual_or_sma200spy_slope_or_sma200T)SH)
spy_regimespy_exitrequire_inverse_momentumtickers_preferredr   rF   	live_barsrg   r   rj   r   r   r   r  rr   )rh   r   regime_activer   )r'   r(   generate_position_logrF   r7   rG   r   r;   r   r   r   r   r   r   r   )
spy_dfetf_dictr   r   pos_logr   rowwsymr   s
             r?   _ma_inverse_targetsr    s   
(&!%!	C c
*C''&9G&-ED}}4xnnWV_588BBDGFO
,,r
Ccggh"'a(A
cggh%
&Ca%sAhRGKKV))+,!!a%[		
 D=r>   c                   ddl m}m}m} i }g }t        D ]S  \  }}|D cg c]	  }|| vs| }	}|	r|j                  |d|	d       3t        j                  |D ci c]  }|| |   d    c}      j                         }
t        |
      dk  r|j                  |dt        |
      d       t        j                  |
j                  t                    }t        |
      d	z
  } |||d
dd      }||j                  |dd       t        j                  ||      }|
|z  j                  d	      } ||      }t         |||d      j                   d         }||z  j                  t              }t        |j#                         j                               }|dk  r|j                  |d|d       ||z  j%                         }|j'                         D ]-  \  }}|j)                  |d      |t        t              z  z   ||<   / |j                  |dt+        |      t-        |d      |j'                         D ci c]  \  }}|t-        t        |      d       c}}d       V |si d|dfS t        d |j/                         D              }|dkD  r'|j'                         D ci c]  \  }}|||z   c}}ni }|dd |d!fS c c}w c c}w c c}}w c c}}w )"Nr   )half_life_lookbackjohansen_eigenvector_atlinear_zscore_unitsmissing)labelrh   r  r   i  short_history)r  rh   nrl   bookro   ?   )fidelity	min_train
refit_barsno_eigenvector)r  rh   re   )axiscausal)r$  rj   rq   rw   )r  rh   unitsrd   rr      rs   )r  rh   legsr*  leg_weightsrF   )rh   tripletsc              3  2   K   | ]  }t        |        y wrR   )r   )r`   rX   s     r?   rc   z,_johansen_triplet_targets.<locals>.<genexpr>N  s     21A2s   yahoo_johansen)rh   ri   r.  ),RenTech.strategy_stack.chan_johansen_tripletr  r  r  r   appendr7   	DataFramery   r   r   logr   r   r   r   r   r   to_dictrT   r   r   r   values)r   r  r  r  combinedtriplets_metar,  r  rM   r  pxlog_pxevevecyportra   r*  leg_wr   normr  r  rW   rX   r   s                            r?   _johansen_triplet_targetsr@    s     "$H*,M( #
e"5aun155  5IRY!Z[\\>A1eAhw//>?FFHr7S=  5ORUVXRY!Z[		%()GaK$VQ3[]^:  5<L!MNyy4(dQ'&)%hGLLRPQ%%e,eiikoo'(4<  5FU!ST&&(jjl 	PFC$LLc2Q=N9O5OOHSM	PT
uaBF**,O$!Q5q1#5 5O	
7#
H g=AAA2 122E=BQY(891q!e)|9BGt/?][[[O 6 ?8  P :s   	KKK
? K-Kr   g?g      ?)r   r   limit_atr_multprofit_atr_mult
entry_datec                	   ddl }| dk(  r|j                  |       n|j                         }|dd }t               }|xs
 t	               j                         }|j                         }	g }
|D ]  }	 |j                  |d      }|t        |      dk  r)|j                         }|j                  D cg c]  }t        |      j                          c}|_
        d	|j                  v rd
|j                  vr|d	   |d
<   t        j                  |j                        j!                  d      |_        |j#                         }d
|j                  vst        |      dk  r|d
   j%                  t&              }t)        ||      \  }}t+        |||d      }|j-                  dd      j/                         }t        j0                  |j                  d         j                         }|j                         |	k\  rt        |      dk\  rd}nd}t3        |      t        |      k\  rt        j0                  |j                  |         j                         }|t        j4                  j7                  d      z   j                         }|j                         |	k7  r-t'        |j8                  |         }t'        |j8                  |dz
           }|dk  st;        j<                  |      s|||z  dz
  }t'        |j8                  |         }t'        |j8                  |         }t;        j<                  |      r|dk  r||z  dz  }|dkD  rt;        j<                  |      r||k  r|dk  r|t'        |      |z  z
  }|t'        |      |z  z   }|
j?                  t        |      jA                         t        |j                               t        |	      tC        |dz  d      tC        |d      tC        |d      tC        |d      tC        |d      tC        |d      t'        |      t'        |      d        |
jG                  d        |
d| } | rdndd| t        |
      t        |	      | d}!| |!fS c c}w # tD        $ r Y w xY w)u:  
    CrackingMarkets dip candidates for *today's* DAY limit entries.

    Signal = last completed session with ≤−3% day, SMA200 up, ATR%/close > 3%.
    Limit = signal_close − limit_atr_mult × Wilder ATR(5). Only emits when
    ``entry_date`` is the next calendar session after the signal (i.e. today).
    r   Nr   )r      1yrB      z	adj closer      )min_periodsrj   r1   rl   rk   g      Y@gQrp   r   rs   )r   signal_daterC  drop_pctatr_pctatr_usdlimit_priceprofit_targetprior_closerA  rB  c                    | d    S )NrM  r=   )xs    r?   <lambda>z&_scan_cm_dip_signals.<locals>.<lambda>  s    1Y<- r>   keyrr   noneyahoo_scan_atr5)rh   ri   r   n_candidatesrC  rv   )$universe_scannerget_sp100_tickersget_sp500_tickersr!   r@   r;   r   rE   r   copyrx   r   lowerr7   rG   rH   r<   rI   r   r   r#   r$   rollingr   r8   r   offsetsBDayr   r   isfiniter2  upperr   r   sort)"r   r   rA  rB  rC  usrJ   rK   r  today_d
candidatestkrrN   rO   cclose_shiloatr_ssma200last_dtsig_isig_dt
next_entry	sig_closerQ  retatr5sma_vrM  limit_px	profit_pxpicksr   s"                                     r?   _scan_cm_dip_signalsrz  S  s    "9AW9Lb""H"5RTRfRfRhGdsmG\F#68..0EjjlG')J CB	$$S$6C{c#hnB24**=Q#a&,,.=BJbjj(WBJJ-F o7~~bhh/;;DABHBbjj(CGcMk((/G&r73FBB3E__Sc_:??AFll288B<0::<G||~(SW\5zSW$\\"((5/2<<>F 2::??1#55@@BJ G+gll512IUQY 78Kat}}Y'?k)C/CE*+D&++e,-E==&$!)Y&.GU{=='9+=#~ 5#84#??H 5#9D#@@I!#hnn.#&v{{}#5"%g, %cCi 3$Wa0$T1~#(1#5%*9a%8#(A#6&+N&;',_'=gCH OO/O0vE$V#J'lD $;Q >x  		s`   0#Q7Q72 Q2BQ7CQ7#A3Q7AQ7'AQ7;Q7
Q7&Q7-CQ72Q77	RR)max_holdingsopen_symbolsc                  |xs
 t               D ch c]  }t        |      j                          }}t        |||      }t	        ||||      }	t        dt        |      t        |      z
        }
t        |d      t        |	d      t        |      t        |      t        |      |
d}|
dk  r#ddddd	t        |       d
t        |       d|dgS | s
ddddd|dgS | D cg c]0  }t        |j                  dd            j                         |vs/|2 }}|d|
 }|s>dddddt        |        dt        |       d
t        |       di |dt        |       idgS g }|D ]u  }t        |d         j                         }t        |j                  d      xs d      }|j                  ddd|d| d|dd|	ddi ||t        |	d      d d!d"|d       w t        |      |
kD  r\|j                  d#dddd$t        |      |
z
   d%|
 d&i |d'||
d D cg c]  }t        |d         j                           c}id       |S c c}w c c}w c c}w )(z
    Emit DAY limit ADD tickets sized at ``sleeve / max_holdings``.

    Skips names already open and caps new adds to remaining slots.
    )r{  r   r1   )r   per_name_budget_usdr{  
open_countr|  slots_remaining(   HOLD
equity_dip zDip sleeve full (/u   ) — skip new DAY limitspriorityactionr"  symbolsummarydetail7   WATCHz+No CM dip signals for today's entry sessionr   N2   zAll z dip candidates already open ()	n_signalsrO  rd      ADDzCM dip limit buy z @ z.2fz (~$z,.0fLMTDAY)r   target_notional_usd
order_typetime_in_force-   zSkipped u    dip candidates — only z slots leftskipped)setr   rc  r   r   r~   intr   r   sortedr   r   r2  )rv   fund_navfund_weight
fund_scaler{  r|  s	open_syms
sleeve_navper_nameslotsbase_detailfreshtakeactionssigrh  lims                     r?   _dip_actionsr    s    +7*?#%AAQAIA"8[*EJ&+zH 3|$s9~56E":q1$Xq1L))ny) K z  $'I'7q\9J8KKde%	
 	
  !$H%	
 		
  U13quuXr':#;#A#A#C9#TQUEU%=D  $3w<. )I'q\):(;1> E[D+s7|D

 	
 %'G 
#h- &&(CGGM*1c2$.se3s3itHT?RST!+01+="'%* "	

( 5zE!$s5zE122KE7R]^!%-PQAhK 0 6 6 8P	
 N BR Vd  Qs    I 0I	I	#Ic                F   ddl m}m} | | j                  ri dg dfS d| i}| j                  }g }|D ]9  } ||||      }t        |j                  d         dk7  s)|j                  |       ; |si dg d	d
fS t        |      t        t        |            z  }d|id|d	|dfS )zEEqual-weight SPY exposure when any actionable-4 rule is active today.r   )QS_ACTIONABLE_4run_systematic_strategyrF   )rh   active_rulesspyrj   rd   cashzactionable-4)rh   r  presetSPYactive)rh   r  r  
spy_weight)	,RenTech.strategy_stack.qs_systematic_libraryr  r  rF   rH   r   r   r2  r   )	r  r  r  panelsr   r  sidr  r  s	            r?   _qs_actionable_4_live_targetsr  ,  s     f~gr:::V_F
,,CF #C5#MM# fbNSSSFeC011A1:(Fnlmnnnr>   g      ?T)brokerfund_weightsr  r  	use_yahoorenormalize_weightsc                 K   t        |xs t              }|rDt        |j                               }|dkD  r&|j	                         D 	
ci c]  \  }	}
|	|
|z   }}	}
|j	                         D 	
ci c]   \  }	}
t        |
      dkD  s|	t        |
      " }}	}
d }i }|t        |      nd}| Qt        |        d {    t        |        d {   }t        |j                        }t        |      }t        |      }|}i }| |t        t        t              t        t              z  t        t              z  t        t               z  dhz        }t#        dt%        |       dd       t'        | |d	       d {   }i }|r|j)                  d
d      dkD  r+t        t*        D ch c]  \  }}|D ]  }|  c}}}      ng }t        D cg c]	  }||vs| }}t        t        |      t        |      z  |j)                  dd      dkD  rt        t              n	t               z  |j)                  dd      dkD  rt        t              n	t               z  |j)                  dd      dkD  rt        t               n	t               z  |j)                  dd      dkD  s|j)                  dd      dkD  rdhn	t               z        }|j)                  dd      dkD  r$t        t        |      t        t              z        }t#        dt%        |       dd       |rt-        |d      ni }t/        ||      }t        D ci c]  }||v s|||    }}|j)                  d|j)                  d            }t1               }t3        |      }|r|j5                  |      nt7        j8                         }|j)                  dd      dkD  rt;        |      ni ddif\  }}|r%|j)                  dd      dkD  rt=        |||      |d<   t7        j8                  t        D ci c]  }||v s|||   d    c}      j?                  d      } |j)                  dd      dkD  r| j@                  stC        |       ni d|j)                  dd      dk  rdndif\  }!}"|j)                  dd      dkD  rtE               \  }#}$ni ddi}$}#|j)                  dd      dkD  rtG               \  }%}&ni ddi}&}%t         D ci c]  }||v s|||    }'}|j)                  dd      dkD  r||'rtI        ||'      ni d|j)                  dd      dk  rdndif\  }(})|j)                  d
d      dkD  r<i ||j	                         D 	
ci c]  \  }	}
|	|vs|	|
 c}
}	}*tK        |*      \  }+},ni ddi},}+|j)                  dd      dkD  rtM               \  }-}.ng ddi}.}-tO        |      }/i |.t        |/      t%        |/      d}.|j)                  dd      dkD  r|tQ        |      ni d|j)                  dd      dk  rdndif\  }0}1| tS        |        d {   ni }2g }3|j)                  dd      dkD  r&|r$|3jU                  tW        d||||d   ||             |j)                  dd      dkD  r&|#r$|3jU                  tW        d|#|||d   ||$             |j)                  dd      dkD  r'|!r%|3jU                  tW        d|!|||d   ||"d             |j)                  dd      dkD  r&|%r$|3jU                  tW        d|%|||d   ||&             |j)                  dd      dkD  r?|(r%|3jU                  tW        d|(|||d   ||)             n|3jY                  d d!dd"d#|)d$       |j)                  d
d      dkD  r'|+r%|3jU                  tW        d
|+|||d
   ||,d             |j)                  dd      dkD  r'|3jU                  t[        |-||d   |t\        |/%             |j)                  dd      dkD  r'|0r%|3jU                  tW        d|0|||d   ||1             n-|j)                  dd      dkD  r|3jY                  d&d!dd"d'|1d$       |3j_                  d( )       |j	                         D 	4ci c]"  \  }	}4|4dkD  r|	ta        tc        ||4|      d*      $ }5}	}4te        jf                  th              jk                         | d+nd,||||5| d u|d-|2d.|i|d.|#i|$d.|!i|"d.|%i|&d.|(i|)d.|+i|,|.d.|0i|1d/	|3t        |jm                               t        |jm                               d0S c c}
}	w c c}
}	w 7 7 7 c c}}}w c c}w c c}w c c}w c c}w c c}
}	w 7 Ac c}4}	w w)1Nr   g     j@r  z[stock_only] IB daily bars for u    symbols …T)flushz2 Y)duration_strjohansen_etftsmomvol_edgema_slope_inverseqs_actionable_etftactical_awz[stock_only] Yahoo bars for rA   rB   r   rh   r  gate_checksr   r[   r\   rF   ma_slope_topnr  )r|  r  )r"  r   ib_mvr  r  r  r   )r"  r   r  r  r  r  r   allow_shortF   r  CASHu!   SH hedge off — SPY regime clearr  )r  r  r  r{  r|  K   u>   QS actionable-4 off — no SPY calendar/overnight signal todayc                Z    | d   | d   | j                  dd      | j                  dd      fS )Nr  r  r"  r  r  )r   )as    r?   rT  z*build_stock_only_signals.<locals>.<lambda>6  s/    *q{AEE&"<MquuU]_aObc r>   rU  r1   	ibkr_liveyahoo_offline)	connected	portfolior   )		spy_gatesr  r  r  r  r  r  r  r  )generated_atdata_sourcefund_nav_usdr  r  sleeve_budgets_usdibkrrv   r  bars_fetched_ibbars_fetched_yahoo)7rS   r   r   r6  rT   r   r   r   net_liquidation_usdr	   r    r  r  r   r   r   r   printr   r   r   r   rP   rY   r   r)   build_portfolior7   r3  r   r   ry   rF   r   r   r  r  r@  rz  r   r  r
   extendr   r2  r  r   rd  r   r   r   r9   r:   	isoformatr   )6ibr  r  r  r  r  r  r   wsumrW   rX   
ib_payloadr  resolved_navr  rU   
ib_symbolsrV   r,  rb   rM   johansen_symsmacro_yahoo
yahoo_symsr  
macro_dictr  tac_cfgpmtac_porttactical_targetstactical_metatsmom_pricestsmom_targets
tsmom_metavol_targetsvol_meta
ma_targetsma_metash_dictinverse_targetsinverse_metajohansen_paneljohansen_targetsjohansen_metadip_signalsdip_metadip_open
qs_targetsqs_metar  r  r  sleeve_budgetss6                                                         r?   build_stock_only_signalsr  B  sU
     <5#56G7>>#$!8/6}}?tq!q!d({?G?'.}}Gtq!%(Q,q%({GGG(,J E&.&:5?	L	~%b)))2266	Y::;'	2
Z(H(*H	~- !"#$ $%& g	

 	/J/@MUYZ*2zNN+-K {{>1-1 %6EE'$E1AEAEF 	
 #0EQ1H3DqEE+%,[[!%<q%@s=!ceM )0J(BQ(Fs#$CES +2++6H!*Lq*Ps%&VYV[	]
 "++&91=AW[[Q^`aEbefEfwlolqs

 ;;}a(1,J#m2D DEJ,S_,=\JRVWDN'
4@TV8[1F(5E1f!VAY,EJEZZz~~e45F#%G	"'	2B1;r!!*-H ;;}a(1, 	)28Y'( $m
 gkk-3a7'<ZSZ'[m$<< ]1QRV\Q\F1Ig$6!6 ]^eejoepL ;;w"Q&|/A/A 	#<08'++gq*AQ*FYGTU M: {{:q!A% 6 8X "Xy$9X{{?A&*46
G 8Y"7G
%7G1;q&)|GGG ;;)1-1f6HW 	FG,8'++6H!*LPQ*QYW^_` "O\ {{>1%)eKeV\\^+dTQqXcOcAqD+de*CN*S'-*,x.C-{{<#a' 4 6X "Xy$9X*51HZ(ZF8,<CPXMZH ;;*A.2v7I 	&f-8'++6I1*MQR*RYX_`a J
 02~'+++2I$&G{{=!$q(-=""(!#M2%"
	
 {{:q!A%+"#!#J/%
	
 {{7A"}"%!#G,% 		
 {{?A&*z"$"!#O4%
	
 {{%q)A-NN&++% '(: ;)%
 NN "$.$B*	 {{>1%).>"#(!#N3%" 		
 {{<#a'!#L1%5%		
 {{&*Q.:"("!#$78%
	
 
(!	,q	0 + [!		
 LLcLd MMOAqq5 	
5"8Q
;Q??N  !R(224&(n{/  , n:F"%'7I=I"K<8<=*='?w?!*O L| L&(8JMJ""+Z!C7!C

 !(--/2$[%5%5%78+ ] @G 	*6  O
 F F  F !^" H ,e  ,|s   Af	ef/ee&f:e;feB,f:e;-f(e;f	eeEf;	e#e#Cf	e(e()B=f&	e-0e-8A2f*e27e2<B;f7e88If'e;/B fff"f;fF)config_pathr  offlinec                L  K   | xs	 t         dz  }t        |      }|rt        d |       d {   S t        |j                         d {   }	 t        ||j                  |       d {   t        |       d {    S 7 U7 :7 7 # t        |       d {  7   w xY ww)Nz(RenTech/live/config/live_stock_only.json)r  )r  r  )_REPOr   r  r   r  r   )r  r  r  cfg_pathr   r  s         r?   run_stock_only_signals_asyncr  W  s      Ru'QQH
x
(C-dzJJJ#**%	%B -bPZ[[B K	%[mBsi   +B$BB$
BB$B +B,B /B$=B	>B$B$B 	B$B!BB!!B$c                    | j                         j                         } | j                  j                  dd       | j	                  t        j                  |dt              dz   d       | S )NT)parentsexist_okr1   )indentdefault
zutf-8)encoding)
expanduserresolveparentmkdir
write_textjsondumpsr   )pathpayloads     r?   write_stock_only_signalsr  h  sV    ??$$&DKKdT2OODJJwq#>EPWOXKr>   )returnzpd.Timestamp)rJ   z	list[str]rC   r   r  dict[str, pd.DataFrame])rU   r  rV   r  r  r  )r   pd.DataFramer  'tuple[dict[str, float], dict[str, Any]])r  r  )r   r  r  r  )r  r  r  r  r  r  )r   r  r  r  )r   r   r   r  rA  r   rB  r   rC  zpd.Timestamp | Noner  z+tuple[list[dict[str, Any]], dict[str, Any]])rv   list[dict[str, Any]]r  r   r  r   r  r   r{  r  r|  zset[str] | Noner  r  )r  r  r  r  )r  z
Any | Noner  zBrokerConfig | Noner  zdict[str, float] | Noner  r   r  zfloat | Noner  r   r  r   r  dict[str, Any])r  zPath | Noner  r   r  r   r  r  )r  r   r  r  r  r   )]__doc__
__future__r   r  r   r   pathlibr   typingr   zoneinfor   numpyr   pandasr7   RenTech.live.fund_signalsr   r	   r
   r   r   RenTech.live.ibkr_market_datar   RenTech.live.ibkr_sessionr   r   r   RenTech.live.platform_configr   r   RenTech.live.portfolior   RenTech.live.stock_book_utilsr   r   r   r   r   r   r   r   r   r   r   r   -RenTech.monitor.build_command_center_snapshotr    "RenTech.strategy_stack.data_loaderr!   RenTech.strategy_stack.mainr"   -RenTech.strategy_stack.multi_strategy_managerr#   r$   /RenTech.strategy_stack.ma_slope_cross_sectionalr%   r&   .RenTech.strategy_stack.ma_slope_inverse_sleever'   r(   -RenTech.strategy_stack.portfolio_risk_managerr)   0RenTech.strategy_stack.run_tsmom_managed_futuresr*   r+   r,   r-   r.   .RenTech.strategy_stack.run_volatility_edge_etnr/   r0   r:   __file__r  r
  r  LOGSDEFAULT_OUTr@   rP   rY   r   r   r  r  r@  rz  r  r  r  r  r  r=   r>   r?   <module>r9     sy   #          < X X K ;    G 9 H X f S  Y !X ((+y6!F*33A <@ 
=@,^ ,. 3l81\l  &*ff f 	f
 f $f 1f^ 1$(m!m m 	m
 m m "m m`oo,o2 #',0! $RR  R *	R
 R R R R Rn  $	     	 
  "r>   