
    ie                     6   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\4S jjr   SS
\R(                  S\R*                  S\S\S\S\S\4S jjr    SS\S\S\S\S\4
S j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       $ )zW
Frozen signal layer:
- same lag signal
- same session filter
- only threshold changes
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        \C:\Users\paul_\OneDrive\fx_macro_intraday\src\research\entry_refinement_threshold_test_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.   2   s2    
j/
&
&r
&
7C
c#hs8Or$   
signal_row
wait_hoursc                 *   Sn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XcU-  -
  nXS   U:*     nUR
                  (       a  gUR                  S
   nUS   US.$ Xv-
  nUS
::  a  gXcU-  -   nXS   U:     nUR
                  (       a  gUR                  S
   nUS   US.$ )z
Best entry from prior truthful 15m test:
0.786 pullback anchored to the signal-hour candle range.

Long:
  target = close - 0.786 * (close - low)

Short:
  target = close + 0.786 * (high - close)
gx&?r   r   r   r   r   N   r   r   )
entry_timeentry_price)r,   floatr.   ilocr   empty)r%   r/   r0   fibsignal_timer   signal_closesignal_high
signal_low	start_idx	wait_barswindowpullback_rangetarget_pricehithit_rows                   r"   find_entry_0786rD   9   sT    C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$   r3   r4   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.$ )	Nr2   r   r   r   r   r   r   )r3   	exit_timer   r4   
exit_pricereturn)r.   minr+   r6   r   r7   r5   max)r%   r3   r4   r   rE   rF   rG   	entry_idx	hold_barsexit_idxpathrJ   adversestop_hitrets                  r"   simulate_traderU   z   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                 J   [        [        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        H`  u  pUS   nU	b  X:  a  M  [        UUUS9nUc  M$  [        UUS   US	   [        US
   5      UUUS9nUc  MJ  UR                  U5        US   n	Mb     [        R                  " U5      nUR                  (       a  U S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[#        UU5      nM  SnM      [        R$                  " US   5      R&                  R(                  US'   UR+                  S5      S   R-                  5       nU [/        U5      US   S:  R1                  5       US   R1                  5       US   R2                  S   US   R5                  5       UUR5                  5       S.$ )N      )r   r	   r   Tr   )r%   r/   r0   r3   r4   r   )r%   r3   r4   r   rE   rF   rG   rI   r   )r   tradeswin_rate
avg_returnfinal_equitymax_drawdownmax_losing_streak	worst_dayr   rK   equity_curverunning_peakdrawdown
entry_dater   )setranger#   r   r   r   r   iterrowsrD   rU   r,   appendr   	DataFramer7   cumprodcummaxrM   r   r   dategroupbysumr+   meanr6   rL   )r   rE   rF   rG   r0   r	   r    r%   rY   last_exit_time_sigr9   entrytrader^   current_streakrdaily_returnss                      r"   run_backtest_for_thresholdrw      sz    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  >>&*>?BBGGF<NN<0:>>@M f+H%)//1X&++-~.33B7z*..0."&&(	 	r$   c                     / SQn / nU  H  n[        U5      nUR                  U5        M!     [        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      @g      @z,
=== ENTRY REFINEMENT THRESHOLD TEST V1 ===
F)indexz
Best by final equity:r\   )	ascendingr   z
Best by lowest drawdown:r]   )rw   rg   r   rh   print	to_stringr   head)
thresholdsresultstres	result_dfs        r"   run_testr     s    ,JG(+s  W%I	
:;	)

E

*+	
#$	)

%

@
E
Ea
H
R
RY^
R
_`	
&'	)

%

@
E
Ea
H
R
RY^
R
_`r$   __main__)N)   )0   {Gzd?-C6?)r   r   r   r   )pandasr   pathlibr   sys__file__resolveparents	BASE_PATHSRC_PATHstrrQ   rg   features.spot_lag_v3r   ingestion.price_loader_15mr   r5   rd   r#   rh   	Timestampr.   Seriesr,   rD   rU   rw   r   __name__ r$   r"   <module>r      s     
N""$,,Q/	ux= HHOOCM" < 6
 !% % %: %Fr||   >
	>
		>
 >
L ,	,, , 	,
 , , ,b ZZZ Z 	Z
 Zza( zJ r$   