+
    0.j  c                       R t ^ RIt^ RIHu Ht ^ RIt^ RIH	t	 ^ RI
HtHt ^ RIHtHt ^ RIHtHt ^ RIHt ]P*                  R 4       t]P*                  R 4       t ! R	 R
4      tR# )zUnit tests for risk manager.N)Decimal)	AsyncMockpatch)	RiskLevelSignalAction)RiskContextRiskManager)StrategySignalc                     \        R/ R \        R4      bR\        R4      bR\        R4      bR^ bR^ bRRbR	R
bR\        R4      bRRbRRbRRbRRbR\        R4      bR\        R4      bR^
bR^bR^KbR^(bR\        R4      b # )capital10000	daily_pnl0daily_loss_pcttrades_todayconsecutive_losses	is_lockedFlock_reasonN
spread_pctz0.05relative_volumeg      ?historical_volatilityg333333?has_api_errorsdata_sufficientTmax_risk_per_trade_pctz0.75max_daily_loss_pctz2.5max_trades_per_daymax_consecutive_lossesmin_confidence_buyensemble_sell_threshold	kelly_capz0.25 )r   r   r       AC:\xampp\htdocs\tradingbinance\backend\tests\test_risk_manager.pyrisk_contextr"      s      #, s| 	
    6?  "    'v #5>    !!" #$ !#%& &/' r    c            
      ^    \        \        P                  ^P\        P                  RRR^PR7      # )P   h     zTest buy signal)action
confidence
risk_level	stop_losstake_profitreasonscore)r   r   BUYr   MEDIUMr   r    r!   
buy_signalr0   %   s0    ##  r    c                      a  ] tR t^2t o ]P
                  P                  R 4       t]P
                  P                  R 4       t]P
                  P                  R 4       t	]P
                  P                  R 4       t
RtV tR# )TestRiskManagerc           	     0  "   \        4       p\        R \        RR7      ;_uu_ 4        VP                  W!\	        R4      4      G Rj  xL
 pRRR4       XP
                  pRqeVJ qw'       g   \        P                  ! RV3RWV34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	\        P                  ! V4      /,          pR
RV/,          p	\        \        P                  ! V	4      4      hR;p;rvVP                  p^ qeV8  qw'       g   \        P                  ! RV3RWV34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	\        P                  ! V4      /,          pR
RV/,          p	\        \        P                  ! V	4      4      hR;p;rvVP                  pRqeVJqw'       g   \        P                  ! RV3RWV34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	\        P                  ! V4      /,          pR
RV/,          p	\        \        P                  ! V	4      4      hR;p;rvR#  EL  + '       g   i     EL; i5i)2app.services.risk_manager.is_emergency_stop_activeFnew_callablereturn_value50000NTpy0decisionpy2py5assert %(py7)spy7isz0%(py2)s
{%(py2)s = %(py0)s.approved
} is %(py5)s)>)z4%(py2)s
{%(py2)s = %(py0)s.position_size
} > %(py5)s)is not)z5%(py2)s
{%(py2)s = %(py0)s.stop_loss
} is not %(py5)s)r   r   r   evaluate_signalr   approved
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationposition_sizer*   
selfr"   r0   managerr:   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s
   &&&       r!   test_approves_valid_buy'TestRiskManager.test_approves_valid_buy3   sV    -GV_nstt$44ZwW^O_``H u((((((((((((((((((((((((((((()))))))))))))))))))))))))))))----------------------------- a uttsD   %LLK?LA0L<C#L C"LA<L?LL		Lc           	       "   \        R 4      Vn        \        4       p\        R\        RR7      ;_uu_ 4        VP                  W!\        R4      4      G Rj  xL
 pRRR4       XP                  pRqeVJ qw'       g   \        P                  ! RV3RWV34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	\        P                  ! V4      /,          pR
RV/,          p	\        \        P                  ! V	4      4      hR;p;rvVP                  pRqeV8H  qw'       g   \        P                  ! RV3RWV34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	\        P                  ! V4      /,          pR
RV/,          p	\        \        P                  ! V	4      4      hR;p;rvR#  EL  + '       g   i     EL; i5i)z3.0r4   Fr5   r8   Nr9   r:   r;   r<   r=   r>   
daily_lossr?   rA   ==z4%(py2)s
{%(py2)s = %(py0)s.block_reason
} == %(py5)s)r   r   r   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   block_reasonrO   s
   &&&       r!   test_blocks_daily_loss&TestRiskManager.test_blocks_daily_loss<   s    &-en#-GV_nstt$44ZwW^O_``H u)))))))))))))))))))))))))))))44444444444444444444444444444 a utts=   5IH/H,H/A0IC#I0A<I,H//I 	:	Ic           	       "   \        \        P                  ^2\        P                  RRRR7      p\        4       p\        R\        RR7      ;_uu_ 4        VP                  W!\        R4      4      G R	j  xL
 pR	R	R	4       XP                  pRqeVJ qw'       g   \        P                  ! RV3RWV34      R
R\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                   ! V4      MRR\        P                   ! V4      R\        P                   ! V4      /,          pRRV/,          p	\#        \        P$                  ! V	4      4      hR	;p;rvR	#  L  + '       g   i     L; i5i)2   r%   r&   zLow confidence)r'   r(   r)   r*   r+   r,   r4   Fr5   r8   Nr9   r:   r;   r<   r=   r>   r?   rA   )r   r   r.   r   r/   r   r   r   rD   r   rE   rF   rG   rH   rI   rJ   rK   rL   rM   
rP   r"   signalrQ   r:   rR   rS   rT   rU   rV   s
   &&        r!   test_blocks_low_confidence*TestRiskManager.test_blocks_low_confidenceE   s     ## ''#
 -GV_nstt$44V7SZK[\\H u))))))))))))))))))))))))))))) ] uts8   AE:E'3E%4E'8A0E:)A<E:%E''E7	2E:c           	       "   \        \        P                  ^P\        P                  RR7      p\        4       p\        R\        RR7      ;_uu_ 4        VP                  W!\        R4      4      G Rj  xL
 pRRR4       XP                  pRqeVJ qw'       g   \        P                  ! RV3RWV34      RR	\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                   ! V4      MR	R
\        P                   ! V4      R\        P                   ! V4      /,          pRRV/,          p	\#        \        P$                  ! V	4      4      hR;p;rvVP&                  pRqeV8H  qw'       g   \        P                  ! RV3RWV34      RR	\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                   ! V4      MR	R
\        P                   ! V4      R\        P                   ! V4      /,          pRRV/,          p	\#        \        P$                  ! V	4      4      hR;p;rvR#  EL  + '       g   i     EL; i5i)r$   zNo SL/TP)r'   r(   r)   r,   r4   Fr5   r8   Nr9   r:   r;   r<   r=   r>   missing_sl_tpr?   rA   r[   r]   )r   r   r.   r   r/   r   r   r   rD   r   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r^   rc   s
   &&        r!   test_blocks_missing_sl_tp)TestRiskManager.test_blocks_missing_sl_tpT   s#    ## ''	
 -GV_nstt$44V7SZK[\\H u)))))))))))))))))))))))))))))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 ] utts?   AII
1I2I
6A0I'C#IA<II

I		Ir   N)__name__
__module____qualname____firstlineno__pytestmarkasynciorW   r_   re   ri   __static_attributes____classdictcell__)__classdict__s   @r!   r2   r2   2   s{     [[. . [[5 5 [[* * [[8 8r    r2   )__doc__builtinsrH   _pytest.assertion.rewrite	assertionrewriterF   ro   decimalr   unittest.mockr   r   
app.modelsr   r   app.services.risk_managerr   r   app.services.strategy_enginer   fixturer"   r0   r2   r   r    r!   <module>r      sX    "     * . > 7  0 	 	.8 .8r    