
    +iK                     $   S SK rS SKJr  S SKr\" \5      R                  5       R                  S   r\S-  r	\
" \	5      \R                  ;  a!  \R                  R                  \
" \	5      5        S SKJr  S SKJr   SS\S\S-  4S	 jjrS
\R(                  S\R*                  4S jr SS
\R(                  S\R.                  S\S\4S jjr  SS
\R(                  S\R*                  S\S\S\S\S\4S jjrS\S\S\4S jrS r\S:X  a  \" 5         gg)    N)Path   src)get_model_ready_spot_lag_v3)load_eurusd_15m	thresholdallowed_hoursc                    [        5       R                  5       nUR                  S5      R                  SS9n[        R
                  " US   5      R                  R                  US'   Ub$  X"S   R                  U5         R                  5       nSUS'   SUR                  US   U :  S4'   S	UR                  US   U * :*  S4'   X"S   S:g     R                  5       R                  SS9n/ S
QnX4   R                  5       $ )NdatetimeTdrophourr   signal   lag_zscore_24h_v3)r   openhighlowcloser   r   )
r   copysort_valuesreset_indexpdto_datetimedtr   isinloc)r   r	   dfsignals	keep_colss        VC:\Users\paul_\OneDrive\fx_macro_intraday\src\research\combined_candidate_matrix_v1.pybuild_frozen_signalsr#      s    
%	&	+	+	-B	
	#	/	/T	/	:B:/2277BvJ 6
./446BxL=>BFF2!"i/9:>@BFF2!"yj0(:;H"#((*66D6AGI ""$$    m15tsc                 ^    U S   R                  USS9nU[        U 5      :  a  g [        U5      $ )Nr   left)side)searchsortedlenint)r%   r&   idxs      r"   get_first_m15_idx_at_or_afterr.   ,   s2    
j/
&
&r
&
7C
c#hs8Or$   
signal_rowfib
wait_hoursc                 &   US   n[        US   5      n[        US   5      n[        US   5      n[        US   5      n[        X5      n	U	c  g US-  n
U R                  XU
-    R	                  5       nUR
                  (       a  g US:X  aE  Xh-
  nUS::  a  g XbU-  -
  nXS   U:*     nUR
                  (       a  g UR                  S   nUS   US	.$ Xv-
  nUS::  a  g XbU-  -   nXS   U:     nUR
                  (       a  g UR                  S   nUS   US	.$ )
Nr   r   r   r   r      r   r   )
entry_timeentry_price)r,   floatr.   ilocr   empty)r%   r/   r0   r1   signal_timer   signal_closesignal_high
signal_low	start_idx	wait_barswindowpullback_rangetarget_pricehithit_rows                   r"   find_entry_pullbackrD   3   sO    Z(KH%&FG,-L
6*+Kz%()J-c?IQIXXii"78==?F||{%2Q#N&::E]l2399((1+!*-'
 	
 %3Q#N&::F^|3499((1+!*-'
 	
r$   r4   r5   r   
hold_hoursstopspread_costc                    [        X5      nUc  g US-  n[        Xx-   [        U 5      S-
  5      n	U R                  XyS-    R	                  5       n
U
R
                  (       a  g [        U
R                  S   S   5      nUS:X  a0  U
S   R                  5       U-
  U-  nX* :  nX-  S-
  nU(       a  U* nO/U
S   R                  5       U-
  U-  nX:  nX-  S-
  * nU(       a  U* nX-  nUU
R                  S   S   UUUUS.$ )	Nr3   r   r   r   r   r   r   )r4   	exit_timer   r5   
exit_pricereturn)r.   minr+   r7   r   r8   r6   max)r%   r4   r5   r   rE   rF   rG   	entry_idx	hold_barsexit_idxpathrJ   adversestop_hitrets                  r"   simulate_traderU   i   s%    .c>IQI9(#c(Q,7H88I1-224Dzztyy}W-.J{;??${2kAU?&*%C<##%3{B>(1,-%CC !YYr]:."  r$   c                    [        [        SS5      5      n[        U US9n[        5       R	                  5       nUR                  S5      R                  SS9n/ nS nUR                  5        Ha  u  pU	S   n
Ub  X:  a  M  [        UU	USS9nUc  M%  [        UUS	   US
   [        U	S   5      USSS9nUc  MK  UR                  U5        US   nMc     [        R                  " U5      nUR                  (       a  U UUSS S S S S S.	$ SUS   -   R                  5       US'   US   R!                  5       US'   US   US   -  S-
  US'   SnSnUS    H  nUS::  a  US-  n[#        X5      nM  SnM     U UU[%        U5      US   S:  R'                  5       US   R'                  5       US   R(                  S   US   R+                  5       US.	$ )N      )r   r	   r   Tr      )r%   r/   r0   r1   r4   r5   r   {Gzd?-C6?)r%   r4   r5   r   rE   rF   rG   rI   r   )	r   r0   rE   tradeswin_rate
avg_returnfinal_equitymax_drawdownmax_losing_streakr   rK   equity_curverunning_peakdrawdownr   )setranger#   r   r   r   r   iterrowsrD   rU   r,   appendr   	DataFramer8   cumprodcummaxrM   r+   meanr7   rL   )r   r0   rE   r	   r    r%   r\   last_exit_time_sigr9   entrytradera   current_streakrs                   r"   	run_combort      s0   a%M"#G
 

 
 
"C
//*
%
1
1t
1
<CFN""$*o%+*F#	
 =\*m,s8}%!
 =e{+9 %< \\&!F||"$  !%

 
	
  &"22;;=F>#N3::<F>/&2HH1LF:NH6aN #$5 FN   f+H%)//1X&++-~.33B7z*..0.
 
r$   c            
         / SQn SS/n/ SQn/ nU  H0  nU H'  nU H  nUR                  [        XEU5      5        M      M)     M2     [        R                  " U5      n[	        S5        [	        UR                  SS95        [	        S5        [	        UR                  S	SS
9R                  S5      R                  SS95        [	        S5        [	        UR                  SSS
9R                  S5      R                  SS95        g )N)g      @g      @g      @g-?gx&?)   4   5   z&
=== COMBINED CANDIDATE MATRIX V1 ===
F)indexz
Top 10 by final equity:r_   )	ascending
   z
Top 10 by lowest drawdown:r`   )rh   rt   r   ri   print	to_stringr   head)
thresholdsfibsholdsresultsr   r0   hold	result_dfs           r"   run_testr      s    #J5>DEG	Cy>?    
 W%I	
45	)

E

*+	
%&	)

%

@
E
Eb
I
S
SZ_
S
`a	
()	)

%

@
E
Eb
I
S
SZ_
S
`ar$   __main__)N)rY   )rZ   r[   )pandasr   pathlibr   sys__file__resolveparents	BASE_PATHSRC_PATHstrrQ   rh   features.spot_lag_v3r   ingestion.price_loader_15mr   r6   re   r#   ri   	Timestampr.   Seriesr,   rD   rU   rt   r   __name__ r$   r"   <module>r      s`     
N""$,,Q/	ux= HHOOCM" < 6
 !%%%:%:r||   	3
	3
		3
 
3
 	3
x ,	,, , 	,
 , , ,^Q QU Q Qhb0 zJ r$   