
    Aj                         d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZmZ ddlmZmZ ddlmZmZ ddlmZ ej*                  d        Zej*                  d	        Z G d
 d      Zy)zUnit tests for risk manager.    N)Decimal)	AsyncMockpatch)	RiskLevelSignalAction)RiskContextRiskManager)StrategySignalc                     t        d#i dt        d      dt        d      dt        d      ddddd	d
dd dt        d      dddddd
dddt        d      dt        d      dddddddd d!t        d"      S )$Ncapital10000	daily_pnl0daily_loss_pcttrades_todayr   consecutive_losses	is_lockedFlock_reason
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_buyK   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            	      ^    t        t        j                  dt        j                  dddd      S )NP   h     zTest buy signal)action
confidence
risk_level	stop_losstake_profitreasonscore)r
   r   BUYr   MEDIUMr%   r&   r'   
buy_signalr6   %   s0    ##  r&   c                   $   e Zd Zej                  j
                  d        Zej                  j
                  d        Zej                  j
                  d        Zej                  j
                  d        Z	ej                  j
                  d        Z
y)TestRiskManagerc                 j  K   t               }t        dt        d      5  |j                  ||t	        d             d {   }d d d        j
                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}|j                  }d}||kD  }|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 }||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}}y 7 d# 1 sw Y   dxY ww)N2app.services.risk_manager.is_emergency_stop_activeFnew_callablereturn_value50000Tisz0%(py2)s
{%(py2)s = %(py0)s.approved
} is %(py5)sdecisionpy0py2py5assert %(py7)spy7r   )>)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_sizer0   
selfr(   r6   managerrB   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s
             r'   test_approves_valid_buyz'TestRiskManager.test_approves_valid_buy3   s    -GV_nst$44ZwW^O_``H u  (D( D(((( D((((((x(((x((( (((D(((((((%%))%))))%))))))x)))x)))%))))))))))!!--!----!------x---x---!---------- a uts.   J3 J&J# J&IJ3#J&&J0+J3c                   K   t        d      |_        t               }t        dt        d      5  |j                  ||t        d             d {   }d d d        j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}|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}}y 7 # 1 sw Y   xY ww)Nz3.0r:   Fr;   r>   r?   rA   rB   rC   rG   rH   
daily_loss==z4%(py2)s
{%(py2)s = %(py0)s.block_reason
} == %(py5)s)r   r   r	   r   r   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   block_reasonrV   s
             r'   test_blocks_daily_lossz&TestRiskManager.test_blocks_daily_loss<   s?    &-en#-GV_nst$44ZwW^O_``H u  )E) E)))) E))))))x)))x))) )))E)))))))$$44$4444$444444x444x444$4444444444 a uts/   -G< G/G,G/FG<,G//G94G<c                   K   t        t        j                  dt        j                  ddd      }t               }t        dt        d      5  |j                  ||t        d	             d {   }d d d        j                  }d}||u }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}x}}y 7 # 1 sw Y   xY ww)N2   r+   r,   zLow confidence)r-   r.   r/   r0   r1   r2   r:   Fr;   r>   r?   rA   rB   rC   rG   rH   )r
   r   r4   r   r5   r	   r   r   rK   r   rL   rM   rN   rO   rP   rQ   rR   rS   rT   
rW   r(   signalrX   rB   rY   rZ   r[   r\   r]   s
             r'   test_blocks_low_confidencez*TestRiskManager.test_blocks_low_confidenceE   s     ## ''#
 -GV_nst$44V\7SZK[\\H u  )E) E)))) E))))))x)))x))) )))E))))))) ] uts1   A
E E,E-E1CEEEEc                   K   d|_         t               }t        dt        d      5  |j	                  ||t        d      d       d {   }|j	                  ||t        d      d       d {   }d d d        j                  }d}||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|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}||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}}y 7 7 g# 1 sw Y   gxY ww)Ng{Gz?r:   Fr;   r>   DOGEUSDT)symbolENSUSDTr?   rA   blockedrC   rG   rH   
low_volumera   rc   Tallowed)r   r	   r   r   rK   r   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rd   )rW   r(   r6   rX   ro   rq   rY   rZ   r[   r\   r]   s              r'   $test_core_symbol_bypasses_low_volumez4TestRiskManager.test_core_symbol_bypasses_low_volumeT   s    '+$-GV_nst#33JgV]N^gq3rrG#33JgV]N^gp3qqG u (5(5((((5((((((w(((w((((((5(((((((##3|3#|3333#|333333w333w333#333|3333333'4'4''''4''''''w'''w''''''4'''''''	 sq utsA   $K%"KK	%K.K/K3IK%KKK"K%c                 2  K   t        t        j                  dt        j                  d      }t               }t        dt        d      5  |j                  ||t        d             d {   }d d d        j                  }d}||u }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                   |      nd
t        j                   |      t        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}x}}|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}}y 7 # 1 sw Y   xY ww)Nr*   zNo SL/TP)r-   r.   r/   r2   r:   Fr;   r>   r?   rA   rB   rC   rG   rH   missing_sl_tpra   rc   )r
   r   r4   r   r5   r	   r   r   rK   r   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rd   rh   s
             r'   test_blocks_missing_sl_tpz)TestRiskManager.test_blocks_missing_sl_tp_   sW    ## ''	
 -GV_nst$44V\7SZK[\\H u  )E) E)))) E))))))x)))x))) )))E)))))))$$77$7777$777777x777x777$7777777777 ] uts1   AH
 H
*H+H
/FHH

HHN)__name__
__module____qualname__pytestmarkasyncior^   re   rj   rr   ru   r%   r&   r'   r8   r8   2   s    [[. . [[5 5 [[* * [[( ( [[8 8r&   r8   )__doc__builtinsrO   _pytest.assertion.rewrite	assertionrewriterM   ry   decimalr   unittest.mockr   r   
app.modelsr   r   app.services.risk_managerr   r	   app.services.strategy_enginer
   fixturer(   r6   r8   r%   r&   r'   <module>r      sX    "     * . > 7  0 	 	98 98r&   