+
    +iK                     x   ^ RI t^ RIHt ^ RIt]! ]4      P                  4       P                  ^,          t]R,          t	]
! ]	4      ]P                  9  d"   ]P                  P                  ]
! ]	4      4       ^ RIHt ^ RIHt RR R lltR R	 ltRR
 R lltRR R lltR R ltR t]R8X  d
   ]! 4        R# R# )    N)Pathsrc)get_model_ready_spot_lag_v3)load_eurusd_15mc                >    V ^8  d   QhR\         R\        R,          /# )   	thresholdallowed_hoursN)floatset)formats   "VC:\Users\paul_\OneDrive\fx_macro_intraday\src\research\combined_candidate_matrix_v1.py__annotate__r      s      % %%:%    c                 H   \        4       P                  4       pVP                  R 4      P                  RR7      p\        P
                  ! VR ,          4      P                  P                  VR&   Ve-   W"R,          P                  V4      ,          P                  4       p^ VR&   ^VP                  VR,          V 8  R3&   RVP                  VR,          V ) 8*  R3&   W"R,          ^ 8g  ,          P                  4       P                  RR7      p. ROpW4,          P                  4       # )datetimeTdrophour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   &&   r   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 ""$$r   c                X    V ^8  d   QhR\         P                  R\         P                  /# )r   m15ts)r    	DataFrame	Timestamp)r   s   "r   r   r   ,   s"      r||  r   c                 p    V R ,          P                  VRR7      pV\        V 4      8  d   R# \        V4      # )r   left)sideN)searchsortedlenint)r*   r+   idxs   && r   get_first_m15_idx_at_or_afterr5   ,   s2    
j/
&
&r
&
7C
c#hs8Or   c                p    V ^8  d   QhR\         P                  R\         P                  R\        R\        /# )r   r*   
signal_rowfib
wait_hours)r    r,   Seriesr   r3   )r   s   "r   r   r   3   s8     3
 3
	3
		3
 
3
 	3
r   c                    VR ,          p\        VR,          4      p\        VR,          4      p\        VR,          4      p\        VR,          4      p\        W4      p	V	f   R# V^,          p
V P                  WV
,            P	                  4       pVP
                  '       d   R# V^8X  dg   Wh,
          pV^ 8:  d   R# WbV,          ,
          pWR,          V8*  ,          pVP
                  '       d   R# VP                  ^ ,          pRVR ,          RV/# Wv,
          pV^ 8:  d   R# WbV,          ,           pWR,          V8  ,          pVP
                  '       d   R# VP                  ^ ,          pRVR ,          RV/# )r   r   r   r   r   N
entry_timeentry_price)r3   r   r5   ilocr   empty)r*   r7   r8   r9   signal_timer   signal_closesignal_high
signal_low	start_idx	wait_barswindowpullback_rangetarget_pricehithit_rows   &&&&            r   find_entry_pullbackrK   3   s]    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999((1+'*-<
 	
 %3Q#N&::F^|34999((1+'*-<
 	
r   c                    V ^8  d   QhR\         P                  R\         P                  R\        R\        R\        R\        R\        /# )r   r*   r<   r=   r   
hold_hoursstopspread_cost)r    r,   r-   r   r3   )r   s   "r   r   r   i   sV     , ,	,, , 	,
 , , ,r   c                    \        W4      pVf   R # V^,          p\        Wx,           \        V 4      ^,
          4      p	V P                  Wy^,            P	                  4       p
V
P
                  '       d   R # \        V
P                  R,          R,          4      pV^8X  dF   V
R,          P                  4       V,
          V,          pW) 8  pW,          ^,
          pV'       d   V) pMDV
R,          P                  4       V,
          V,          pW8  pW,          ^,
          ) pV'       d   V) pW,          pRVRV
P                  R,          R,          RVRVR	VR
V/# )Nr   r   r   r<   	exit_timer   r   r=   
exit_pricereturnr   )r5   minr2   r>   r   r?   r   max)r*   r<   r=   r   rM   rN   rO   	entry_idx	hold_barsexit_idxpathrR   adversestop_hitrets   &&&&&&&        r   simulate_trader]   i   s3    .c>IQI9(#c(Q,7H88I1-224Dzzztyy}W-.J{;??${2kAU?&*%C<##%3{B>(1,-%CC 	jTYYr]:.&{j# r   c                <    V ^8  d   QhR\         R\         R\        /# )r   r	   r8   rM   )r   r3   )r   s   "r   r   r      s&     Q Q QU Q Qr   c                 j   \        \        ^^4      4      p\        V VR7      p\        4       P	                  4       pVP                  R4      P                  RR7      p. pRpVP                  4        F  w  rV	R,          p
Ve	   W8  d   K  \        VV	V^R7      pVf   K/  \        VVR,          VR,          \        V	R	,          4      VR
RR7      pVf   Ke  VP                  V4       VR,          pK  	  \        P                  ! V4      pVP                  '       d   RV RVRVR^ RRRRRRRRRR/	# ^VR,          ,           P                  4       VR&   VR,          P!                  4       VR&   VR,          VR,          ,          ^,
          VR&   ^ p^ pVR,           F"  pV^ 8:  d   V^,          p\#        W4      pK   ^ pK$  	  RV RVRVR\%        V4      RVR,          ^ 8  P'                  4       RVR,          P'                  4       RVR,          P(                  R,          RVR,          P+                  4       RV/	# )   )r	   r
   r   Tr   N)r*   r7   r8   r9   r<   r=   r   {Gzd?-C6?)r*   r<   r=   r   rM   rN   rO   rQ   r	   r8   rM   tradeswin_rate
avg_returnfinal_equitymax_drawdownmax_losing_streakrS   equity_curverunning_peakdrawdownr   )r   ranger(   r   r   r   r   iterrowsrK   r]   r3   appendr    r,   r?   cumprodcummaxrU   r2   meanr>   rT   )r	   r8   rM   r
   r&   r*   rc   last_exit_time_sigr@   entrytraderh   current_streakrs   &&&             r   	run_combory      sZ   a%M"#G
 

 
 
"C
//*
%
1
1t
1
<CFN""$*o%+*F#	
 =\*m,s8}%!
 =e{+9 %< \\&!F|||3*a$DD

 
	
  &"22;;=F>#N3::<F>/&2HH1LF:NH6aN #$5 FN  	Ysj#f+VH%)//1fX&++-~.33B7z*..0.
 
r   c            
         . ROp RR.p. ROp. pV  F0  pV F'  pV F  pVP                  \        WEV4      4       K   	  K)  	  K2  	  \        P                  ! V4      p\	        R4       \	        VP                  RR7      4       \	        R4       \	        VP                  RRR7      P                  ^
4      P                  RR7      4       \	        R	4       \	        VP                  R
RR7      P                  ^
4      P                  RR7      4       R# )      @g-?gx&?z&
=== COMBINED CANDIDATE MATRIX V1 ===
F)indexz
Top 10 by final equity:rf   )	ascendingz
Top 10 by lowest drawdown:rg   N)r{   g      @g      @)   4   5   )rn   ry   r    r,   print	to_stringr   head)
thresholdsfibsholdsresultsr	   r8   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)   )ra   rb   )pandasr    pathlibr   sys__file__resolveparents	BASE_PATHSRC_PATHstrrY   rn   features.spot_lag_v3r   ingestion.price_loader_15mr   r(   r5   rK   r]   ry   r   __name__ r   r   <module>r      s      
N""$,,Q/	ux= HHOOCM" < 6%:3
l,^Qhb0 zJ r   