
    i/                        d Z ddlZddlZddlmZ ddlmZmZmZmZ ddl	Z	 e	j                  e      Zd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*d+d,Zg d-Z G d. d/      Zdad0efd1Zd2ed0eeee   f   fd3ZeZd4 Zd2ed0efd5Zed6k(  r e       Z ed7        ed8 ee              ej9                         D ]  \  ZZ ed9e d:e          ed;ej>                          g d<Z  ed=       e D ].  Z!ej+                  e!      \  Z"Ze"rd>e d?nd@Z# edAe! d:e#        0 ejI                         Z% edBe%        yy)Cu3  
Blacklist Manager - Gestionnaire Simplifié de Blacklist
=========================================================
Exclut uniquement les STABLECOINS et cryptos basées sur des notions monétaires.
Le reste de l'analyse des performances est géré par le script IA.

Auteur: AI Trading Bot
Date: 29/12/2025
    N)datetime)DictListTupleOptionalzdynamic_blacklist.jsonUSDCUSDTzStablecoin - USD CoinBUSDUSDTzStablecoin - Binance USDDAIUSDTzStablecoin - DAITUSDUSDTzStablecoin - TrueUSDUSDPUSDTzStablecoin - Pax Dollar	FDUSDUSDTzStablecoin - First Digital USD	PYUSDUSDTzStablecoin - PayPal USDFRAXUSDTzStablecoin - FraxLUSDUSDTzStablecoin - Liquity USDUSTCUSDTzStablecoin - TerraClassicUSDEURUSDTzDevise fiat - EuroGBPUSDTzDevise fiat - Livre sterlingPAXGUSDTu&   Or tokenisé - volatilité trop faibleXAUTUSDTu   Or tokenisé Tether GoldWBTCUSDTu$   Wrapped Bitcoin - préférer BTCUSDT	WBETHUSDTzWrapped Beacon ETH	STETHUSDTu   Staked ETH - préférer ETHUSDTzCoinbase Wrapped Staked ETHu$   Rocket Pool ETH - préférer ETHUSDTzBinance Staked ETHz#Luna Classic - balance insuffisante)	CBETHUSDTRETHUSDTBETHUSDTLUNCUSDT)BTCUSDTETHUSDTBNBUSDTSOLUSDTXRPUSDTADAUSDTDOGEUSDTc                       e Zd ZdZddefdZd Zd Zd Zdede	e
ee   f   fd	Zdded
efdZdede
fdZdeeef   fdZdeeef   fdZdefdZdefdZdefdZdefdZdded
edefdZdefdZdefdZy)BlacklistManageruK   Gestionnaire de blacklist simplifié - Focus sur stablecoins et monétairestrade_history_filec                     || _         t        | _        i | _        t	        t
              | _        | j                          | j                          y )N)	r&   BLACKLIST_FILEblacklist_file	blacklistlistPERMANENT_WHITELIST	whitelistload_blacklist_init_permanent_blacklist)selfr&   s     ./dynamic_blacklist.py__init__zBlacklistManager.__init__J   s>    "4,*,$()<$=&&(    c                     t         j                         D ]N  \  }}|| j                  vsdt        j                         j                         |d|v rdndd| j                  |<   P | j                          y)z8Initialiser la blacklist avec les stablecoins permanentsT
Stablecoin
stablecoinmonetary	permanentsincereasoncategoryN)PERMANENT_BLACKLISTitemsr*   r   now	isoformatsave_blacklistr0   symbolr;   s      r1   r/   z*BlacklistManager._init_permanent_blacklistR   sl    1779 	NFFT^^+!%%\\^557$0<0FJ	*v&	 	r3   c                 :   	 t         j                  j                  | j                        r/t	        | j                  d      5 }t        j                  |      }|j                  di       }t        |t              rt        j                  d       i | _        |j                  di       }|D ]M  }||v r||   | j                  |<   dt        j                         j                         ddd| j                  |<   O n|| _        |j                  d	t        t                     | _        t        j                  d
t%        | j                         d       ddd       yy# 1 sw Y   yxY w# t&        $ r)}t        j)                  d|        i | _        Y d}~yd}~ww xY w)z&Charger la blacklist depuis le fichierrr*   u4   ⚠️ Conversion de l'ancien format array vers dictdetailsFzPerformance insuffisantemanualr8   r-   u   ✅ Blacklist chargée: z symboles exclusNu!   ❌ Erreur chargement blacklist: )ospathexistsr)   openjsonloadget
isinstancer+   loggerinfor*   r   r?   r@   r,   r-   len	Exceptionerror)r0   fdatablacklist_datarF   rC   es          r1   r.   zBlacklistManager.load_blacklist^   sd   	 ww~~d112$--s3 bq99Q<D%)XXk2%>N!.$7$Z[)+"&((9b"9&4 	"F%09@v 6 27-5\\^-E-E-G.H08	:"v 6		" *8%)XXk4@S;T%UDNKK":3t~~;N:OO_ `a1b b 3b b2  	 LL<QC@ADNN	 s7   A E( DEE( E%!E( %E( (	F1FFc                    	 | j                   | j                  t        j                         j	                         dt        | j                   j                         D cg c]  \  }}|j                  d      s| c}}      t        | j                   j                         D cg c]  \  }}|j                  d      r| c}}      dd}t        | j                  d      5 }t        j                  ||dt               ddd       yc c}}w c c}}w # 1 sw Y   yxY w# t        $ r"}t        j                  d	|        Y d}~yd}~ww xY w)
z(Sauvegarder la blacklist dans le fichieruE   Blacklist simplifiée - Stablecoins et cryptos monétaires uniquementr9   )descriptionpermanent_countmanual_count)r*   r-   last_updaterQ   w   )indentdefaultNu!   ❌ Erreur sauvegarde blacklist: )r*   r-   r   r?   r@   rR   r>   rN   rK   r)   rL   dumpstrrS   rP   rT   )r0   kvrV   rU   rX   s         r1   rA   zBlacklistManager.save_blacklist   s   	B!^^!^^'||~779#j'*$..:N:N:P+g$!QTUTYTYZeTfA+g'h$'t~~7K7K7M(htq!UVUZUZ[fUg(h$i		D d))3/ :1		$!S9: :	 ,h(h: : 	BLL<QC@AA	Bs`   AD" D
6D
:)D" #D=D"D" #DD" 
D" DD" D" "	E+EErC   returnc                     || j                   v ry|t        v rdt        |   fS || j                  v r#| j                  |   }d|j                  dd      fS y)u'   Vérifier si un symbole est blacklisté)FNTr;   u   Blacklisté manuellement)r-   r=   r*   rN   )r0   rC   rQ   s      r1   is_blacklistedzBlacklistManager.is_blacklisted   se     T^^# ((,V444 T^^#>>&)D(,FGGGr3   r;   c                    || j                   v rt        j                  d| d       ydt        j                         j                         |dd| j                  |<   | j                          t        j                  d| d|        y)	u/   Ajouter manuellement un symbole à la blacklist   ⚠️ z1 est dans la whitelist, impossible de blacklisterFrG   r8   u   🚫 u    ajouté à la blacklist: T)	r-   rP   warningr   r?   r@   r*   rA   rQ   rB   s      r1   add_to_blacklistz!BlacklistManager.add_to_blacklist   s    T^^#NNWVH,]^_ \\^--/ 	"
v 	eF8#=fXFGr3   c                     |t         v rt        j                  d| d       y|| j                  v r7| j                  |= | j	                          t        j                  d| d       yy)z4Retirer un symbole de la blacklist (sauf permanents)rj   u>    est un stablecoin/monétaire permanent, impossible de retirerF   ✅ u    retiré de la blacklistT)r=   rP   rk   r*   rA   rQ   r0   rC   s     r1   remove_from_blacklistz&BlacklistManager.remove_from_blacklist   sd    ((NNWVH,jklT^^#v&!KK$vh&>?@r3   c                     | j                   S )u    Retourner la blacklist complète)r*   r0   s    r1   get_blacklistzBlacklistManager.get_blacklist   s    ~~r3   c                     t         S )u9   Retourner la liste des stablecoins/monétaires permanentsr=   rr   s    r1   get_permanent_blacklistz(BlacklistManager.get_permanent_blacklist   s    ""r3   c                    || j                   vr~| j                   j                  |       || j                  v r+| j                  |   j                  d      s| j                  |= | j	                          t
        j                  d| d       yy)u5   Ajouter à la whitelist (protection contre blacklist)r9   rn   u    ajouté à la whitelistN)r-   appendr*   rN   rA   rP   rQ   ro   s     r1   add_to_whitelistz!BlacklistManager.add_to_whitelist   su    'NN!!&)'v0F0J0J;0WNN6*!KK$vh&>?@ (r3   c                     || j                   v rN|t        vrE| j                   j                  |       | j                          t        j                  d| d       yyy)zRetirer de la whitelistrn   u    retiré de la whitelistN)r-   r,   removerA   rP   rQ   ro   s     r1   remove_from_whitelistz&BlacklistManager.remove_from_whitelist   sS    T^^#6I(INN!!&)!KK$vh&>?@ )J#r3   c                 .   d}g }| j                   j                         D ]1  \  }}|j                  d      r|t        vs!|j	                  |       3 |D ]  }| j                   |= |dz  } | j                          t        j                  d| d       |S )u=   Vider uniquement les entrées manuelles (pas les permanentes)r   r9      u   🗑️ u/    entrées manuelles supprimées de la blacklist)r*   r>   rN   r=   rx   rA   rP   rQ   )r0   count	to_removerC   rQ   s        r1   clear_manual_blacklistz'BlacklistManager.clear_manual_blacklist   s    	 NN002 	)LFD88K(V;N-N  (	)   	Fv&QJE	 	hug%TUVr3   c           	         t        | j                  j                         D cg c]  \  }}|j                  d      s| c}}      }t        | j                  j                         D cg c]  \  }}|j                  d      r| c}}      }t        | j                        ||t        | j                        t        t
              dS c c}}w c c}}w )z*Retourner les statistiques de la blacklistr9   )totalr9   rG   r-   stablecoins)rR   r*   r>   rN   r-   r=   )r0   rd   re   r9   rG   s        r1   	get_statszBlacklistManager.get_stats   s    t~~';';'=Ttq!{ASTU	DNN$8$8$:UDAq!%%BTaUV ("T^^,23
 	
 UUs   C
C
+C
C
hoursc                 &    | j                  ||      S )u$   Compatibilité - Ajoute manuellement)rl   )r0   rC   r;   r   s       r1   force_blacklistz BlacklistManager.force_blacklist   s    $$VV44r3   c                 $    | j                  |      S )u'   Compatibilité - Retire de la blacklist)rp   ro   s     r1   force_unblacklistz"BlacklistManager.force_unblacklist   s    ))&11r3   c                 "    | j                         S )u,   Compatibilité - Vide les entrées manuelles)r   rr   s    r1   clear_blacklistz BlacklistManager.clear_blacklist   s    **,,r3   N)ztrade_history.json)zAjout manuel)   )__name__
__module____qualname____doc__rc   r2   r/   r.   rA   r   boolr   rh   rl   rp   r   dictrs   rv   ry   r|   intr   r   r   r   r    r3   r1   r%   r%   G   s    U)3 )
 BB$S U4#3F-G "s C  C D tCI #c3h #As AAC A  
4 
5c 53 5s 52 2- -r3   r%   rf   c                  .    t         
t               a t         S )z8Retourne l'instance globale du gestionnaire de blacklist)_blacklist_managerr%   r   r3   r1   get_blacklist_managerr     s     !-/r3   rC   c                 4    t               j                  |       S )u@   Fonction utilitaire pour vérifier si un symbole est blacklisté)r   rh   rC   s    r1   rh   rh     s     "11&99r3   c                  V    t               } | j                          | j                         S )uB   Fonction de compatibilité - réinitialise la blacklist permanente)r   r/   r   )managers    r1   update_dynamic_blacklistr     s%    #%G%%'r3   c                     | t         v S )u)   Vérifier si un symbole est un stablecoinru   r   s    r1   is_stablecoinr     s    (((r3   __main__z === Blacklist Manager - Test ===u%   
Stablecoins/Monétaires permanents: u     🚫 z: u   
Whitelist protégée: )r   r   r   r    z
Tests:u   🚫 BLACKLISTÉ ()u   ✅ OKz  z
Statistiques: )&r   rL   rH   r   typingr   r   r   r   logging	getLoggerr   rP   r(   r=   r,   r%   r   r   rc   r   rh   is_symbol_blacklistedr   r   r   printrR   r>   rC   r;   r-   test_symbolssymis_blstatusr   statsr   r3   r1   <module>r      s    	  . . 			8	$ *' * !	
 & ) 1 * # * . # -$ 8%& *', 6-. %/0 212 /6$ 6= D y- y-z  / :3 :5x})<#= : ' )# )$ )
 z#%G	
,-	237J3K2L
MN-335 ,xr&*+, 
$W%6%6$7
89 BL	* $..s3v38%fXQ/h3%r&"#$
 E	UG
$%) r3   