
    i-2                     ~    d Z ddlZddlZddlmZmZ ddlmZ ddlZ ej                  e	      Z
 G d d      Zdad Zy)u   
Système de Protection d'Urgence - Blocage automatique des achats
===================================================================
Détecte les marchés chaotiques/dangereux et suspend les achats automatiquement
    N)datetime	timedelta)dequec                   R    e Zd ZdZd Zd Zd ZddZddZddZ	d Z
d	 Zd
 Zd Zy)MarketSafetyuI   Gestionnaire de sécurité pour bloquer les achats en période dangereusec                 J   t         j                  j                  t         j                  j                  t                    | _        t         j                  j                  | j
                  d      | _        t         j                  j                  | j
                  dd      | _        t         j                  j                  | j
                  dd      | _	        d| _
        d| _        d| _        d| _        d	| _        d
| _        d | _        d | _        d | _        | j'                          y )Nzmarket_safety_status.json
trade_logszsignals_log.jsonlztrades_log.jsonlg        i  d   gGz?i  F)ospathdirnameabspath__file__
script_dirjoinsafety_filesignals_log
trades_logMIN_WIN_RATEMIN_TRADES_FOR_ANALYSISMAX_CONSECUTIVE_LOSSESMAX_REJECTION_RATEMAX_SIGNALS_PER_HOUR
is_blockedblock_reasonblock_timestamp
last_checkload_statusselfs    0/home/ubuntu/crypto_trading_bot/market_safety.py__init__zMarketSafety.__init__   s    ''//"''//(*CD77<<9TU77<<GZ['',,tFXY  '+$&)#"&$(!   # 	    c                    	 t         j                  j                  | j                        rt	        | j                  dd      5 }t        j                  |      }|j                  dd      | _        |j                  d      | _	        |j                  d      | _
        |j                  d      | _        d	d	d	       y	y	# 1 sw Y   y	xY w# t        $ r"}t        j                  d
|        Y d	}~y	d	}~ww xY w)u,   Charger l'état de blocage depuis le fichierrutf-8encodingr   Fr   r   r   Nz!Erreur chargement safety status: )r   r   existsr   openjsonloadgetr   r   r   r   	Exceptionloggerwarning)r    fdataes       r!   r   zMarketSafety.load_status(   s    		Dww~~d../$**C'B =a99Q<D&*hh|U&CDO(,(@D%+/884E+FD(&*hh|&<DO= = 0= =  	DNN>qcBCC	Ds7   AC A/B<2C <CC C 	C3C..C3c                    	 | j                   | j                  | j                  t        j                         j                         t        j                         j                         d}t        | j                  dd      5 }t        j                  ||dd       ddd       y# 1 sw Y   yxY w# t        $ r"}t        j                  d	|        Y d}~yd}~ww xY w)
u   Sauvegarder l'état de blocage)r   r   r   r   last_updatewr&   r'      F)indentensure_asciiNz!Erreur sauvegarde safety status: )r   r   r   r   now	isoformatr*   r   r+   dumpr.   r/   error)r    r2   r1   r3   s       r!   save_statuszMarketSafety.save_status5   s    	B"oo $ 1 1#'#7#7&lln668'||~779D d&&g> A!		$!%@A A A 	BLL<QC@AA	Bs6   A>B/  B#B/ #B,(B/ ,B/ /	C8CCc                 n   	 t         j                  j                  | j                        syg }t	        j
                         }|t        |      z
  }t        | j                  dd      5 }|D ]j  }	 t        j                  |      }|j                  d      dk7  r.|j                  dd	      }t	        j                  |      }	|	|k\  r|j                  |       l 	 ddd       t        |      | j                  k  ryt        d
 |D              }
t        d |D              }|
|z   }|dk(  ry|
|z  }d}d}t!        |      D ]+  }|j                  dd      dk  r|dz  }t#        ||      }*d}- ||
||||dS #  Y xY w# 1 sw Y   xY w# t$        $ r"}t&        j)                  d|        Y d}~yd}~ww xY w)uF   Analyser les trades récents pour détecter performance catastrophiqueNhoursr%   r&   r'   typeTRADE_CLOSE	timestamp c              3   L   K   | ]  }|j                  d d      dkD  sd  ywpnl_pctr      Nr-   .0ts     r!   	<genexpr>z5MarketSafety.analyze_recent_trades.<locals>.<genexpr>b   s"     KQ155A3F3JqK   $$c              3   L   K   | ]  }|j                  d d      dk  sd  ywrG   rJ   rK   s     r!   rN   z5MarketSafety.analyze_recent_trades.<locals>.<genexpr>c   s"     MqQUU9a5H15LMrO   r   rH   rI   )total_tradeswinslosseswin_rateconsecutive_lossesperiod_hourszErreur analyse trades: )r   r   r)   r   r   r:   r   r*   r+   loadsr-   fromisoformatappendlenr   sumreversedmaxr.   r/   r=   )r    rA   recent_tradesr:   cutoffr1   linetradets_strtsrR   rS   totalrT   rU   max_consecutive_lossesr3   s                    r!   analyze_recent_tradesz"MarketSafety.analyze_recent_tradesD   s   :	77>>$//2 M,,.C9511FdoosW= ! !D! $

4 0 99V,=$!&;!;%33F;<)007!! =!D$@$@@ K-KKDMMMMF6MEze|H "#%&"!-0 +99Y*Q.&!+&-01GI[-\*)*&+ !& $&< % 5! ! !^  	LL21#67	se   )F	 =F	 )E=0)E5E==E5E= F	 ;.F	 *A
F	 5E:7E==FF	 		F4F//F4c                 @   	 t         j                  j                  | j                        syg }t	        j
                         }|t        |      z
  }t        | j                  dd      5 }|D ]U  }	 t        j                  |      }|j                  dd      }t	        j                  |      }	|	|k\  r|j                  |       W 	 ddd       |sy|D 
cg c]  }
|
j                  d      r|
 }}
t        d	 |D              }|rt        |      t        |      z  nd
}|r|t        |      z  nd
}t        |      |z  }t        |      t        |      |||||dS #  Y xY w# 1 sw Y   xY wc c}
w # t        $ r"}t         j#                  d|        Y d}~yd}~ww xY w)uA   Détecter saturation du marché (trop de signaux, trop de rejets)Nr@   r%   r&   r'   rD   rE   executedc              3   H   K   | ]  }d |j                  dd      v rd  yw)MAX_POSITIONSrejection_reasonrE   rI   NrJ   )rL   ss     r!   rN   z9MarketSafety.analyze_signal_saturation.<locals>.<genexpr>   s.      %Y1'6!%%@RTV:W'W &' %Ys    "r   )total_signalsrejectedrejection_ratemax_pos_rejectionsmax_pos_ratesignals_per_hourrV   zErreur analyse saturation: )r   r   r)   r   r   r:   r   r*   r+   rW   r-   rX   rY   r[   rZ   r.   r/   r=   )r    rA   recent_signalsr:   r_   r1   r`   sigrb   rc   rl   rn   rp   ro   rq   rr   r3   s                    r!   analyze_signal_saturationz&MarketSafety.analyze_signal_saturation   s   -	77>>$"2"23  N,,.C9511Fd&&g> 
!! 	!D!"jj.!$b!9%33F;<*11#6	!
! " $2Kaz9JKHK!$ %Y %Y "Y ESS]S-@@XYNAI-H=qL">2U: "%^!4M"0&8 ,$4 % ! 
! 
!  L$  	LL6qc:;	sf   )E2 =E2 )E!0AEE!
E2 E2 E-+E-/A*E2 EE!!E*&E2 2	F;FFc                    |so| j                   rc| j                  rW	 t        j                  | j                        }t        j                         |z
  j                         dk  rd| j                  fS 	 t        j                         j                         | _        | j                  d      }|r|d   }|d   }|d   }|| j                  k  rA|| j                  k\  r2d|d	z  d
d| d| j                  d	z   d}| j                  |       d|fS || j                  k\  r(d| d| j                   d}| j                  |       d|fS | j                  d      }|rB|d   }	|d   }
|
| j                  kD  r)d|
dd| j                   d}| j                  |       d|fS | j                   r| j                          | j!                          y#  Y YxY w)um   
        Vérifier si le marché est sûr pour trader
        Retourne: (is_safe: bool, reason: str)
        i,  F   r@   rT   rU   rQ   u   🚨 WIN RATE CATASTROPHIQUE: r
   .1fz% sur z trades (min: z%)u   🚨 SÉRIE DE PERTES: u    pertes consécutives (max: )rI   rq   rr   u   🚨 CHAOS DÉTECTÉ: z.0fz signaux/h (max: )TN)r   r   r   rX   r:   total_secondsr   r;   rf   r   r   _block_tradingr   ru   r   _unblock_tradingr>   )r    forcelasttrades_analysisrT   rU   rQ   reason
saturationrq   rr   s              r!   check_safetyzMarketSafety.check_safety   s     T__--doo>LLNT)88:S@!4#4#455 A
 #,,.224 4414=&z2H!01E!F*>:L $+++@\@\0\9(3,s9K6R^Q__mnrnn  AD  oD  nE  EG  H##F+v& "T%@%@@23E2FFbcgc~c~b  @A  B##F+v& 33!3<
%n5L)*<=  $";";;12B31GGXY]YrYrXsstu##F+v& ??!!#is   AG Gc                 J   | j                   sd| _         || _        t        j                         j	                         | _        t        j                  dd        t        j                  d       t        j                  d        t        j                  |       t        j                  d| j
                          t        j                  d d       t        dd        t        d       t        d        t        |       t        d d       | j                          yy)zBloquer les achatsT
P================================================================================u#   🛑 BLOCAGE AUTOMATIQUE DES ACHATSzTimestamp: u*   🛑 PROTECTION ACTIVÉE - ACHATS BLOQUÉSN)
r   r   r   r:   r;   r   r/   criticalprintr>   )r    r   s     r!   r{   zMarketSafety._block_trading   s    "DO &D#+<<>#;#;#=D OObM*OOACOOvh(OOF#OOk$*>*>)?@AOOvhbM*Bvh- >@VH&MVHB-  r#   c                 V   | j                   rd}| j                  rH	 t        j                  | j                        }t        j                         |z
  j                         dz  }t        j                  dd        t        j                  d       t        j                  d        t        j                  |rd|ddnd	       t        j                  d
       t        j                  d d       t        d       d| _         d| _	        d| _        | j                          yy#  Y xY w)u   Débloquer les achatsN<   r   r   u%   ✅ DÉBLOCAGE AUTOMATIQUE DES ACHATSu   Durée du blocage: rx   z minutesu   Durée inconnueu   Marché redevenu stableu1   
✅ Protection désactivée - Achats autorisés
F)r   r   r   rX   r:   rz   r/   infor   r   r>   )r    duration
blocked_ats      r!   r|   zMarketSafety._unblock_trading  s    ??H##!)!7!78L8L!MJ ( ;JJLrQH KK"VH&KK?AKK6($KK-hs^8DVghKK13KK6("&GI#DO $D#'D ) s   AD$ $D(c                 $    | j                          y)u!   Forcer le déblocage manuellementN)r|   r   s    r!   force_unblockzMarketSafety.force_unblock   s    r#   c                 `    | j                   | j                  | j                  | j                  dS )zObtenir le statut actuel)r   r   blocked_sincer   )r   r   r   r   r   s    r!   
get_statuszMarketSafety.get_status$  s.     //''!11//	
 	
r#   N)rw   )rI   )F)__name__
__module____qualname____doc__r"   r   r>   rf   ru   r   r{   r|   r   r    r#   r!   r   r      s=    S,DB<|/b@D&0 
r#   r   c                  .    t         
t               a t         S )z,Obtenir l'instance singleton de MarketSafety)_safety_instancer   r   r#   r!   get_market_safetyr   1  s     '>r#   )r   r+   r   r   r   collectionsr   logging	getLoggerr   r/   r   r   r   r   r#   r!   <module>r      sG     	 (  			8	$\
 \
@	  r#   