
    ۛAj!                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ  ee      Z e
       Ze G d d             Ze G d d             Z G d d      Z e       Zy)z7Risk management service - mandatory capital protection.    )	dataclass)date)Decimal)Optional)get_settings)
get_logger)is_emergency_stop_active)	RiskLevelSignalAction)StrategySignal)statistics_servicec                       e Zd ZU eed<   eed<   eed<   eed<   eed<   e	e   ed<   e	e   ed<   dZ
e	e   ed	<   dZedz  ed
<   dZedz  ed<   dZeed<   y)RiskDecisionapprovedaction
confidence
risk_levelposition_size	stop_losstake_profitNblock_reason
supportingcontradicting reason)__name__
__module____qualname__bool__annotations__r   intr
   r   r   r   strr   dictr   r        CC:\xampp\htdocs\tradingbinance\backend\app\services\risk_manager.pyr   r      sh    NO  '"""&L(3-&"Jt"!%M4$;%FCr%   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   ee   ed<   eed<   e	ed	<   e	ed
<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   y)RiskContextcapital	daily_pnldaily_loss_pcttrades_todayconsecutive_losses	is_lockedlock_reason
spread_pctrelative_volumehistorical_volatilityhas_api_errorsdata_sufficientmax_risk_per_trade_pctmax_daily_loss_pctmax_trades_per_daymax_consecutive_lossesmin_confidence_buyensemble_sell_threshold	kelly_capN)
r   r   r   r   r    r!   r   r   r"   floatr$   r%   r&   r(   r(   "   sw    O#  ##  r%   r(   c                       e Zd ZdZg dZ	 ddededededz  de	f
d	Z
dded
ededz  dee   fdZdededededededefdZdededefdZdededefdZy)RiskManagerz
    Enforces mandatory risk rules. Never approves trades that violate limits.
    Does NOT guarantee profits - only protects capital.
    ))emergency_stopzEmergency stop is active)
daily_losszDaily loss limit reached)r-   zToo many consecutive losses)
max_tradeszMaximum daily trades reached)high_volatilityzAbnormal volatility detected)high_spreadzSpread too high)
low_volumezVolume too low)low_confidencezConfidence below threshold)insufficient_datazInsufficient market data)
api_errorszBinance API errors detected)uncertain_marketzMarket conditions uncertainNsignalcontextcurrent_pricesymbolreturnc                 ~  K   | j                  |||       d {   }|rt        j                  d||j                  j                         t        dt        j                  |j                  |j                  t        d      d d ||j                  |j                  d|       S |j                  t        j                  k(  r^t        dt        j                  |j                  |j                  t        d      d d |j                  |j                  |j                  
      S |j                  t        j                  k(  rr|j                  |j                  k  rYt        dt        j                  |j                  |j                  t        d      d d dd	|j                   d
|j                   	      S |j                   r|j"                  sCt        dt        j                  |j                  t$        j&                  t        d      d d dd	      S | j)                  |j*                  |t        t-        |j                               |j.                  |j                  t1        |j2                              }|dk  r?t        dt        j                  |j                  |j                  t        d      d d dd	      S t        d|j                  |j                  |j                  |t        t-        |j                               t        t-        |j"                              |j                  |j                  |j                  
      S 7 !w)Ntrade_blocked)r   r   F0z	BLOCKED: )r   r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   rE   zConfidence z < minimum )	r   r   r   r   r   r   r   r   r   missing_sl_tpz'Stop loss and take profit are mandatory)r)   entry_pricer   max_risk_pctr   r;   r   zero_position_sizez Calculated position size is zeroT)
r   r   r   r   r   r   r   r   r   r   )_check_blocksloggerwarningr   valuer   r   HOLDr   r   r   r   r   r   BUYr9   r   r   r
   HIGH_calculate_position_sizer)   r"   r5   r<   r;   )selfrI   rJ   rK   rL   r   r   s          r&   evaluate_signalzRiskManager.evaluate_signalM   s     "//HHNN?<H[H[N\#((!,,!,,%cl )!,,$22"<.1  ==L---#((!,,!,,%cl }}!,,$22  ==L,,,1B1BWE_E_1_#((!,,!,,%cl -$V%6%6$7{7C]C]B^_
 
 v'9'9#((!,,$>>%cl ,@
 
 55OO%c&"2"234 77((G--. 6 
 A#((!,,!,,%cl 19
 
 ==(((('c&"2"234F$6$6 78(( ..==
 	
_ Is   L=L:L!L=ctxc                   K   t                d {   s|j                  r|j                  xs dS |j                  ry|j                  sy|j
                  |j                  k\  ry|j                  |j                  k\  ry|j                  |j                  k\  ry|j                  t        j                  kD  ry|j                  t        t!        t        j"                              kD  ry|r|t        j$                  v nd	}|s|j&                  t        j(                  k  ry
|j*                  t,        j.                  k(  r|j0                  t2        j4                  k(  ryy 7 Iw)Nr?   rG   rF   r@   r-   rA   rB   rC   FrD   rH   )r	   r.   r/   r3   r4   r+   r6   r-   r8   r,   r7   r2   settingshigh_volatility_thresholdr0   r   r"   max_spread_pctsymbol_scanner_core_symbolsr1   min_relative_volumer   r
   r[   r   r   rZ   )r]   rI   r_   rL   is_core_symbols        r&   rU   zRiskManager._check_blocks   s    )+++s}}??6&66""&!7!77!!S%?%??'s555$$x'I'II$>>GC(?(?$@AA KQ8#G#GGW\#"5"58T8T"T	.6==LDTDT3T%? ,s   EEE	Er)   rR   r   rS   r   r;   c                 R   ||t        d      z  z  }t        ||z
        }|dk(  rt        d      S ||z  }	t        t        |dz              }
t        t        t        |d                  }|	|
z  |z  }|t        d      z  }||z  }t        ||      j	                  t        d            S )N100r   rP   d   g      ?z0.1z0.00001)r   absr"   minquantize)r]   r)   rR   r   rS   r   r;   risk_amount
price_risk	base_sizeconfidence_factorkelly_factoradjustedmax_position_valuemax_qtys                  r&   r\   z$RiskManager._calculate_position_size   s     !>?y01
?3<*,	#C
S(8$9:s3y$#78900<?$wu~5${28W%..wy/ABBr%   r+   r6   c                     ||k\  S Nr$   )r]   r+   r6   s      r&   should_lock_dailyzRiskManager.should_lock_daily   s    !333r%   current	trade_pnlc                     |dk  r|dz   S y)Nr      r$   )r]   rx   ry   s      r&   update_consecutive_lossesz%RiskManager.update_consecutive_losses   s    q=Q;r%   rv   )r   r   r   __doc__BLOCK_CONDITIONSr   r(   r   r"   r   r^   r   rU   r!   r<   r\   r   rw   r|   r$   r%   r&   r>   r>   9   s
   
& "a
a
 a
 	a

 d
a
 
a
F .  {  TWZ^T^  jrsvjw  DCC C 	C
 C C C 
C04 4W 4Y] 4  S r%   r>   N)r}   dataclassesr   datetimer   decimalr   typingr   app.core.configr   app.core.loggingr   app.core.redis_clientr	   
app.modelsr
   r   app.services.strategy_enginer   app.services.statistics_servicer   r   rV   ra   r   r(   r>   risk_managerr$   r%   r&   <module>r      s    = !    ( ' : . 7 >	H	>      ,w wt }r%   