
    P\j/                       d dl mZ d dlZd dlmc mZ d dlZd dl	m
Z
 d dlmZ d dlmZ d dlZd dlmZ d dlmZmZ d dlmZ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d#dZ"d$dZ#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d  Z+d! Z,d" Z-dS )%    )annotationsN)replaceDecimal)Path)L2BookSummary)TrendRetestFeaturesbuild_trend_retest_features)TradingViewContextclassify_tradingview_impulse)LONG_STRATEGY_IDSHORT_RESEARCH_IDentry_blockers)MOMENTUM_RESEARCH_IDMOMENTUM_VERSION)v77_trend_retest_runtime)latestinterval_msintcloseslist[Decimal]now_msr   dict[str, str] | Nonereturnlist[dict[str, str | int]]c                   g }|t          |          | z  z
  }t          |          D ]\  }}|t          d          z
  }||| z  z   ||dz   | z  z   dz
  t          |          t          |t          d          z             t          |t          d          z
            t          |          dd}	|                    |	           |r|d                             |           |S )Nz0.05   z0.205000)tTohlcv)len	enumerater   strappendupdate)
r   r   r   r   rowsstartidxclose
open_pricerows
             Y/home/agent/projects/CryptoTradingBot/Crypto_Agent/tests/test_v77_trend_retest_runtime.py_candlesr3      s    DS[[;..E''  
UWV__,
{**#'[0014ZUWV__,--Z'&//122U
 
 	C  RK    r	   c                    t          d=i dddt          d          ddddd	t          d
          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          d t          d!          d"t          d#          d$t          d%          d&t          d          d't          d(          d)t          d*          d+t          d,          d-t          d.          d/t          d.          d0t          d,          d1t          d,          d2t          d3          d4t          d5          d6t          d3          d7d8d9d:d;t          d<          }t          |fi | S )>NcoinBTCcurrent_price100	candle_ts   data_window_idzwindow-1open_15m99.5high_15m100.5low_15m98.8	close_15mmove_15m_pctz0.50move_1h_pctz0.60sma_1h_fast99sma_1h_slow97sma_4h_fast96sma_4h_slow94atr_pctz0.80rsi_15m60
volume_24h50000000volume_ratioz1.50recent_high101
recent_lowpullback_from_high_pct0.99rebound_from_low_pct1.01
spread_pct0.02bid_depth_notional_550000ask_depth_notional_5buy_impact_1k_pctsell_impact_1k_pctfunding_rate_hourly_pct0open_interest1000premium_pctstrength_rankr   weakness_rank   breadth_positive_pct75 )r	   r   r   )changesbases     r2   _featurero   &   so    " " "U"ennn" #" "z	"
 " !!!" " %..." V___" FOOO" DMMM" DMMM" DMMM" DMMM" "  !"" :&&&#"$ V___%"& ENNN'"( 4===)"*  'v+", %V___-". 6???/"0 %W---1"2 %W---3"4 "&///5"6 #6???7"8 !(9": fooo;"< CLLL="> a?"@ aA"B %T]]]C"DF 4##7###r4   c                    d} t          dd t          d          D             | ddddd	d
          }t          dd t          d          D             |           }t          dd t          d          D             |           }t          d|||| t          d          t          d          t          d          t          d          t          d          
  
        }|j        }d}t          |          }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}x}}|j        }d}t          |          }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}x}}|j        }d}||k    }|st          j        d|fd ||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          t          j
        |          d!z  }d"d#|iz  }t          t          j        |                    d x}x}}|j        }|j        }||k    }|st          j        d$|fd%||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          d&z  }d'd(|iz  }	t          t          j        |	                    d x}x}}|j        }|sxd)dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          d*z  }t          t          j        |                    d }|j        }d+}||u }|st          j        d,|fd-||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          t          j
        |          d!z  }d"d#|iz  }t          t          j        |                    d x}x}}d S ).N     RF頻 c                l    g | ]1}t          d           t          |          t          d          z  z   2S rG   r9   r   .0is     r2   
<listcomp>zNtest_feature_builder_uses_closed_ohlcv_and_no_proxy_values.<locals>.<listcomp>O   6    /o/o/o`a

WUZ^^@[0[/o/o/or4   <   99.4100.4rB   r9   10000r!   r"   r#   r$   r%   r   r   r   r   6 c                l    g | ]1}t          d           t          |          t          d          z  z   2S 905r   ru   s     r2   rx   zNtest_feature_builder_uses_closed_ohlcv_and_no_proxy_values.<locals>.<listcomp>P   6    1o1o1o`a'$--'!**wWZ||B[2[1o1o1or4   r   r   r     c                l    g | ]1}t          d           t          |          t          d          z  z   2S 803r   ru   s     r2   rx   zNtest_feature_builder_uses_closed_ohlcv_and_no_proxy_values.<locals>.<listcomp>Q   9    2p2p2pab74==71::PWX[P\P\C\3\2p2p2pr4   r7   r\   r^   
r6   candles_15m
candles_1h
candles_4hr   r[   r]   r_   r`   ra   ==)zS%(py2)s
{%(py2)s = %(py0)s.current_price
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}featurer   )py0py2py4py6py8assert %(py10)spy10z1.9)>)zQ%(py2)s
{%(py2)s = %(py0)s.volume_ratio
} > %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   )z.%(py2)s
{%(py2)s = %(py0)s.atr_pct
} > %(py5)s)r   r   py5zassert %(py7)spy7!=)zV%(py2)s
{%(py2)s = %(py0)s.sma_1h_fast
} != %(py6)s
{%(py6)s = %(py4)s.current_price
}r   r   r   r   assert %(py8)sr   z2assert %(py2)s
{%(py2)s = %(py0)s.data_window_id
})r   r   Tis)z<%(py2)s
{%(py2)s = %(py0)s.data_quality_allowed
} is %(py5)s)r3   ranger
   r   r8   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationrS   rN   rF   r<   data_quality_allowed)r   c15c1hc4hr   @py_assert1@py_assert5@py_assert7@py_assert3@py_format9@py_format11@py_assert4@py_format6@py_format8@py_format7@py_format3s                   r2   :test_feature_builder_uses_closed_ohlcv_and_no_proxy_valuesr   M   se   F
w/o/oejkmenen/o/o/ox~  NT  [b  io  v{  BI  HJ  HJ  K  K  KC
y1o1oejkmenen1o1o1ox~


C
z2p2pfklnfofo2p2p2py  A  A  AC)u#RUbent  BI  JP  BQ  BQ  ho  pw  hx  hx  OV  W^  O_  O_  sz  {A  sB  sB  W^  _e  Wf  Wf  g  g  gG 2E2GENN2 N2222222222 N2222222222227222227222222 22222222222G22222G222222E2222N222222222222222222222222222220%0'%..0.0000000000.000000000000700000700000000000000000'00000'000000%0000.00000000000000000000000000000?Q?Q?Q77?Q7'"77"77777777777"7777777777777777777777777777777777777'77777'777777"7777777777777777777777777777!!!!!!!!!!!!!!7!!!!!7!!!!!!!!!!!!!!!!!!!!!!!!'/4/'4//////////'4////////////7/////7//////'////4/////////////////////////////r4   c                   
 dt          dd t          d          D                       } t          dd t          d          D                       
t          dd	 t          d          D                       
fd
} ||           }d | D             }t          t          t          |d         d                             t          d          z             |d         d<    ||          }|j        }|j        }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}d S )Nrq   rr   c                l    g | ]1}t          d           t          |          t          d          z  z   2S rt   r   ru   s     r2   rx   z]test_data_window_identity_changes_when_ohlcv_is_revised_at_same_timestamp.<locals>.<listcomp>]   ry   r4   rz   r   r   c                l    g | ]1}t          d           t          |          t          d          z  z   2S r   r   ru   s     r2   rx   z]test_data_window_identity_changes_when_ohlcv_is_revised_at_same_timestamp.<locals>.<listcomp>^   r   r4   r   c                l    g | ]1}t          d           t          |          t          d          z  z   2S r   r   ru   s     r2   rx   z]test_data_window_identity_changes_when_ohlcv_is_revised_at_same_timestamp.<locals>.<listcomp>_   r   r4   c                    t          d| t          d          t          d          t          d          t          d          t          d          
  
        S )Nr7   r\   r^   r   )r
   r   )r   r   r   r   s    r2   buildzXtest_data_window_identity_changes_when_ohlcv_is_revised_at_same_timestamp.<locals>.build`   s    *;[^knw}  KR  SY  KZ  KZ  qx  y@  qA  qA  X_  `g  Xh  Xh  |C  DJ  |K  |K  `g  hn  `o  `o  p  p  p  	pr4   c                ,    g | ]}t          |          S rl   )dict)rv   r1   s     r2   rx   z]test_data_window_identity_changes_when_ohlcv_is_revised_at_same_timestamp.<locals>.<listcomp>c   s    (((StCyy(((r4   r$   z0.01r   )zZ%(py2)s
{%(py2)s = %(py0)s.data_window_id
} != %(py6)s
{%(py6)s = %(py4)s.data_window_id
}changedoriginalr   r   r   )r3   r   r)   r   r<   r   r   r   r   r   r   r   r   )r   r   r   revisedr   r   r   r   r   r   r   r   r   s             @@@r2   Itest_data_window_identity_changes_when_ohlcv_is_revised_at_same_timestampr   [   sU   F
w/o/oejkmenen/o/o/ox~


C
y1o1oejkmenen1o1o1ox~


C
z2p2pfklnfofo2p2p2py  A  A  ACp p p p p p puSzzH((C(((G73wr{3'7#8#899GFOOKLLGBKeGnnG!<X%<<!%<<<<<<<<<<<!%<<<<<<<<<<<<<7<<<<<7<<<<<<!<<<<<<<<<<<X<<<<<X<<<<<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<r4   c                 @	   t                      } d}t          | |          }g }||k    }|st          j        d|fd||f          dt	          j                    v st          j        t                    rt          j        t                    nddt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d x}x}x}}t          d3i d
t          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          ddd d!d"t          d#          d$t          d          d%t          d&          d't          d(          d)t          d*          d+t          d,          }d-}t          ||          }g }||k    }|st          j        d|fd||f          dt	          j                    v st          j        t                    rt          j        t                    ndd.t	          j                    v st          j        |          rt          j        |          nd.t          j        |          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d x}x}x}}d/}d-}	t          | |	          }||v }|st          j        d0|fd1||f          t          j        |          dt	          j                    v st          j        t                    rt          j        t                    nddt	          j                    v st          j        |           rt          j        |           ndt          j        |	          t          j        |          d2z  }dd	|iz  }t          t          j	        |                    d x}x}x}	}d S )4Nlongsider   )z>%(py5)s
{%(py5)s = %(py0)s(%(py1)s, side=%(py3)s)
} == %(py8)sr   long_feature)r   py1py3r   r   r   r   r=   r@   rC   r9   r?   101.2rA   r>   rD   z-0.50rE   z-0.60rF   rU   rH   103rJ   104rL   106rg   ri   rh   r   rj   25rT   rV   rG   rW   rX   rY   rZ   rO   40shortshort_featuretrend_1h_not_bearish)in)z>%(py1)s in %(py8)s
{%(py8)s = %(py3)s(%(py4)s, side=%(py6)s)
})r   r   r   r   r   rl   )ro   r   r   r   r   r   r   r   r   r   r   )
r   @py_assert2r   r   @py_assert6r   r   r   @py_assert0r   s
             r2   4test_v77_long_and_short_retest_gates_are_directionalr   i   sq   ::L-3:>,V444::4::::::::::4::::::::::::>:::::>:::::::::::::,:::::,::::::V::::4:::::::::::::::::::::::::::::::::   !!!-4U^^^FMgFVFVFV`ghn`o`o`oW%%%3:73C3C3CQXY^Q_Q_Q_mtuzm{m{m{ ENNN 18 OPa `a_` x  @D  xE  xE  xE ENNN	 07t}}}	 V]]cUdUdUd	 |C  DJ  |K  |K  |K	 U\  ]a  Ub  Ub  Ub	M /6<>-g666<"<6"<<<<<<<<<<6"<<<<<<<<<<<<><<<<<><<<<<<<<<<<<<-<<<<<-<<<<<<g<<<<6<<<<"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!OwO^Lw%O%O%OO!%OOOOOOOOOOO!%OOOOOO!OOOOOOOOOOO^OOOOO^OOOOOOOOOOOOOLOOOOOLOOOOOOwOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOr4   c            
        t          dddt          d          dddd	          } t          | d
          }|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||u }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )Nr7   BTCUSDTbearishz0.82alignedbreakout	expanding   )r6   symbolbias
confidencetrend_alignmentvolume_statevolatility_statesource_age_secondsr   r   categorysell_opportunityr   z%(py1)s == %(py4)sr   r   assert %(py6)sr   action#paper_candidate_if_other_gates_passlive_order_allowedFr   z%(py1)s is %(py4)s)r   r   r   r   r   r   r   r   )tvimpulser   r   r   @py_format5r   s          r2   Btest_tradingview_bearish_alignment_becomes_short_paper_opportunityr   v   s_   	yyU\]cUdUdv  OY  lw  LN  
O  
O  
OB*2G<<<G:4"44"44444444444"4444444444"44444444444444444444444444448E EE EEEEEEEEEEE EEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEE'(1E1(E1111111111(E11111(1111E11111111111111111111111111111r4   c           	        ddi ddddddd	dd
dddddddddddddddddddddddddddd d!d"ii}t          d#t          d$          t          d%          t          d&          '          }t          j        |d|i| t          d()          \  }}d}||k    }|st          j        d*|fd+||f          d,t          j                    v st          j	        |          rt          j
        |          nd,t          j
        |          d-z  }d.d/|iz  }t          t          j        |                    d x}}|d         d         }	|	d         }
d0}|
|u }|slt          j        d1|fd2|
|f          t          j
        |
          t          j
        |          d3z  }d4d5|iz  }t          t          j        |                    d x}
x}}|	d         }t          |          }d6}t          |          }||k    }|s"t          j        d*|fd7||f          d8t          j                    v st          j	        t                    rt          j
        t                    nd8t          j
        |          t          j
        |          d8t          j                    v st          j	        t                    rt          j
        t                    nd8t          j
        |          t          j
        |          d9z  }d:d;|iz  }t          t          j        |                    d x}x}x}x}}|	d
         }t          |          }d}t          |          }||k    }|s"t          j        d*|fd7||f          d8t          j                    v st          j	        t                    rt          j
        t                    nd8t          j
        |          t          j
        |          d8t          j                    v st          j	        t                    rt          j
        t                    nd8t          j
        |          t          j
        |          d9z  }d:d;|iz  }t          t          j        |                    d x}x}x}x}}d< | d=z                                                                  D             }|d>         d?         }
d@}|
|k    }|slt          j        d*|fdA|
|f          t          j
        |
          t          j
        |          d3z  }d4d5|iz  }t          t          j        |                    d x}
x}}|d>         dB         }
dC}|
|k    }|slt          j        d*|fdA|
|f          t          j
        |
          t          j
        |          d3z  }d4d5|iz  }t          t          j        |                    d x}
x}}d S )DNopen_positionsr7   r   r   entryr9   sizez0.10original_size	stop_lossrG   tp1r   tp1_hitFentry_fee_usdz0.0045spread_cost_usdz0.001slippage_cost_usdexit_slippage_pctr\   rb   rc   last_managed_candle_tsd   	bars_heldr   mfe_pctmae_pcthigh_watermarkw1&confirmed_trend_retest_anti_chase_long)low_watermarkrealized_net_pnl_accumr<   setupr;   z101.3r>   rU   )r:   r?   rA   rC   zrun-1)statefeaturesruntime_dirstrategy_idrun_idr   )z%(py0)s == %(py3)sclosedr   r   assert %(py5)sr   Tr   r   r   r   r   z0.050)zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r   )r   r   r   r   r   r   zassert %(py12)spy12c                6    g | ]}t          j        |          S rl   )jsonloads)rv   lines     r2   rx   zPtest_partial_tp_moves_stop_to_break_even_and_keeps_half_open.<locals>.<listcomp>   s"    eeeDJteeer4   ztrade_journal.jsonlr&   eventpartial_exitr   exit_reasontp1_partial_50pct)ro   r   runtime_manage_positionsr   r   r   r   r   r   r   r   r   	read_text
splitlines)tmp_pathr  r   r  _r   r   @py_format4r   posr   r   r   r   r   @py_assert9r   r   @py_format13r,   s                       r2   <test_partial_tp_moves_stop_to_break_even_and_keeps_half_openr,  ~   s,    ((((.(8G(Q\^b(dikr(5()8(5F(Qdfm( 	V( &?( F^_b( epqr( 	3	( "3	( )9%	( SXsv)Q( ( (   E ww/?/?QWdklqdrdrsssG)@P^f  uE  NU  V  V  VIFA6Q;6Q66Q
 
!%
(Cy>!T!>T!!!!!!!!!!>T!!!!!>!!!!T!!!!!!!!!!!!!!!!!!!!!!!!!!!v;37;37377#3#33#33333333333#33333333333337333337333333;333333333333333733333733333373333#33333333333333333333333333333333{#67#$$666$6666666666$6666666666667666667666666#6666$666666666666666666666666666666666666666666666666666666666ee(5J*J)U)U)W)W)b)b)d)deeeD8G................................................8M"9&99"&99999999999"&999999"9999&999999999999999999999999999999r4   c                l   |                      dd           |                      dd           |                      dd           |                      dd           t          j        t                    5  t	          j        t          dgt                                 d d d            d S # 1 swxY w Y   d S )	NCTB_PAPER_TRADINGtrueCTB_LIVE_TRADING_ALLOWEDfalseHL_MAINNET_SIGNED_ACTIONCTB_LIVE_ORDER_ALLOWEDr7   md)setenvpytestraisesPermissionErrorr"  	scan_oncer   objectmonkeypatchs    r2   ,test_runtime_refuses_any_live_or_signed_flagr>     s   *F33317;;;17;;;/888		'	' B B*UGAAAAB B B B B B B B B B B B B B B B B Bs   2*B))B-0B-c                n  
 |                     |            |                    dd           |                    dd           |                    dd           |                    dd           d
 G 
fdd	          }|                    t          j        d

fd           t          j        t          dg |                      }|d         }d}||k    }|slt          j        d|fd||f          t          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||u }|slt          j        d|fd||f          t          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||u }|slt          j        d|fd||f          t          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}t          j        t          |d                   dz                                                                  d                   }	|	d          }d}||u }|slt          j        d|fd||f          t          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|	d!         d"         }d#}||k    }|slt          j        d|fd||f          t          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )$Nr.  r/  r0  r1  r3  r2  rq   c                  &    e Zd Zd Z fdZd ZdS )Ptest_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.FakeMarketDatac                    dddigiddddggS )Nuniversenamer7   z0.0001re   rc   )fundingopenInterestpremiumrl   )selfs    r2   get_meta_and_asset_ctxszhtest_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.FakeMarketData.get_meta_and_asset_ctxs   s(    65/!23(\bor6s6s5tuur4   c                B   |dk    rAt          dd t          d          D             t          d          gz   ddddd	d
          S |dk    r)t          dd t          d          D                       S t          dd t          d          D                       S )N15mrr   c                ,    g | ]}t          d           S )r>   r   )rv   r'  s     r2   rx   zptest_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.FakeMarketData.get_candles.<locals>.<listcomp>   s    <`<`<`QRWV__<`<`<`r4   ;   r9   r{   r|   rB   r}   r~   r   1hr   c                l    g | ]1}t          d           t          |          t          d          z  z   2S r   r   ru   s     r2   rx   zptest_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.FakeMarketData.get_candles.<locals>.<listcomp>   s:    >|>|>|mnwt}}wWXzz\cdg\h\hOh?h>|>|>|r4   rz   r   r   c                l    g | ]1}t          d           t          |          t          d          z  z   2S r   r   ru   s     r2   rx   zptest_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.FakeMarketData.get_candles.<locals>.<listcomp>   s:    ;y;y;yjkGDMMGTUJJY`adYeYeLe<e;y;y;yr4   )r3   r   r   )rH  r6   intervalstart_msend_msr   s        r2   get_candlesz\test_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.FakeMarketData.get_candles   s   5  G<`<`V[\^V_V_<`<`<`dklqdrdrcs<s  }C  RX  _f  ms  z  FM  LN  LN  O  O  O  O4I>|>|rwxzr{r{>|>|>|  FL  M  M  M  M
;y;yotuwoxox;y;y;y  CI  J  J  J  Jr4   c           	     ^    ddddddddddddddddgd	ddd
dddddddddddggiS )Nlevelsz99.99r9   )pxszz99.98z99.97z99.96z99.95z100.01z100.02z100.03z100.04z100.05rl   )rH  r6   s     r2   get_l2_bookz\test_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.FakeMarketData.get_l2_book   s    u--gU/K/KT[chMiMiry  BG  lH  lH  QX  `e  Jf  Jf  g ..xu0M0MV^fkOlOlu}  FK  oL  oL  U]  ej  Nk  Nk  l  r4   N)__name__
__module____qualname__rI  rT  rY  r   s   r2   FakeMarketDatarA     sT        	v 	v 	v	J 	J 	J 	J 	J	 	 	 	 	r4   r^  timec                      dz  S )Ni  rl   r]  s   r2   <lambda>zJtest_scan_once_with_real_feature_shapes_stays_paper_only.<locals>.<lambda>   s    ftm r4   r7   r4  statusokr   r   r   r   r   features_loadedr   paper_tradingTr   r   r   Fr  zsignal_journal.jsonlr&   proxy_inputs_usedr  data_source"hyperliquid_live_readonly_ohlcv_l2)chdirr6  setattrr"  r_  r:  r   r   r   r   r   r   r  r  r   r$  r%  )r&  r=  r^  payloadr   r   r   r   r   signalr   s             @r2   8test_scan_once_with_real_feature_shapes_stays_paper_onlyrm     s:   h*F33317;;;/99917;;;F          f.C.C.C.CDDD 05'nn>N>NOOOG8$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%**%**********%*****%*******************************?#+t+#t++++++++++#t+++++#++++t+++++++++++++++++++++++++++'(1E1(E1111111111(E11111(1111E111111111111111111111111111Zgm4558NNYY[[ffhhiklmmF%&/%/&%//////////&%/////&////%///////////////////////////*m,T0TT,0TTTTTTTTTTT,0TTTTTT,TTTT0TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTr4   c                    |                      dd           t          j        t                    5  t	          j        t          dgt                                 d d d            d S # 1 swxY w Y   d S )Nr.  F)raisingr7   r4  )delenvr7  r8  r9  r"  r:  r   r;  r<  s    r2   )test_runtime_requires_explicit_paper_flagrq     s    *E:::		'	' B B*UGAAAAB B B B B B B B B B B B B B B B B Bs   *A((A,/A,c            
        t          d=i dddt          d          dt          d          dt          d          dt          d	          d
t          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dt          d          dddt          d          dd} t          j        t                   }d }||k    }|slt          j        d!|fd"||f          t          j        |          t          j        |          d#z  }d$d%|iz  }t          t          j	        |                    d x}x}}t          j
        } |t                    }|t          k    }|sIt          j        d!|fd&|t          f          d't          j                    v st          j        t                    rt          j        t                    nd't          j        |          d(t          j                    v st          j        t                    rt          j        t                    nd(t          j        |          d)t          j                    v st          j        t                    rt          j        t                    nd)d*z  }	d+d,|	iz  }
t          t          j	        |
                    d x}x}}t          j        }d } |t          | |-          }g }||k    }|s`t          j        d!|fd.||f          d't          j                    v st          j        t                    rt          j        t                    nd't          j        |          d(t          j                    v st          j        t                    rt          j        t                    nd(d/t          j                    v st          j        |           rt          j        |           nd/t          j        |          t          j        |          t          j        |          d0z  }d1d2|iz  }t          t          j	        |                    d x}x}x}x}}t          j        t          | d d34          }d }||u}|st          j        d5|fd6||f          d7t          j                    v st          j        |          rt          j        |          nd7t          j        |          d8z  }d9d:|iz  }t          t          j	        |                    d x}}|j        }|t          k    }|st          j        d!|fd;|t          f          d7t          j                    v st          j        |          rt          j        |          nd7t          j        |          d(t          j                    v st          j        t                    rt          j        t                    nd(d<z  }d$d%|iz  }t          t          j	        |                    d x}}d S )>Nr6   ETHr8   102rC   r=   z101.5rT   z101.8rS   z1.15rE   z1.2rD   z0.49rO   64rF   rU   rH   rG   rJ   98rL   rK   rg   r   rj   rk   continuation_closes_confirmedTr   r   r   r   r   r   )zW%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._strategy_version
}(%(py3)s)
} == %(py7)sr"  r   r   )r   r   r   r   r   zassert %(py9)spy9)r   )zt%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s._strategy_entry_blockers
}(%(py3)s, %(py4)s, tv=%(py6)s)
} == %(py11)sr   )r   r   r   r   r   r   py11zassert %(py13)spy13m)r   client_order_id)is not)z%(py0)s is not %(py3)sintentr  r  r   )z3%(py2)s
{%(py2)s = %(py0)s.strategy_id
} == %(py4)s)r   r   r   rl   )ro   r   r"  	SUPPORTEDr   r   r   r   r   r   _strategy_versionr   r   r   r   _strategy_entry_blockers_strategy_intentr  )r   r   r   r   r   r   r   r   r   r   @py_format10r   r   @py_assert10r*  @py_format12@py_format14r~  r(  r   s                       r2   Dtest_runtime_routes_v77_2_momentum_as_separate_long_research_versionr     s      U")%...<CENNNU\]dUeUeUeG$$$3:6???PWX]P^P^P^ V___ /6dmmm JQQV DMMM	 07t}}}	 KRRV---	
 a
 /6dmmm
 \`[_G 12<f<2f<<<<<<<<<<2f<<<<<2<<<<f<<<<<<<<<<<<<<<<<<<<<<<<<<<$N$$%9::N:>NNNNNNNNNNN:>NNNNNNNNNNNNN7NNNNN7NNNNNN$NNNNNNNNNNN%9NNNNN%9NNNNNN:NNNNNNNNNNN>NNNNNN>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+YdY++,@'dSSSYWYYSWYYYYYYYYYYYSWYYYYYYYYYYYYY7YYYYY7YYYYYY+YYYYYYYYYYY,@YYYYY,@YYYYYYYYYYYYY'YYYYY'YYYYYYdYYYYSYYYYWYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY%&:G&befffF66665!55555555555!5555555555555655555655555555555555555!555555!555555555555555555555555555555r4   c                   | dz  }|                     t          j        dddddgddid	iii          d
           t          j        }d}d} ||||t
                    }g }||k    }|sst          j        d|fd||f          dt          j	                    v st          j
        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          dt          j	                    v st          j
        |          rt          j        |          nddt          j	                    v st          j
        t
                    rt          j        t
                    ndt          j        |          t          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}x}x}x}}|                     t          j        dddddgddid	iii          d
           t          j        }d}d} ||||t
                    }dg}||k    }|sst          j        d|fd||f          dt          j	                    v st          j
        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          dt          j	                    v st          j
        |          rt          j        |          nddt          j	                    v st          j
        t
                    rt          j        t
                    ndt          j        |          t          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}x}x}x}}d S )Nzconfluence.json
confluencescoresrs  block_new_entryconfluence_below_thresholdreliabilityz0.95)recommendationblockers
componentszutf-8)encodingr   )r  r   )z%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s._confluence_blockers
}(%(py4)s, %(py6)s, %(py7)s, strategy_id=%(py8)s)
} == %(py13)sr"  reportr   )r   r   r   r   r   r   r   rz  zassert %(py15)spy15event_risk_redconfluence_event_risk_red)
write_textr  dumpsr"  _confluence_blockersr   r   r   r   r   r   r   r   r   )
r&  r  r   r   r   r*  @py_assert12@py_assert11r  @py_format16s
             r2   Ltest_momentum_uses_universal_confluence_risk_not_generic_long_recommendationr     s   ))F
dj,E+12$f-D D < 1 "	 
 
 	    
 'ffvf''vvK_```fdff`dfffffffffff`dfffffffffffff7fffff7ffffff'ffffffffvfffffffffffvfffffvfffffffffffffK_fffffK_ffffff`ffffdffffffffffffffffffffffffffffffffff
dj,E+%&$f-D D < 1 "	 
 
 	    
 '  B  Bv  B''vvK_```  B  fA  eB  B`  eB  B  B  B  B  B  B  B  B  B  B`  eB  B  B  B  B  B  B  B  B  B  B  B  B7  B  B  B  B  B7  B  B  B  B  B  B'  B  B  B  B  B  B  B  Bv  B  B  B  B  B  B  B  B  B  B  Bv  B  B  B  B  Bv  B  B  B  B  B  B  B  B  B  B  B  B  BK_  B  B  B  B  BK_  B  B  B  B  B  B`  B  B  B  B  eB  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  Br4   )
r   r   r   r   r   r   r   r   r   r   )r   r	   ).
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r  dataclassesr   decimalr   pathlibr   r7  src.hyperliquid.market_datar    src.market.trend_retest_featuresr	   r
    src.research.tradingview_contextr   r   )src.strategies.trend_retest_anti_chase_v2r   r   r   /src.strategies.relative_strength_momentum_v77_2r   r   	src.toolsr   r"  r3   ro   r   r   r   r   r,  r>  rm  rq  r  r  rl   r4   r2   <module>r     s   " " " " " "                                  5 5 5 5 5 5 ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] i i i i i i i i i i b b b b b b b b 9 9 9 9 9 9 gk      ($$ $$ $$ $$N0 0 0= = =
P 
P 
P2 2 2: : :(B B BU U UDB B B6 6 6 B B B B Br4   