
    Zjs                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlZddlmZmZ ddlmZ ej"                  j%                  d e ee      j+                         j,                  j,                               ddlmZ ddlmZ ddlmZ dd	lmZm Z m!Z!m"Z"  G d
 d      Z#ddl$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d Z2 G d d      Z3 G d d      Z4 G d d      Z5dHdZ6dIdZ7dJdZ8dKdLdZ9dMdNdZ:dde-jv                  jx                  e.jv                  jx                  ddddd d!d"f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dOd#Z=	 	 	 dP	 	 	 	 	 	 	 dQd$Z>dRd%Z?d& Z@d' ZAd( ZBd) ZCd* ZDd+ ZEd, ZFd- ZGd. ZHd/ ZId0 ZJd1 ZKd2 ZLd3 ZMd4 ZNd5 ZOd6 ZPd7 ZQd8 ZRd9 ZSd: ZTd; ZUd< ZVd= ZWd> ZXd? ZYd@ ZZdA Z[dB Z\dC Z]dD Z^dSdEZ_dSdFZ`eadGk(  r ej                   e`              yy)Tz
Smoke tests for brain/brain_mr.py.

Mirrors the brain_tf test structure: FakeAIClient + FakeLoggerBundle
to avoid network calls and assert structured rejection events.

Run:
    cd ~/apex_v16
    python -m tests.test_brain_mr
    )annotationsN)datetimetimezone)Path)TechSnapshot)
AIResponse)brain_mr)BrainMRMR_ASSET_PROFILESGENERIC_PROFILEGRACE_INDICES_EXTRA_MINc                  $    e Zd ZdZddZd Zd Zy)_SessionPatchzKContext manager to pin _classify_session for deterministic time-stop tests.c                     || _         d | _        y N)session_orig)selfr   s     */home/work/apex_v16/tests/test_brain_mr.py__init__z_SessionPatch.__init__$   s    
    c                N     t         j                   _         fdt         _         S )Nc                    j                   S r   )r   )_hr   s    r   <lambda>z)_SessionPatch.__enter__.<locals>.<lambda>*   s    t|| r   )bmr_mod_classify_sessionr   r   s   `r   	__enter__z_SessionPatch.__enter__(   s    ..
$;!r   c                .    | j                   t        _        y r   )r   r   r   )r   excs     r   __exit__z_SessionPatch.__exit__-   s    $(JJ!r   N)r   strreturnNone)__name__
__module____qualname____doc__r   r   r"    r   r   r   r   "   s    U
/r   r   )RuntimeConfigRunModeAccountKind)	BrainContextBrainDecision	DirectionEntryDecisionMarketStructureRegimeTradeAction
TradeEntryTradeRuntimec           
        K   d|vr@ddl m}  ||j                  |j                  t	        |dd      t	        |dd      d	      |d<    | j
                  ||g|i | d {   }|j                  S 7 w)
N	bias_datar   )BiasDatah1_compatibility      ?	h1_reasontestF)biasallowed_directionr:   r<   	ambiguous)analysis.biasr9   r>   r?   getattrevaluate_entrydecision)brainsymbolsnapargskwargsr9   results          r   _evalrK   B   s      & *&"44$T+=sCdK8
{ (5''FtFvFFF?? Gs   AA4!A2"A4c                  ,    e Zd ZdddZ	 d	 	 	 	 	 ddZy)FakeAIClientNc                >    |xs t        d d      | _        g | _        y )Nunknown)text
error_kind)r   cannedcalls)r   rR   s     r   r   zFakeAIClient.__init__X   s    K
 K-/
r   c                j   K   | j                   j                  d|d d ||df       | j                  S w)Nask_for_decisionP   )prompt_preview
max_tokenswhere)rS   appendrR   )r   promptrX   rY   s       r   rU   zFakeAIClient.ask_for_decision\   sB      	

-$Sbk$0
  	
 {{s   13r   )rR   zAIResponse | Noner$   r%   )iX  N)r[   r#   rX   intr$   r   )r&   r'   r(   r   rU   r*   r   r   rM   rM   W   s)    0
 9='*	r   rM   c                      e Zd ZddZddZy)FakeJsonlLoggerc                    g | _         y r   )eventsr   s    r   r   zFakeJsonlLogger.__init__h   s	    "$r   c                B    | j                   j                  d|i|       y )Nevent)r`   rZ   )r   rb   fieldss      r   writezFakeJsonlLogger.writek   s    GU5f56r   Nr$   r%   )rb   r#   r$   r%   )r&   r'   r(   r   rd   r*   r   r   r^   r^   g   s    %7r   r^   c                      e Zd ZddZy)FakeLoggerBundlec                V    t               | _        t        j                  d      | _        y )Nztest.brain_mr.fake)r^   	brain_loglogging	getLoggersystemr   s    r   r   zFakeLoggerBundle.__init__p   s    (*''(<=r   Nre   )r&   r'   r(   r   r*   r   r   rg   rg   o   s    >r   rg   c                B    t        t        j                  |       d      S )N   )rP   attempts)r   jsondumps)payloads    r   make_ai_responsers   u   s    4::g.;;r   c                d
   t        d>i d| d   dt        | j                  dd            dt        | j                  d| j                  dd                  dt        | j                  dd      xs d      dt	        | j                  dd            d	t        | j                  d	d
            dt        | j                  dd            dt        | j                  d| j                  dd                  dt        | j                  dd            dt        | j                  dd            dt        | j                  dd            dt        | j                  dd            d| j                  dd      dt	        | j                  dd            d| j                  dd      dt	        | j                  dd            dt	        | j                  dd            dt        | j                  dd            d| j                  dd      d| j                  dd      dt        | j                  dg             d t        | j                  d d            d!| j                  d!d"      d#t	        | j                  d#d            d$t        | j                  d$d            d%t        | j                  d%d            d&t	        | j                  d&d            d't	        | j                  d'd            d(t	        | j                  d(d            d)t	        | j                  d)d            d*t	        | j                  d*d            d+| j                  d+      d,t	        | j                  d,d            d-t	        | j                  d-d            d.t	        | j                  d.d            d/t	        | j                  d/d            d0t	        | j                  d0d            d1t	        | j                  d1d            d2t	        | j                  d2d            d3t        | j                  d3| j                  dd                  d4t        | j                  d4d            d5| j                  d5d6      d7| j                  d7d"      d8t        | j                  d8d            d9| j                  d9d      d:t        | j                  d:i             d;t        | j                  d;d            d<t        | j                  d<d            d=t        | j                  d=d            S )?zEBuild a TechSnapshot from a legacy test-dict (mirrors test_brain_tf).rF   price        opencandle_timer   is_candle_closedTcandle_age_seconds      $@rsi      I@rsi_prevrsi_h1rsi_h4atr_m5_points	atr_ratior;   
vol_regimeNORMAL	vol_spikeFmarket_structureRANGINGh1_struct_bullh1_struct_beartrend_maturityregimeregime_reason regime_near_trendingdeviation_pct
divergenceNONEmacd_deceleratingmacd_hist_lastcandle_strengthhammershooting_starbull_engulfingbear_engulfingdoji	doji_typepiercing
dark_cloudmorning_starevening_starvolume_weakbuy_absorptionsell_absorptionvwapvwap_deviation_pctr>   NEUTROr?   r:   r<   
swing_dataconsecutive_sl_count	tick_size
tick_valuer*   )r   floatgetr\   boollistdict)ds    r   _to_snapr   y   s&    2{2AEE'3'(2 155w!4562 mQ/415	2
 aee$6=>2 !';T!BC2 !%%t$%2 quuZud);<=2 QUU8T*+2 QUU8T*+2 AEE/3782 k3/02 55x02 quu[%012 19=2  AEE"2E:;!2" AEE"2E:;#2$ 155!1156%2& uuXy)'2( eeOR0)2* "!%%(>"CD+2, AEE/378-2. 55v./20 quu%8%@A122 QUU#3S9:324 aee$5s;<526 AEE(E*+728 155%8992: AEE"2E:;;2< AEE"2E:;=2> !%%&'?2@ %%$A2B aeeJ./C2D lE23E2F !%%67G2H !%%67I2J }e45K2L AEE"2E:;M2N QUU#4e<=O2P 155w!456Q2R !';S!ABS2T UU68$U2V %% 3V<W2X quu%7=>Y2Z %%R([2\ lB/0]2^ !'=q!AB_2` k3/0a2b |S12c2 2r   c                 T    t        t        j                  t        j                        S )N)modeaccount)r+   r,   PAPERr-   
INELIGIBLEr*   r   r   make_configr      s    gmm[5K5KLLr   6Ec                    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t         j                  j                  dt        j                  j                  ddddddd d!d"d#d$d%id&d'd(d)d'd*
S )+zSTech with valid MR BUY conditions: RSI oversold, ATR ok, FX (no index restriction).rF   ru   \(\?rw   g>٬\?r|         <@r~         >@r         C@r        F@r   ?r   gMbp?r   r;   r   g|?5^?r   皙r   r   r   r   r      rx      Ar   BOTH皙?rangingswing_foundFBULLISHTܿr   )
r>   r?   r:   r<   r   r   r   r   r   r   )r2   r   valuer3   )rF   s    r   make_tech_buy_extremer      s   FF 	F 	D	
 	D 	D 	D 	D 	F 	C 	F 	e 	O3399 	FNN00 	H  	A!" 	L#$ %#%*E2%!! ! 9 r   c           
     z   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$idd%d&d'd%d(}|r<t         j                  j                  |d)<   t        j                  j                  |d*<   |S t         j
                  j                  |d)<   t        j                  j                  |d*<   |S )+z?MNQ BUY oversold; protrend=True -> BULLISH structure (allowed).rF   ru        @rw   g    @r|   r   r~   r   r   r   r   g      H@r   r   r   r}   r   r;   r   g    @@r   r   r   r   r      rx   r   r>   r   r?   r   trendingr   FTr   r   )r:   r<   r   r   r   r   r   r   r   r   )r2   BULLISH_EXPANSIONr   r3   TRENDINGBEARISH_EXPANSION)rF   protrendbases      r   make_tech_buy_indexr      s\   FG 	G 	D	
 	D 	D 	D 	D 	D 	C 	G 	e 	H 	A 	L  	I!" 	V#$  &*E2%!! ! 3D6 #2#D#D#J#J ..X K $3#D#D#J#J ..XKr   BUYr   r   r   F   r   gS?g rh?c                    t        di d|ddd| ddd|d|	d	|
d
t        dddddt        j                        d|ddd|ddd|d|d|d|S )NrF   
brain_nameMR	direction	contractsrn   entry_pricesl_pricetp_price	opened_ati  r         r   )tzinforsi_m5_at_entryrsi_h1_at_entryr   rsi_h4_at_entryatr_ratio_at_entryr   market_structure_at_entryregime_at_entryh1_compat_at_entryconfidence_at_entryr*   )r5   r   r   utc)r   rF   	structurer   rsi_m5r   	h1_compat
confidencer   r   r   s              r   
make_entryr      s        	
     4BAhllC      #,  %  '! r   c                    t        | xs
 t               |xs t        ddd      t        ||            S t	                           S )Nr{   g      @rv   minutes_opennet_profit_usdlast_exit_eval_timeentryruntimetech_now)r.   r   r6   r   r   )r   r   techs      r   make_ctxr     sV    
 #z| A<T#<?A$"2$P	  9N8OP	 r   c                     t        d|         y )Nz  ok  )print)labels    r   _okr   +  s    	F5'
r   c                   K   t               } t               }t               }t        | ||      }t	               }d|d<   t        |dt        |             d {   }d }||u }|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}}|j                  }t!        |      }
d}|
|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}}|j"                  j$                  D cg c]  }|d   dk(  s| }}|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   }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'        d       y 7 c c}w w)Nloggerr   r|   r   isz%(py0)s is %(py3)srJ   py0py3assert %(py5)spy5r   ==zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.calls
})
} == %(py8)slenair  py1r  r  py8assert %(py10)spy10rb   entry_rejectedruleRSI_NOT_EXTREMEz%(py1)s == %(py4)sr  py4assert %(py6)spy6sideoversoldz0pre-val: RSI not oversold for BUY -> None, no AIr   rM   rg   r
   r   rK   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationrS   r  ri   r`   r   cfgr  logrE   r   rJ   @py_assert2@py_assert1@py_format4@py_format6@py_assert4@py_assert7@py_assert6@py_format9@py_format11er`   @py_assert0@py_assert3@py_format5@py_format7s                        r    test_pre_val_rsi_not_extreme_buyr7  3  s5    
-C	B

CCC(E "DDKtXd^44F6T>6T66Txx3x=A=A=A33rrx=A--PA7?O1OaPFP!9V1 11 11111 1111111 11111111!9V*
*
****
******
*******:; 5 Q,   AM:M2G4M:M5M5DM:5M:c                 |  K   t               } t               }t        | |      }t               }d|d<   d|d<   t	        |dt        |             d {   }d }||u }|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}}|j                  }t        |      }	d}
|	|
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!        d       y 7 w)Ng      N@r|   SELLr?   r   r  r  rJ   r  r  r  r   r	  r  r  r  r  r  r  z3pre-val: RSI not overbought for SELL -> None, no AI)r   rM   r
   r   rK   r   r  r  r   r!  r"  r#  r$  r%  rS   r  r   )r'  r  rE   r   rJ   r)  r*  r+  r,  r-  r.  r/  r0  r1  s                 r   !test_pre_val_rsi_not_extreme_sellr;  D  sW    
-C	BCE "DDK &D	tXd^44F6T>6T66Txx3x=A=A=A33rrx=A=> 5s   AH<H9G)H<c                   K   t               } t               }t               }t        | ||      }t	        d      }t        |dt        |             d{   }d}||u }|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}}|j                  }t!        |      }
d}|
|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}}|j"                  j$                  D cg c]  }|d   dk(  s| }}|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   }t&        j(                  }
|
j*                  }||k(  }|st        j                  d|fd||f      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}
}t-        d"       y7 c c}w w)#z4MNQ BUY oversold but H1 structure BEARISH -> reject.r   Fr   MNQNr  r  rJ   r  r  r  r   r	  r  r  r  r  r  r  rb   r  r  INDICES_NOT_PRO_TRENDr  r  r  r  r   )zT%(py1)s == %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.BEARISH_EXPANSION
}.value
}r2   )r  r  r  py7zassert %(py9)spy9zDpre-val: index BUY in BEARISH struct -> reject INDICES_NOT_PRO_TREND)r   rM   rg   r
   r   rK   r   r  r  r   r!  r"  r#  r$  r%  rS   r  ri   r`   r2   r   r   r   )r'  r  r(  rE   r   rJ   r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r`   r3  r4  r5  r6  @py_format8@py_format10s                          r   "test_pre_val_indices_not_pro_trendrD  Q  so    
-C	B

CCC(E.Duhtn55F6T>6T66Txx3x=A=A=A33rrx=A--PA7?O1OaPFP!9V7 77 77777 7777777 77777777!9'(SO,M,MS,M,S,SS(,SSSSS(,SSSS(SSSSSSOSSSOSSS,MSSS,SSSSSSSSNO 6 Qs,   AO0O(G4O0	O+O+FO0+O0c                   K   t               } t               }t               }t        | ||      }t	        dd      }t
        j                  j                  |d<   t        |dt        |             d{   }d}||u }|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}}|j$                  j&                  D 
cg c]  }
|
d   dk(  s|
 }}
|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}}t)        d       y7 ec c}
w w)z.MES BUY oversold but RANGING regime -> reject.r   MESTr=  r   Nr  r  rJ   r  r  r  rb   r  r   r  INDICES_RANGINGr	  r  r  r  r  z:pre-val: index in RANGING regime -> reject INDICES_RANGING)r   rM   rg   r
   r   r3   r   r   rK   r   r  r  r   r!  r"  r#  r$  r%  ri   r`   r   r'  r  r(  rE   r   rJ   r)  r*  r+  r,  r2  r`   r3  r4  r5  r6  s                   r   test_pre_val_indices_rangingrI  a  sJ    
-C	B

CCC(Eut4D^^))DNuhtn55F6T>6T66T--PA7?O1OaPFP!9V1 11 11111 1111111 11111111DE	 6Ps,   A0G2G3CG4GGBGGc                   K   t               } t               }t               }t        | ||      }t	               }d|d<   t        |dt        |             d {   }d }||u }|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}}|j                  }t!        |      }
d}|
|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}}|j"                  j$                  D cg c]  }|d   dk(  s| }}|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   }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'        d       y 7 c c}w w)Nr          @r   r   r  r  rJ   r  r  r  r   r	  r  r  r  r  r  r  rb   r  r  ATR_TOO_HIGHr  r  r  r  z+pre-val: ATR ratio > 1.8 cap -> None, no AIr  r&  s                        r   test_pre_val_atr_too_highrM  p  s2    
-C	B

CCC(E "DDtXd^44F6T>6T66Txx3x=A=A=A33rrx=A--PA7?O1OaPFP!9V...................!9[!(S(!S((((!S(((!(((S(((((((56 5 Qr8  c                 <  K   t               } t               }t               }t        | ||      }t	               }d|d<   d|d<   t        |dt        |             d{   }d}||u }|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}}|j                  }t!        |      }
d}|
|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  }t        j"                  d      dz   d|iz  }t        t        j                  |            dx}x}
x}}|j$                  j&                  D cg c]  }|d   dk(  s| }}|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   }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}x}}t)        d$       y7 c c}w w)%z=BUY + macd_decel=False + hist<0 -> MACD_ACCELERATING_AGAINST.r   Fr   gJ4ar   r   Nr  r  rJ   r  r  r  r   r	  r  r  r  r  z'AI must NOT be called when gate rejects
>assert %(py10)sr  rb   r  r  MACD_ACCELERATING_AGAINSTr  r  r  r  z%(py1)s is %(py4)sgJ4a?)z%(py1)s == -%(py4)sassert %(py7)sr@  zEpre-val: BUY + MACD bearish accelerating -> MACD_ACCELERATING_AGAINST)r   rM   rg   r
   r   rK   r   r  r  r   r!  r"  r#  r$  r%  rS   r  _format_assertmsgri   r`   r   )r'  r  r(  rE   r   rJ   r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r`   r3  r4  r5  r6  @py_assert5rB  s                          r   *test_pre_val_macd_accelerating_against_buyrU    s    
-C	B

CCC(E "D %D	$D	htn55F6T>6T66TxxH3x=HAH=AHHH=AHHHHHH3HHH3HHHHHHrHHHrHHHxHHH=HHHAHHHHHHHHHHH--PA7?O1OaPFP!9V; ;; ;;;;; ;;;;;;; ;;;;;;;;!9()2U2)U2222)U222)222U2222222!9%&1616'1&'1111&'111&11161111111OP 6 Qs,   APPH
P'P5P9FPPc                 H  K   t               } t               }t               }t        | ||      }t	               }d|d<   d|d<   d|d<   d|d	<   d
|d<   d|d<   d|d<   d
|d<   d|d<   t        |dt        |             d{   }d}||u }|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}}|j                  }t!        |      }
d}|
|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}}|j"                  j$                  D cg c]  }|d#   d$k(  s| }}|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   }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'        d+       y7 c c}w w),z>SELL + macd_decel=False + hist>0 -> MACD_ACCELERATING_AGAINST.r   g      R@r|        Q@r~   BEARISHr   Tr   Fr   r   r?   g?r   r   g_Qk?r   r   Nr  r  rJ   r  r  r  r   r	  r  r  r  r  r  r  rb   r  r  rP  r  r  r  r  zFpre-val: SELL + MACD bullish accelerating -> MACD_ACCELERATING_AGAINSTr  r&  s                        r   +test_pre_val_macd_accelerating_against_sellrY    s    
-C	B

CCC(E "DDKD"D DDN &D	 D %D	#D	htn55F6T>6T66Txx3x=A=A=A33rrx=A--PA7?O1OaPFP!9V; ;; ;;;;; ;;;;;;; ;;;;;;;;!9%&0&0&&0000&&000&000&0000000PQ 6 Qs,   A=N"?N G4N"4NNDN"N"c                 t  K   t               } t               }t               }t        | ||      }t	               }d|d<   d|d<   t        |dt        |             d{    |j                  j                  D cg c]   }|d   d	k(  r|j                  d
      dk(  r|" }}| }|s~t        j                  d|       dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t!        t        j"                  |            d}t%        d       y7 c c}w w)zHBUY + macd_decel=False + hist>0 -> gate passes (MACD accelera a favore).r   Fr   gH}]?r   r   Nrb   r  r  rP  z-gate should pass when MACD favors direction: 
>assert not %(py0)sr  rejectedz7pre-val: BUY + MACD bullish accelerating -> gate passesr   rM   rg   r
   r   rK   r   ri   r`   r   r  rS  r   r!  r"  r#  r$  r%  r   	r'  r  r(  rE   r   r2  r\  r*  @py_format2s	            r   .test_pre_val_macd_accelerating_in_favor_passesr`    s    
-C	B

CCC(E "D %D	#D	
tXd^
,,, ==''W:))EE&M88 	
H 
 <S<SSH
SSSSSSSxSSSxSSSSSSAB -s%   AD8D1D89%D3BD83D8c                 n  K   t               } t               }t               }t        | ||      }t	               }d|d<   d|d<   t        |dt        |             d{    |j                  j                  D cg c]   }|d   d	k(  r|j                  d
      dk(  r|" }}| }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t!        t        j"                  |            d}t%        d       y7 c c}w w)z=BUY + macd_decel=True -> gate passes regardless of hist sign.r   Tr   g{Gzdr   r   Nrb   r  r  rP  z/decelerating momentum must not trigger the gater[  r  r\  z2pre-val: macd_decel=True -> gate passes (any sign)r]  r^  s	            r   1test_pre_val_macd_decelerating_passes_either_signrb    s     
-C	B

CCC(E "D $D	$D	
tXd^
,,,==''W:))EE&M88 	
H 
 <J<JJJJJJJJJxJJJxJJJJJJ<= -s%   AD5D.D59%D0BD50D5c                   K   t               } t        t        ddddddddd      	      }t               }t	        | ||
      }t        |dt        t                            d{   }d}||u }|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}}|j                   j"                  D 	cg c]  }	|	d   dk(  s|	 }
}	|
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}}t%        d       y7 ec c}	w w)z<Pattern confirmed -> floor 60. AI returns conf=55 -> reject.T7   r   r;         @      ?okapprovedr   r   risk_multipliersl_atr_multiplierrr_multiplierkey_riskreasonrR   r   r   Nr  r  rJ   r  r  r  rb   r  r   r  POST_VAL_CONFr	  r  r  r  r  z3post-val: conf 55 < 60 floor with pattern -> reject)r   rM   rs   rg   r
   rK   r   r   r  r  r   r!  r"  r#  r$  r%  ri   r`   r   )r'  r  r(  rE   rJ   r)  r*  r+  r,  r2  r`   r3  r4  r5  r6  s                  r   %test_post_val_conf_below_with_patternrq    sW    
-C	- 	/ 	 	
B 
CCC(EtX.C.E%FGGF6T>6T66T--PA7?O1OaPFP!9V///////////////////=>	 HPs,   A"G$G	%CG&G4G8BGGc                   K   t               } t        t        ddddddddd      	      }t               }t	        | ||
      }t               }d|d<   t        |dt        |             d{   }d}||u }|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}}|j                   j"                  D 
cg c]  }
|
d   dk(  s|
 }}
|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   }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}}t%        d"       y7 jc c}
w w)#z>No reversal pattern -> floor 75. AI returns conf=70 -> reject.Tr   r   r;   re  rf  rg  rh  ro  r   Fr   r   Nr  r  rJ   r  r  r  rb   r  r   r  POST_VAL_CONF_NO_PATTERNr	  r  r  r  r  pattern_confirmedrQ  ai_confidencez6post-val: conf 70 < 75 floor without pattern -> reject)r   rM   rs   rg   r
   r   rK   r   r  r  r   r!  r"  r#  r$  r%  ri   r`   r   rH  s                   r   (test_post_val_conf_below_without_patternrv    s    
-C	- 	/ 	 	
B 
CCC(E "DDNtXd^44F6T>6T66T--PA7?O1OaPFP!9V: :: ::::: ::::::: ::::::::!9()2U2)U2222)U222)222U2222222!9_%++%++++%+++%++++++++++@A 5Ps,   A)K+K,CK-K;K?FKKc                 2  K   t               } t        t        ddddddddd      	      }t        | |      }t	               }d
|d<   t        |dt        |             d {   }d }||u }|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}}t        d       y 7 w)NT_   r   r;   g      @gq=
ףp?rg  rh  ro       A@r   r   r  r  rJ   r  r  r  z+post-val: C95% + H4 RSI 35 vs BUY -> reject)r   rM   rs   r
   r   rK   r   r  r  r   r!  r"  r#  r$  r%  r   )	r'  r  rE   r   rJ   r)  r*  r+  r,  s	            r   test_post_val_c95_h4_weakrz    s     
-C	- D/  
B CE "DDNtXd^44F6T>6T66T56 5s   ADD B6Dc                   K   t               } t        t        ddddddddd      	      }t               }t	        | ||
      }t        |dt        t                            d{   }d}||u }|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}}|j                   j"                  D 	cg c]  }	|	d   dk(  s|	 }
}	t%        |
      }d}||k(  }|st        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                  |      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}}t'        d$       y7 uc c}	w w)%u   
    TP variante γ parity with brain_tf: AI emits rr_multiplier outside
    advisory prompt-range [0.17, 0.67] -> POST_VAL_RR_RANGE rejection.
    TK   r   r;   re  g?rg  rh  ro  r   r   Nr  r  rJ   r  r  r  rb   r  rn   r	  z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr  r`   r  r  r  r  assert %(py8)sr  r   r  POST_VAL_RR_RANGEr  r  r  r  zIpost-val MR: rr_multiplier 0.05 outside [0.17, 0.67] -> POST_VAL_RR_RANGEr   rM   rs   rg   r
   rK   r   r   r  r  r   r!  r"  r#  r$  r%  ri   r`   r  r   r'  r  r(  rE   rJ   r)  r*  r+  r,  r2  r`   rT  r-  r6  r0  r3  r4  r5  s                     r   test_post_val_rr_out_of_ranger  $  s    
 -C	- D/  
B 
CCC(Eh/D/F&GHHF6T>6T66T--PA7?O1OaPFPv;!;!;!33vv;!!9V3 33 33333 3333333 33333333ST IP,   A"K!$K%CK!&K4K8F"K!K!c                   K   t               } t        t        ddddddddd      	      }t               }t	        | ||
      }t        |dt        t                            d{   }d}||u }|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}}|j                   j"                  D 	cg c]  }	|	d   dk(  s|	 }
}	t%        |
      }d}||k(  }|st        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                  |      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}}t'        d$       y7 uc c}	w w)%zy
    BUG 9 fix (parity with brain_tf): AI returns sl_atr_multiplier
    above profile.sl_range -> POST_VAL_SL_RANGE.
    Tr|  r   r;          @rf  rg  rh  ro  r   r   Nr  r  rJ   r  r  r  rb   r  rn   r	  r}  r  r`   r~  r  r  r   r  POST_VAL_SL_RANGEr  r  r  r  zGpost-val MR: sl_atr 8.0 > profile sl_range max 5.0 -> POST_VAL_SL_RANGEr  r  s                     r   %test_post_val_sl_out_of_profile_ranger  =  s    
 -C	- D/  
B 
CCC(Eh/D/F&GHHF6T>6T66T--PA7?O1OaPFPv;!;!;!33vv;!!9V3 33 33333 3333333 33333333QR IPr  c                 F  K   t               } t               }t               }t        | ||      }t	               }d|d<   t        |dt        |             d {    |j                  j                  D cg c]  }|d   dk(  s| }}|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}	||	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}	||	k(  }
|
slt        j                  d
|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	t        d       y 7 c c}w w)Nr   g      D@r|   r   rb   r  r   r  r  r	  r  r  r  r  r   rsi_thresholdg      @@r  r  rE   r   z)logging: RSI_NOT_EXTREME with full fields)r   rM   rg   r
   r   rK   r   ri   r`   r  r  r#  r$  r%  r   )r'  r  r(  rE   r   r2  r`   evr3  r4  r)  r5  r6  s                r   &test_rejection_logging_rsi_not_extremer  Z  s"    
-C	B

CCC(E "DDK
dHTN
+++--PA7?O1OaPFP	Bf:***:*****:****:***********h<4<4<4<4o&$&$&&&&$&&&&&&$&&&&&&&f:##:####:###:##########g;$;$;$;$34 ,Ps+   AL!LL!4LLJL!L!c                   K   t               } t        t        ddddddddd	d
dd	            }t               }t	        | ||      }t        |dt        t                            d{    |j                  j                  D cg c]  }|d   dk(  s| }}t        d |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   }||v }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}t!        d       y7 Nc c}w w)zuAI returns approved=false + rejection_details -> entry_rejected
    event carries ai_rule_failed/ai_rejection_detail.F<   r   rf        @333333?weakzno extreme + no patternNO_PATTERN_LOW_CONFz0RSI 28 borderline, no reversal candle confluence)rule_faileddetail)	ri  r   r   rj  rk  rl  rm  rn  rejection_detailsro  r   r   Nrb   r  c              3  2   K   | ]  }|d    dk(  s|  ywr  AI_REJECTEDNr*   .0r2  s     r   	<genexpr>z8test_ai_rejection_with_details_logged.<locals>.<genexpr>       >A1V9#=a>   ai_rule_failedr	  r  r  r  r  
borderlineai_rejection_detailin)z%(py1)s in %(py4)szDlogging: MR AI_REJECTED carries ai_rule_failed + ai_rejection_detailr   rM   rs   rg   r
   rK   r   r   ri   r`   nextr  r  r#  r$  r%  r   r'  r  
log_bundlerE   r2  r`   r  r3  r4  r)  r5  r6  s               r   %test_ai_rejection_with_details_loggedr  l  ss     -C	- +0H
/  
B "#JCJ/E
tX&;&=>
???#--44WA'
FV8VaWFW	>>	>B8#88#88888#8888888#8888888842344<44444<4444<44444444444NO @Ws+   A&F>(F6)F>F9F9D F>9F>c                 x  K   t               } t        t        ddddddddd	      
      }t               }t	        | ||      }t        |dt        t                            d {    |j                  j                  D cg c]  }|d   dk(  s| }}t        d |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}	}t!        d       y 7 c c}w w)NFr  r   rf  r  r  zn/anorh  ro  r   r   rb   r  c              3  2   K   | ]  }|d    dk(  s|  ywr  r*   r  s     r   r  z9test_ai_rejection_missing_details_safe.<locals>.<genexpr>  r  r  r  UNSPECIFIEDr	  r  r  r  r  zAlogging: MR AI rejection without rejection_details -> UNSPECIFIEDr  r  s               r   &test_ai_rejection_missing_details_safer    s    
-C	- 
/ 
 

B "#JCJ/E
tX&;&=>
???#--44WA'
FV8VaWFW	>>	>B0=0=0000=000000=0000000KL	 @Ws+   A"D:$D3%D:D5D5B!D:5D:c                   K   t               } t        t        ddddddddd	      
      }t        | |      }t	               }d|d<   t        |dt        |             d{   }t        |t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}|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$                  }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*                  }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,                  }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.                  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}}|j.                  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}}|j.                  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}}|j.                  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}}t1        d.       y7 w)/u   
    Valid MR setup with reversal pattern -> EntryDecision with SL prices.
    TP variante γ: tp_price=0.0 sentinel + rr_multiplier; orchestrator
    finalizes tp_price post-sizing.
    TA   r   r;   r  rf  zh4 weakzdeep oversold + hammerrh  ro  {Gzt?r   r   N5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancerJ   r1   r  r  py2r  r	  )z1%(py2)s
{%(py2)s = %(py0)s.direction
} == %(py5)sr  r  r  rR  r@  )z2%(py2)s
{%(py2)s = %(py0)s.confidence
} == %(py5)s<)zP%(py2)s
{%(py2)s = %(py0)s.sl_price
} < %(py6)s
{%(py6)s = %(py4)s.entry_price
})r  r  r  r  r  r  rv   )z0%(py2)s
{%(py2)s = %(py0)s.tp_price
} == %(py5)s)z5%(py2)s
{%(py2)s = %(py0)s.rr_multiplier
} == %(py5)srE   r   r  r  r  r  rr_multiplier_airt  r  rQ  profile_originEURUSDzQhappy: MR setup with pattern + conf 65 -> EntryDecision (TP resolved post-sizing))r   rM   rs   r
   r   rK   r   r  r1   r   r!  r  r"  r#  r$  r%  r   r  r   r   r   r   rl  metadatar   )r'  r  rE   r   rJ   r4  r5  r*  r-  r,  rB  rT  r6  r0  r3  r)  s                   r   test_entry_happy_with_patternr    s     -C	- *	/ 	 	
B CE "D"DtXd^44Ffm,,,,,,,,:,,,:,,,,,,f,,,f,,,,,,m,,,m,,,,,,,,,,$u$u$$$$u$$$$$$6$$$6$$$$$$u$$$$$$$""""""""""""6"""6"""""""""""""??/V///?/////?///////6///6///?//////V///V///////////??!c!?c!!!!?c!!!!!!6!!!6!!!?!!!c!!!!!!!'4'4''''4''''''6'''6''''''4'''''''??7#+t+#t++++#t+++#+++t+++++++??-.6$6.$6666.$666.666$6666666??./747/47777/4777/77747777777??+,88,8888,888,8888888888[\ 5s   A_-_* ^_-c                 F  K   t               } t        t        ddddddddd	      
      }t        | |      }t	               }d|d<   d|d<   t        |dt        |             d {   }t        |t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d }|j                   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%        d       y 7 w)NTrV   r   r;   r  rf  z
no patternzdeep oversold no patternrh  ro  Fr   r  r   r   r  r  rJ   r1   r  rt  r  rQ  r  r  r  z,happy: no pattern + conf 80 -> EntryDecision)r   rM   rs   r
   r   rK   r   r  r1   r   r!  r  r"  r#  r$  r%  r  r  r   )
r'  r  rE   r   rJ   r4  r5  r3  r)  r6  s
             r   *test_entry_happy_without_pattern_high_confr    sg    
-C	-  ,	/ 	 	
B CE "DDN"DtXd^44Ffm,,,,,,,,:,,,:,,,,,,f,,,f,,,,,,m,,,m,,,,,,,,,,??./858/58888/5888/8885888888867 5s   A"H!$H%F:H!c                   K   t               } t        t        ddddt        d   d   dz   dddd	      
      }t	               }t        | ||      }d}|t        v}|st        j                  d|fd|t        f      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dz  }dd|iz  }t        t        j                  |            d}t               }||d<   d|d<   d|d<   d|d<   d|d<   |j                   }	||	v}|st        j                  d|fd||	f      dt        j                         v st        j                  |      rt        j                  |      nd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}}	t#        ||t%        |             d{   }|j                   }	||	v }|st        j                  d#|fd$||	f      dt        j                         v st        j                  |      rt        j                  |      nd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}}	t'        d%| d&       y7 w)'a  
    Symbol senza profile dedicato -> usa GENERIC_PROFILE + emette warning
    una sola volta. Dopo Fix A V16, tutti gli asset attivi hanno profile
    dedicato; usiamo un symbol fittizio (non in MR_ASSET_PROFILES) per
    esercitare il path GENERIC fallback.
    TrV   r   r;   sl_ranger   rf  rg  rh  ro  r   ZZZ_TEST_NO_PROFILE)not in)z%(py0)s not in %(py2)sfake_symbolr   )r  r  zassert %(py4)sr  NrF   g     R@ru   g33333R@rw   r  r   Fr   )zC%(py0)s not in %(py4)s
{%(py4)s = %(py2)s._warned_generic_profile
}rE   )r  r  r  r  r  r  )z?%(py0)s in %(py4)s
{%(py4)s = %(py2)s._warned_generic_profile
}zgeneric profile: z# (no profile) tracked + warned once)r   rM   rs   r   rg   r
   r   r  r  r   r!  r"  r#  r$  r%  r   _warned_generic_profilerK   r   r   )r'  r  r(  rE   r  r*  @py_format3r5  r   r4  r6  _s               r   test_generic_profile_warningr    s9     -C	-,Z8;cAD/  
B 
CCC(E'K/////;///////;///;////////////////// "D DNDMDL DDN#;;;;;;;;;;;;;;;;;;;;;;;;;;;;e;;;e;;;;;;;;;;;E;77A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
K=(KLM 	8s   IM$M!DM$c                   K   t               } t               }t        | |      }t        t	        ddd            }t        d      5  |j                  |       d{   }ddd       j                  }t        j                  }|j                  }||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}}d}|j&                  }||v }|st        j                  d|fd||f      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(                  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}}|j*                  }t-        |      }d}||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/        d        y7 # 1 sw Y   xY ww)!z5P&L < -50 + minutes >= deep_threshold -> EXIT, no AI.      i@g      Trv   r   r   LONDONNr	  zc%(py2)s
{%(py2)s = %(py0)s.action
} == %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.EXIT
}.value
}rD   r4   r  r  r  r  r  r  r  zTime Stop MRr  z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.reason
}r  r  r  rR  r@  triggertime_stop_deepr  r  r  r  r   r  r  r  r  z(exit: time stop deep loss -> EXIT, no AIr   rM   r
   r   r6   r   manage_exitactionr4   EXITr   r  r  r   r!  r"  r#  r$  r%  rn  r  rS   r  r   r'  r  rE   ctxrD   r*  rT  r.  r4  r0  r1  r3  r-  r)  r,  rB  r5  r6  r/  s                      r   test_exit_time_stop_deep_lossr    s    
-C	BCE
%146C 
x	  0**3//0??4k..4.444?44444?444444484448444?444444k444k444.44444444444,X__,>_,,,,>_,,,>,,,,,,X,,,X,,,_,,,,,,,Y';+;;'+;;;;;'+;;;;';;;+;;;;;;;;xx3x=A=A=A33rrx=A23 00 01   AQ
P=P:P= OQ
:P==QQ
c                   K   t               } t               }t        | |      }t        t	        ddd            }t        d      5  |j                  |       d {   }d d d        j                  }t        j                  }|j                  }||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}}d}|j&                  }||v }|st        j                  d|fd||f      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(                  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}}|j*                  }t-        |      }d}||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/        d       y 7 # 1 sw Y   xY ww) Nr        rv   r   r  r  r	  r  rD   r4   r  r  r  z	BE failedr  r  r  rR  r@  r  time_stop_be_failedr  r  r  r  r   r  r  r  r  z(exit: time stop BE failed -> EXIT, no AIr  r  s                      r   $test_exit_time_stop_breakeven_failedr    s    
-C	BCE
%146C 
x	  0**3//0??4k..4.444?44444?444444484448444?444444k444k444.44444444444)(//);/))));/)));))))))()))()))/)))))))Y'@+@@'+@@@@@'+@@@@'@@@+@@@@@@@@xx3x=A=A=A33rrx=A23 00 0r  c            	       K   t               } t        t        ddd            }t        | |      }t	        dt
        j                  j                  t        j                  j                  dddd	
      }t        dd      }d|d<   d|d<   d|d<   t        |t        ddd      t        |            }t        d      5  |j                  |       d{   }ddd       j                   }t"        j$                  }|j                  }	||	k7  }
|
s:t'        j(                  d|
fd||	f      dt+        j,                         v st'        j.                  |      rt'        j0                  |      ndt'        j0                  |      dt+        j,                         v st'        j.                  t"              rt'        j0                  t"              ndt'        j0                  |      t'        j0                  |	      dz  }t'        j2                  d|j4                   d|j6                         d z   d!|iz  }t9        t'        j:                  |            dx}x}
x}}	t=        d"       y7 # 1 sw Y   xY ww)#zMNQ in break-even, RSI toward mean, within grace -> NOT exit.

    Pinned to LONDON_NY (deep=65, breakeven=110, grace_limit=80).
    minutes_open=70: 70>=65 enters grace block, 70<80 grace ACTIVE, no exit.
    Falls through to AI which says HOLD.
    Fwaitexit_nowrn  ro  r>  r   r       @    @rF   r   r   r   r   r   r   Tr=       @@rx   ru   ry  r|   rW  r  rv   r   r   	LONDON_NYN)!=)zc%(py2)s
{%(py2)s = %(py0)s.action
} != %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.EXIT
}.value
}rD   r4   r  zunexpected EXIT: z meta=rO  r  z@exit: grace period indices active (BE + toward mean) -> not EXIT)r   rM   rs   r
   r   r2   r   r   r3   r   r   r.   r6   r   r   r  r  r4   r  r  r  r   r!  r"  r#  rS  rn  r  r$  r%  r   )r'  r  rE   r   r   r  rD   r*  rT  r.  r4  r0  r1  s                r   %test_exit_grace_period_indices_activer  "  sS     -C	-5F.ST	UBCEe/P/P/V/V$oo33D#*WwPE ut4D DDMDK
$t146$	C 
{	# 0**3//0?? Gk.. G.44 G?44 G G5F5FG?4 G G@FG G.F.F  G G=FY  G G=FY  G G@FG G.F.F * G G=FY * G G=FY / G G=FY 5 G G5F5F
HOO,F83D3D2EFG G G3F3FG G GJK 00 0s1   B;I-=I II FI-I  I*%I-c            	       K   t               } t               }t        | |      }t        dt        j
                  j                  t        j                  j                  dddd      }t        dd      }d	|d
<   t        |t        ddd      t        |            }t        d      5  |j                  |       d{   }ddd       j                  }t         j"                  }|j                  }	||	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  }t1        t%        j2                  |            dx}x}
x}}	|j4                  d   }d}
||
k(  }|slt%        j&                  d|fd||
f      t%        j.                  |      t%        j.                  |
      dz  }dd|iz  }t1        t%        j2                  |            dx}x}}
|j6                  }t9        |      }d}	||	k(  }|s
t%        j&                  d|fd ||	f      d!t)        j*                         v st%        j,                  t8              rt%        j.                  t8              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  }t1        t%        j2                  |            dx}x}x}}	t;        d$       y7 # 1 sw Y   xY ww)%zGrace period expired (minutes >= grace_limit) -> EXIT grace_expired.

    Pinned to LONDON_NY (deep=65, grace_limit=80). minutes_open=85 >=80
    -> grace_expired branch fires.
    r>  r   r   r  r  r  Tr=  ry  r|   g     @U@r  rv   r   r   r  Nr	  r  rD   r4   r  r  r  r  grace_expiredr  r  r  r  r   r  r  r  r  z0exit: grace period expired -> EXIT grace_expired)r   rM   r
   r   r2   r   r   r3   r   r   r.   r6   r   r   r  r  r4   r  r  r  r   r!  r"  r#  r$  r%  r  rS   r  r   )r'  r  rE   r   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r)  r5  r6  r-  r/  s                      r   &test_exit_grace_period_indices_expiredr  @  sr     -C	BCEe/P/P/V/V$oo33D#*WwPE ut4DDK
$t146$	C 
{	# 0**3//0??4k..4.444?44444?444444484448444?444444k444k444.44444444444Y':?:'?::::'?:::':::?:::::::xx3x=A=A=A33rrx=A:;	 00 0s1   B#O"%O:O;O?LO"OOO"c            	     h  K   t               } t               }t        | |      }t        ddd      }t	               }d|d<   d|d<   t        |t        d	d
d      t        |            }|j                  |       d{   }|j                  }t        j                  }|j                  }	||	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   }d}
||
k(  }|slt        j                  d|fd||
f      t        j$                  |      t        j$                  |
      dz  }dd|iz  }t'        t        j(                  |            dx}x}}
|j*                  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}}
|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}
}|j,                  }d#}||z
  }t/        |      }	d$}|	|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$                  |	      t        j$                  |      d(z  }d)d*|iz  }t'        t        j(                  |            dx}x}x}x}	x}}|j0                  }t3        |      }d+}	||	k(  }|s
t        j                  d|fd,||	f      d-t        j                          v st        j"                  t2              rt        j$                  t2              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}}	t5        d0       y7 w)1z2progress > 30, TP wide enough -> MOVE_SL trailing.r   Zd;O?q=
ףp?r   r   r   gffffff?ru   gMbP?r         .@g      4@rv   r   r   Nr	  )zf%(py2)s
{%(py2)s = %(py0)s.action
} == %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.MOVE_SL
}.value
}rD   r4   r  r  r  	sl_targettrailingr  r  r  r  trailing_atr_multg      ?)is not)z6%(py2)s
{%(py2)s = %(py0)s.move_sl_to
} is not %(py5)sr  rR  r@  K7A`?gư>r  )z\%(py8)s
{%(py8)s = %(py0)s((%(py3)s
{%(py3)s = %(py1)s.move_sl_to
} - %(py5)s))
} < %(py11)sabs)r  r  r  r  r  py11zassert %(py13)spy13r   r  r  r  r  z9exit: trailing emergency progress 50% -> MOVE_SL trailing)r   rM   r
   r   r   r.   r6   r   r  r  r4   MOVE_SLr   r  r  r   r!  r"  r#  r$  r%  r  
move_sl_tor  rS   r  r   )r'  r  rE   r   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r)  r5  r6  r-  r,  rB  r/  @py_assert10@py_assert9@py_format12@py_format14s                            r   test_exit_trailing_emergencyr  \  s    
-C	BCE 6FVLE "DDM!D
$t146$	C &&s++H??7k1171777?77777?777777787778777?777777k777k777177777777777[)7Z7)Z7777)Z777)777Z7777777018S81S88881S8881888S8888888*d*d****d******8***8******d*******""3V3"V+33+,3t3,t3333,t33333333333333333x333x333"333V333,333t33333333xx3x=A=A=A33rrx=ACD ,s   A:X2<X/=V3X2c            	     
  K   t               } t               }t        | |      }t        ddd      }t	               }d|d<   d|d<   t        |t        d	d
dd      t        |            }|j                  |       d{   }|j                  }t        j                  }|j                  }	||	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   }d}
||
k(  }|slt        j                  d|fd||
f      t        j$                  |      t        j$                  |
      dz  }dd|iz  }t'        t        j(                  |            dx}x}}
|j*                  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}}
|j*                  d!   }|j,                  }||k(  }|st        j                  d|fd"||f      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*                  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}}
|j.                  }t1        |      }d(}	||	k(  }|s
t        j                  d|fd)||	f      d*t        j                          v st        j"                  t0              rt        j$                  t0              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}}	t3        d-       y7 w).zTBUY: RSI crossed 48, P&L>0, progress>15, !rsi50_partial_done -> PARTIAL_50 + set_be.r   r  r  r  r}   r|   r  ru   r{   r  rv   F)r   r   r   rsi50_partial_doner   Nr	  zi%(py2)s
{%(py2)s = %(py0)s.action
} == %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.PARTIAL_50
}.value
}rD   r4   r  r  r  r  rsi50_crossr  r  r  r  set_be_after_partialTr  rQ  be_pricez3%(py1)s == %(py5)s
{%(py5)s = %(py3)s.entry_price
}r   r  rR  r@  r   r   r  r  r  r  z9exit: RSI50 cross + P&L>0 -> PARTIAL_50 + set_be metadata)r   rM   r
   r   r   r.   r6   r   r  r  r4   
PARTIAL_50r   r  r  r   r!  r"  r#  r$  r%  r  r   rS   r  r   )r'  r  rE   r   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r)  r5  r6  r-  r,  rB  r/  s                        r   #test_exit_rsi50_partial_with_set_ber  y  sj    
-C	BCE6FVLE "DDKDM
$s14057 $C &&s++H??:k44:4:::?:::::?:::::::8:::8:::?::::::k:::k:::4:::::::::::Y'8=8'=8888'=888'888=888888834<<4<<<<4<<<4<<<<<<<<<<Z(=E,=,==(,=====(,====(======E===E===,========12:d:2d::::2d:::2:::d:::::::xx3x=A=A=A33rrx=ACD ,s   A;U7=U4>S7U7c            	       K   t               } t               }t        | |      }t        ddd      }t	               }d|d<   d|d<   d	|d
<   t        |t        dddd      t        |            }|j                  |       d{   }|j                  }t        j                  }|j                  }	||	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   }d}
||
k(  }|slt        j                  d|fd||
f      t        j$                  |      t        j$                  |
      dz  }dd|iz  }t'        t        j(                  |            dx}x}}
|j*                  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}}
|j*                  d#   }|j,                  }||k(  }|st        j                  d|fd$||f      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}}t/        d)       y7 ;w)*u   progress >= 50, !partial_done -> PARTIAL_50 auto + set_be_after_partial.

    V18: soglia abbassata 65→50 e aggiunto set_be per parità con Brain TF.
    r   r  r  r  g"~j?ru   g     G@r|   g-C6
?r   r{   r  rv   F)r   r   r   partial_doner   Nr	  r  rD   r4   r  r  r  r  auto_partial_50r  r  r  r  r  Tr  rQ  r  r  r   r  rR  r@  zHexit: progress >= 50 -> auto PARTIAL_50 + set_be (be_price tick-aligned))r   rM   r
   r   r   r.   r6   r   r  r  r4   r  r   r  r  r   r!  r"  r#  r$  r%  r  r   r   )r'  r  rE   r   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r)  r5  r6  r-  r,  rB  s                       r   test_exit_auto_partial_50r    s    
 -C	BCE6FVLE "DDMDKD
$t14*/1 $C &&s++H
 ??:k44:4:::?:::::?:::::::8:::8:::?::::::k:::k:::4:::::::::::Y'<+<<'+<<<<<'+<<<<'<<<+<<<<<<<<34<<4<<<<4<<<4<<<<<<<<<<Z(=E,=,==(,=====(,====(======E===E===,========RS ,s   B O N=L;O c                   K   t               } t               }t        | |      }t               }d|d<   d|d<   t	        t               t        ddd      t        |            }|j                  |       d {   }|j                  }t        j                  }|j                  }||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}}d}|j*                  }||v }|st        j                  d|fd||f      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,                  }t/        |      }d}||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}}t1        d       y 7 Mw)Nr  rx   ;Nё\?ru   r{   rK  r   r   r	  zc%(py2)s
{%(py2)s = %(py0)s.action
} == %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.HOLD
}.value
}rD   r4   r  r  r  zstessa candelar  r  r  rR  r@  r   r  r  r  r  z&exit: same-candle dedup -> HOLD, no AI)r   rM   r
   r   r.   r   r6   r   r  r  r4   HOLDr   r  r  r   r!  r"  r#  r$  r%  rn  rS   r  r   )r'  r  rE   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r-  r)  r,  rB  r/  s                     r   test_exit_same_candle_dedupr    s@    
-C	BCE "D DDM
l$s179$	C &&s++H??4k..4.444?44444?444444484448444?444444k444k444.44444444444.x..............x...x..........xx3x=A=A=A33rrx=A01	 ,s   A4O6O7MOc                 Z  K   t               } t        t        ddd            }t        | |      }t	               }d|d<   d|d<   t        t               t        d	d
d      t        |            }|j                  |       d {   }|j                  }t        j                  }|j                  }||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}}d}|j,                  }||v }|st        j                  d|fd||f      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.                  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}}	t1        d       y 7 w) NTzregime flippedr  ro  r  ru   g     @rx   r  rK  rv   r   r   r	  r  rD   r4   r  r  r  r  r  r  rR  r@  evaluated_candle_timer  r  r  r  zexit: AI exit_now=True -> EXIT)r   rM   rs   r
   r   r.   r   r6   r   r  r  r4   r  r   r  r  r   r!  r"  r#  r$  r%  rn  r  r   )r'  r  rE   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r-  r)  r,  rB  r5  r6  s                      r   test_exit_ai_says_exitr    s    
-C	-$4/  
B CE "DDM D
l$s146$	C &&s++H??4k..4.444?44444?444444484448444?444444k444k444.44444444444.x..............x...x..........45??5????5???5??????????()	 ,s   BL+L(J$L+c                   K   t               } t        t        dddd            }t        | |      }t	               }d|d<   d|d	<   t        t               t        d
dd      t        |            }|j                  |       d {   }|j                  }t        j                  }|j                  }||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   }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/        d       y 7 ݭw)NFTznear vwap target)r  partial_closern  ro  r  ru   g     p@rx   r  rK  rv   r   r   r	  r  rD   r4   r  r  r  r  
ai_partialr  r  r  r  z)exit: AI partial_close=True -> PARTIAL_50)r   rM   rs   r
   r   r.   r   r6   r   r  r  r4   r  r   r  r  r   r!  r"  r#  r$  r%  r  r   )r'  r  rE   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r)  r5  r6  s                   r   test_exit_ai_says_partialr    s    
-C	-D$/  
B CE "DDM D
l$s146$	C &&s++H??:k44:4:::?:::::?:::::::8:::8:::?::::::k:::k:::4:::::::::::Y'7<7'<7777'<777'777<777777734 ,s   BI%I"GI%c                 F  K   t               } t        t        d dd            }t        | |      }t	               }d|d<   d|d<   t        t               t        d	d
d      t        |            }|j                  |       d {   }|j                  }t        j                  }|j                  }||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}}d}|j,                  }||v }|st        j                  d|fd||f      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}}t/        d       y 7 w)Noverload   )rP   rQ   ro   ro  r  ru   g     X@rx   r  rK  rv   r   r   r	  r  rD   r4   r  r  r  zAI errorr  r  r  rR  r@  zexit: AI error -> HOLD default)r   rM   r   r
   r   r.   r   r6   r   r  r  r4   r  r   r  r  r   r!  r"  r#  r$  r%  rn  r   )r'  r  rE   r   r  rD   r*  rT  r.  r4  r0  r1  r3  r-  r)  r,  rB  s                    r   test_exit_ai_error_holdsr    s    
-C	ZTjSTU	VBCE "DDM D
l$s146$	C &&s++H??4k..4.444?44444?444444484448444?444444k444k444.44444444444((:((((:(((:(((((((((((((((((((() ,s   BJ!JHJ!c                 :  K   t        d       t                d {    t                d {    t                d {    t	                d {    t                d {    t                d {    t                d {    t                d {    t                d {    t                d {    t                d {    t                d {    t                d {    t                d {    t                d {    t!                d {    t#                d {    t%                d {    t'                d {    t)                d {    t+                d {    t-                d {    t/                d {    t1                d {    t3                d {    t5                d {    t7                d {    t9                d {    t;                d {    t=                d {    t?                d {    t        d       y7 -7 7 7  7 7 7 7 7 7 7 7 7 y7 j7 [7 L7 =7 .7 7 7 7 7 7 7 7 7 7 7 7 q7 aw)Nztest_brain_mr.pyzALL TESTS PASSEDr   ) r   r7  r;  rD  rI  rM  rU  rY  r`  rb  rq  rv  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r*   r   r   
main_asyncr  
  s    	

*
,,,
+
---
,
...
&
(((
#
%%%
4
666
5
777
8
:::
;
===
/
111
2
444
#
%%%
'
)))
/
111
0
222
/
111
0
222
'
)))
4
666
&
(((
'
)))
.
000
/
111
0
222
&
(((
-
///
#
%%%
%
'''
 
"""
#
%%%
"
$$$	
K --.(%67:=14%)1212)6()012(/%'"%$s(  JIJIJI JIJ#I$J5I6JIJIJ+I ,J=I#>JI&J!I)"J3I,4JI/JI2J)I5*J;I8<JI;JI> J1J2JJJJJ'J	(J9J:JJJJJ/J0JJJJJ%J&J7J8JJJJJJJJ J#J&J)J,J/J2J5J8J;J>JJJJ	JJJJJJJJJc                 <    t        j                  t                     S r   )asynciorunr  r*   r   r   mainr!  5  s    ;;z|$$r   __main__)rr   r   r$   r   )r   r   r$   r   )r$   r+   )r   )rF   r#   r$   r   )r>  T)rF   r#   r   r   r$   r   )r   r#   rF   r#   r   r#   r   r#   r   r   r   r   r   r   r   r\   r   r   r   r   r   r   r$   r5   )NNN)r   zTradeEntry | Noner   zTradeRuntime | Noner   zdict | Noner$   r.   )r   r#   r$   r%   )r$   r\   )cr)   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter  r  rp   rj   sysr   r   pathlibr   pathinsertr#   __file__resolveparentanalysis.tech_snapshotr   brain.ai_clientr   rE   r	   r   brain.brain_mrr
   r   r   r   r   core.configr+   r,   r-   core.contractsr.   r/   r0   r1   r2   r3   r4   r5   r6   rK   rM   r^   rg   rs   r   r   r   r   r   r   r   r   r   r7  r;  rD  rI  rM  rU  rY  r`  rb  rq  rv  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r&   exitr*   r   r   <module>r5     s  	 #      
 '  3tH~--/66==> ? / & % / / < ;
 
 
$*  7 7> ><4nM
D#N $,,22..&&  	
        D  $#'

 
 
 	
<"
?P F7(Q(R6C,>0?,B47&U2S:5$P8M4]D8,NJ4$4"L<<8E:E4T@2(*,5,*.(V% zCHHTV r   