
    i             	       ~   d Z ddlZddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlZddlZddlmZ ddlmZ ej(                  j+                  ej(                  j-                  e            Zej(                  j3                  ed      Z G d	 d
      Z ee      e_        ej8                  e_        	 ddlZddlZddl& 	 ddl'm(Z( dZ)	 ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 dZ1	 ddl2m3Z3m4Z4 dZ5	 ddl6m7Z7 dZ8	 ddl9m:Z: dZ; G d  d!      Z< e<       Z= G d" d#      Z> G d$ d%      Z?ej(                  j+                  ej(                  j-                  e            Z G d& d'      Z@ G d( d)      ZAd* ZBeCd+k(  r eB        yy# e $ rG ddl!Z!dZ"ejF                  dk(  rdZ" e!jH                  ejJ                  dddddge"       ddlZddlZY w xY w# e $ r dZ) e*d       Y w xY w# e $ r dZ1dZ0 e*d       Y w xY w# e $ r dZ5 e*d       Y w xY w# e $ r dZ8 e*d       Y ,w xY w# e $ r dZ; e*d       Y 9w xY w),u   
Bot de Trading Crypto avec Ordres Automatiques
===============================================
⚠️ ATTENTION: Ce bot peut passer des ordres RÉELS si TESTNET_MODE = False
Commencer TOUJOURS en mode TESTNET !
    N)datetime)deque)	urlencode)get_market_safety)get_pattern_managerztrading_bot.logc                   *    e Zd ZdZddZd Zd Zd Zy)
FileLoggeruL   Redirige stdout vers fichier uniquement (évite les erreurs Unicode Windows)c                    || _         |dz  dz  | _        | j                          t        |ddd      | _        | j                  j                  dd d       | j                  j                  dt        d	      j                  j                         j                          d
       | j                  j                  d d       | j                  j                          y )Ni   autf-8   )encoding	buffering
zP================================================================================u   === NOUVELLE SESSION — r   z ===
z

)filenamemax_size_rotate_if_neededopenlogwrite
__import__r   now	isoformatflush)selfr   max_size_mbs      trading_bot.py__init__zFileLogger.__init__%   s     #d*T1 #1EF82'2:j3I3R3R3V3V3X3b3b3d2eeklm&'    c                    	 t         j                  j                  | j                        rt         j                  j	                  | j                        | j
                  kD  rd| j                  dz   }t         j                  j                  |      rt        j                  |       t        j                  | j                  |       yyy#  Y yxY w)u+   Rotation si le fichier dépasse max_size_mbz.prevN)ospathexistsr   getsizer   removerename)r   backups     r   r   zFileLogger._rotate_if_needed1   s    	ww~~dmm,1ORVR_R_1_077>>&)IIf%		$--0	 2`,
	s   CC Cc                 ~    	 | j                   j                  |       | j                   j                          y #  Y y xY wN)r   r   r   )r   messages     r   r   zFileLogger.write<   s/    	HHNN7#HHNN	s   58 <c                 H    	 | j                   j                          y #  Y y xY wr)   )r   r   r   s    r   r   zFileLogger.flushC   s    	HHNN	s    !N)2   )__name__
__module____qualname____doc__r   r   r   r    r   r   r	   r	   #   s    V
	r   r	   win32i   z-mpipinstall
websocketsrequests)creationflags)*)get_trade_loggerTFu)   ⚠️ Module trade_logger non disponible)get_ai_predictorget_surveillance_serviceAIPredictorget_smart_rotationSMART_ROTATION_AVAILABLEu)   ⚠️ Module ai_predictor non disponible)get_sell_predictorAISellPredictoru.   ⚠️ Module ai_sell_predictor non disponible)MarketRegimeDetectoru*   ⚠️ Module market_regime non disponible)get_freqai_manageru/   ⚠️ Module freqai_integration non disponiblec                   *    e Zd ZdZd Zd Zd ZddZy)CurrencyConverterz Convertisseur USD/EUR avec cachec                 ^    d| _         d| _        d| _        t        dk(  rd| _        y d| _        y )N      ?r   ,  EUR   €$)ratelast_updateupdate_intervalDISPLAY_CURRENCYsymbolr,   s    r   r   zCurrencyConverter.__init__   s-    	"/58ecr   c                 T   t         dk7  rd| _        yt        j                         | j                  z
  | j                  k  ry	 t        j                  dddid      }|j                         }d	t        |d
         z  | _        t        j                         | _        y#  d| _        Y yxY w)u   Met à jour le taux EUR/USDrI   rG   Nz+https://api.binance.com/api/v3/ticker/pricerP   EURUSDT   paramstimeoutr   priceffffff?)	rO   rL   timerM   rN   r7   getjsonfloat)r   responsedatas      r   update_ratezCurrencyConverter.update_rate   s    u$DI99;)))D,@,@@
	||$Q+3Y*?LH==?DE$w-00DI#yy{D	DIs   AB 	B'c                 @    | j                          || j                  z  S )z#Convertit USD en devise d'affichage)r_   rL   )r   
usd_amounts     r   convertzCurrencyConverter.convert   s    DII%%r   c                 z    | j                  |      }|dk(  r|d| j                   S |d| d| j                   S )z(Formate un montant en devise d'affichager   z,.0fz,.f)rb   rP   )r   ra   decimals	converteds       r   formatzCurrencyConverter.format   sK    LL,	q=%dkk]33Bxj>*4;;-88r   N)   )r.   r/   r0   r1   r   r_   rb   rg   r2   r   r   rE   rE      s    *B*&
9r   rE   c                       e Zd ZdZdZdZddZd Zd ZddZ	d Z
dd	Zd
 Zd ZddZddZd Zd Zd Zd Zd Z	 	 ddZd Zd Zd Zd Zd Zd dZy)!BinanceClientz Client pour l'API Binance (Spot)r   c                     || _         || _        || _        |rd| _        t	        d       nd| _        t	        d       | j                          y )Nzhttps://testnet.binance.visionu$      📡 Mode TESTNET (argent fictif)zhttps://api.binance.comu(      ⚠️ Mode PRODUCTION (argent réel))api_key
api_secrettestnetbase_urlprint_sync_server_time)r   rl   rm   rn   s       r   r   zBinanceClient.__init__   sH    $<DM895DM<= 	 r   c                    	 t        j                  | j                   dd      }|j                         d   }t	        t        j
                         dz        }||z
  t        _        t        j
                         t        _        t        t        j                        dkD  rt        dt        j                   d       yy# t        $ r#}t        d	|        d
t        _        Y d}~yd}~ww xY w)z4Synchronise l'horloge locale avec le serveur Binancez/api/v3/timerS   )rV   
serverTime    u)      ⏰ Horloge synchronisée (décalage: zms)u1      ⚠️  Impossible de synchroniser l'horloge: r   N)r7   rZ   ro   r[   intrY   rj   TIME_OFFSET
_last_syncabsrp   	Exception)r   r]   server_time
local_timees        r   rq   zBinanceClient._sync_server_time   s    
	*||t}}o\$BANH"--/,7KTYY[4/0J(3j(@M%'+yy{M$=,,-3A-B[B[A\\_`a 4 	*EaSIJ()M%%	*s   B;B? ?	C+C&&C+c                     t        |      }t        j                  | j                  j	                  d      |j	                  d      t
        j                        j                         }|S )u#   Signe une requête avec HMAC SHA256r   )r   hmacnewrm   encodehashlibsha256	hexdigest)r   rU   query_string	signatures       r   _signzBinanceClient._sign   sU     (HHOO""7+(NN
 )+	 	
 r   Nc                    | j                    | }d| j                  i}|i }|rt        j                         t        j                  z
  dkD  r| j                          t        t        j                         dz        t        j                  z   |d<   d|d<   | j                  |      |d<   	 |d	k(  rt        j                  |||d
      }n=|dk(  rt        j                  |||d
      }n|dk(  rt        j                  |||d
      }j                         }d|v r-|d   dk  r$|d   dv r
t        d|d    d       | j                          |rZt        t        j                         dz        t        j                  z   |d<   |j                  dd       | j                  |      |d<   |d	k(  rt        j                  |||d
      }n=|dk(  rt        j                  |||d
      }n|dk(  rt        j                  |||d
      }|j                         }d|v r|d   dk  rt        d|d           y|S t        d|d           y|S # t         $ r}	t        d|	        Y d}	~	yd}	~	ww xY w)u   Effectue une requête APIzX-MBX-APIKEYNrH   rt   	timestampi'  
recvWindowr   GET   )rU   headersrV   POSTDELETEcoder   )iiu      ⏰ Erreur timestamp (z), re-synchronisation...u#      ❌ Erreur API (après resync): msgu      ❌ Erreur API: u      ❌ Erreur requête: )ro   rl   rY   rj   rx   rq   rv   rw   r   r7   rZ   postdeleter[   rp   poprz   )
r   methodendpointrU   signedurlr   r]   r^   r}   s
             r   _requestzBinanceClient._request   sV   z*!4<<0>Fyy{]555;&&( #&diikD&8"9M<U<U"UF;#(F< "&**V"4F;(	#<<FGUWX6!#==VWVXY8##??3vwXZ[==?D~$v,"2<>15d6l^C[\]**,.1$))+2D.EHaHa.a{+

;5.2jj.@{+#+<<FG]_#`6)#+==VW^`#a8+#+??3vw`b#c#==?D~$v,*: CDK=QR#K+DK=9:K 	,QC01	s+   +F	I 5I 7I 	I 	I,I''I,c                 *    | j                  ddd      S )u%   Récupère les informations du compter   z/api/v3/accountTr   r   r,   s    r   get_accountzBinanceClient.get_account(  s    }}U$5d}CCr   c                     | j                         }|r>|j                  dg       D ])  }|d   |k(  st        |d         t        |d         dc S  dddS )u   Récupère le solde d'un assetbalancesassetfreelocked)r   r   r   )r   rZ   r\   )r   r   accountbalances       r   get_balancezBinanceClient.get_balance,  sj    ""$";;z26 7#u, %gfo 6"'(9":  Q''r   c                 N    | j                  ddd|i      }|rt        |d         S y)u   Récupère le prix actuelr   /api/v3/ticker/pricerP   rW   Nr   r\   r   rP   r^   s      r   	get_pricezBinanceClient.get_price:  s/    }}U$:Xv<NOg''r   c                 x    | j                  dd      }|r |D ci c]  }|d   t        |d          c}S i S c c}w )uE   Récupère tous les prix en une seule requête (beaucoup plus rapide)r   r   rP   rW   r   )r   r^   items      r   get_all_priceszBinanceClient.get_all_pricesA  sD    }}U$:;EIJTDNE$w-$88JJ	 Ks   7c                 4    |||d}| j                  dd|      S )u"   Récupère les bougies historiquesrP   intervallimitr   z/api/v3/klinesr   )r   rP   r   r   rU   s        r   
get_klineszBinanceClient.get_klinesH  s"    "5I}}U$4f==r   c                 t   ddl }t        | d      si | _        i | _        | d| d| }|rO|| j                  v rA|j                         | j                  j	                  |d      z
  }||k  r| j                  |   S 	 ddl}	d}
|||d}|	j	                  |
|d      }|j                  d	k(  r\|j                         }t        |t              r<t        |      dkD  r.|| j                  |<   |j                         | j                  |<   |S || j                  v r| j                  |   S y# t        $ r
}Y d}~,d}~ww xY w)
u'  
        Récupère les klines depuis l'API PRODUCTION (publique).
        Le testnet n'a souvent pas assez de données de trading.
        cache_ttl: durée de validité du cache en secondes (60s par défaut,
                   utiliser 20-30s pour les checks de validation pré-achat)
        r   N_klines_cache_z%https://api.binance.com/api/v3/klinesr   r   rT      )rY   hasattrr   _klines_cache_timerZ   r7   status_coder[   
isinstancelistlenrz   )r   rP   r   r   	use_cache	cache_ttl_time	cache_key	cache_agereqr   rU   respr^   r}   s                  r   get_klines_productionz#BinanceClient.get_klines_productionM  sE    	 t_-!#D&(D#haz5'2	 d&8&88

t'>'>'B'B9a'PPI9$)))44	"9C &HuMF773vr7:D3&yy{dD)c$i!m48D&&y19>D++I6K
 ***%%i00  		s   ;B
D$ $	D72D7c                 l    | j                  ddd|i      }|rd|v rt        |d         dkD  r|d   d   S y)u4   Récupère les infos d'un symbole (précision, etc.)r   z/api/v3/exchangeInforP   symbolsr   N)r   r   r   s      r   get_symbol_infozBinanceClient.get_symbol_infow  sF    }}U$:Xv<NOI%#d9o*>*B	?1%%r   c                     | j                  |      }|rZ|j                  dg       D ]E  }|d   dk(  s|d   }d|v r0t        |j                  d      j	                  d      d         }|c S  y y)	u5   Récupère la précision de quantité pour un symbolefilters
filterTypeLOT_SIZEstepSize.0r   r   )r   rZ   r   rstripsplit)r   rP   inford   	step_sizere   s         r   get_quantity_precisionz$BinanceClient.get_quantity_precision~  s~    ##F+XXi, \?j0 !*Ii'#&y'7'7'<'B'B3'G'J#K' r   c                 t    | j                  |      }d|z  }t        ||z        |z  }|dk(  rt        |      S |S )u3   Formate la quantité selon la précision du symbole
   r   )r   rv   )r   rP   quantity	precisionfactor	formatteds         r   format_quantityzBinanceClient.format_quantity  sF    //7	y6)*V3	>y>!r   c                 P   | j                  |      }ddddd}|r|j                  dg       D ]v  }|d   dk(  r=t        |j                  dd            |d	<   t        |j                  d
d            |d<   H|d   dk(  s	|d   dk(  sYt        |j                  dd            |d<   x |S )u|  
        Récupère les contraintes minimales pour un ordre (LOT_SIZE, MIN_NOTIONAL)
        
        Returns:
            dict: {
                'min_qty': quantité minimum,
                'step_size': pas de quantité,
                'min_notional': valeur minimum en USDT,
                'can_trade': True si on peut trader avec position_size donné
            }
        r   rS   T)min_qtyr   min_notional	can_trader   r   r   minQtyr   r   r   NOTIONALMIN_NOTIONALminNotionalr   )r   rZ   r\   )r   rP   r   resultrd   s        r   get_min_order_sizez BinanceClient.get_min_order_size  s     ##F+	
 XXi, L\?j0(-aeeHa.@(AF9%*/j!0D*EF;'|_
2ao6W-21553J-KF>*L r   c                     	 | j                  |      }|r|dk  ry| j                  |      }||d   k  rdd| d|d    dfS ||z  }||d   k  rdd	|d
d|d    fS y# t        $ r}dd| fcY d}~S d}~ww xY w)u   
        Vérifie si on peut trader un symbole avec le montant donné
        
        Returns:
            tuple: (can_trade: bool, reason: str or None)
        r   )FzPrix non disponibler   FzMontant u   € < min_notional rJ   r   u
   Quantité .8fz < min_qty )TNu   Erreur vérification: N)r   r   rz   )r   rP   usdt_amountrW   constraintsestimated_qtyr}   s          r   can_trade_symbolzBinanceClient.can_trade_symbol  s    	7NN6*EEQJ311&9K [885HUcIdHeehiii (%/M {955
=*=[U^I_H`aaa 	721#666	7s(   A &A A 	A8'A3-A83A8c                    |||d}|rEt        |t              rt        |      |d<   n/|dj                  d      j                  d      |d<   n	|r|d|d<   |dk(  rd	|d
<   |d|d<   |r|d|d<   | j	                  dd|d      S )u  
        Crée un ordre
        
        Args:
            symbol: Paire (ex: BTCUSDT)
            side: BUY ou SELL
            order_type: MARKET, LIMIT, STOP_LOSS_LIMIT, TAKE_PROFIT_LIMIT
            quantity: Quantité en base asset (ex: 0.001 BTC)
            quote_quantity: Quantité en quote asset (ex: 100 USDT)
            price: Prix limite
            stop_price: Prix de déclenchement pour stop orders
        )rP   sidetyper   r   r   r   .2fquoteOrderQtyLIMITGTCtimeInForcerW   	stopPricer   /api/v3/orderTr   )r   rv   strr   r   )	r   rP   r   
order_typer   quote_quantityrW   
stop_pricerU   s	            r   create_orderzBinanceClient.create_order  s     
 (C(%(]z"(0~%=%=c%B%I%I#%Nz")7(<F?# $)F=!!&sF7O%/$4F;}}V_fT}JJr   c                 ,    | j                  |dd|      S )u(   Achat au marché avec un montant en USDTBUYMARKET)r   r   )r   rP   r   s      r   
market_buyzBinanceClient.market_buy  s       UUr   c                 ,    | j                  |dd|      S )u   Vente au marchéSELLr   )r   r   )r   rP   r   s      r   market_sellzBinanceClient.market_sell  s      H MMr   c                 .    | j                  |dd||      S )zAchat limiter   r   r   rW   r   r   rP   r   rW   s       r   	limit_buyzBinanceClient.limit_buy  s      (RW XXr   c                 .    | j                  |dd||      S )zVente limiter   r   r  r   r  s       r   
limit_sellzBinanceClient.limit_sell  s      8SX YYr   c                 6    ||d}| j                  dd|d      S )zAnnule un ordre)rP   orderIdr   r   Tr   r   )r   rP   order_idrU   s       r   cancel_orderzBinanceClient.cancel_order  s#    "x8}}Xt}LLr   c                 >    i }|r||d<   | j                  dd|d      S )u   Récupère les ordres ouvertsrP   r   z/api/v3/openOrdersTr   r   )r   rP   rU   s      r   get_open_orderszBinanceClient.get_open_orders  s,    %F8}}U$8&}NNr   ) r  T)NF)USDT)5md   )r  r  T<   )NNNNr)   )r.   r/   r0   r1   rw   rx   r   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r2   r   r   rj   rj      s    * KJ!*:|D
(>
(T	<7> ?CAE$KLVNYZM
Or   rj   c                       e Zd Zedd       Zed        Zedd       Zedd       Zedd       Zedd       Z	edd       Z
edd       Zedd	       Zedd
       Zedd       Zedd       Zy)TechnicalIndicatorsc                    t        |       |dz   k  ry t        j                  | t              } t        j                  |       }t        j
                  |dkD  |d      }t        j
                  |dk  | d      }t        j                  || d        }t        j                  || d        }|dk(  r|dk(  ry|dk(  ry|dk(  ry||z  }ddd|z   z  z
  S )Nr   dtyper   g      I@g     Q@g      >@r  )r   nparrayr\   diffwheremean)pricesperioddeltasgainslossesavg_gainavg_lossrss           r   rsizTechnicalIndicators.rsi  s    v;!#&.!VQ/&1*vgq1775&?+7766'(+,
 q=X]q=q= cQVn%%r   c                 n    t        |       |k  ry d|dz   z  }| d   }| dd  D ]  }||z  |d|z
  z  z   } |S )N   r   r   r   )r  r  
multiplieremarW   s        r   r*  zTechnicalIndicators.ema4  s\    v;&1*%
QiABZ 	BE:%#Z*@AC	B
r   c                     t        |       |k  ryt        j                  | | d        } t        j                  |       }t        j                  |       }|||z  z   ||||z  z
  fS )NNNN)r   r  r  r  std)r  r  std_devsmar-  s        r   	bollingerzTechnicalIndicators.bollinger>  sa    v;#&&*+ggfoffVngm$c3'C-+@@@r   c                 R    t        |       |dz   k  ry| d   | |    z
  | |    z  dz  S )u1   Calcule le momentum (variation % sur la période)r   Nr  r(  )r  r  s     r   momentumzTechnicalIndicators.momentumG  s<     v;!#ffWo-@CGGr   c                 T   t        |       |k  ryt        j                  | |      }t        j                  | |      }|r|sy||z
  |z  dz  }| dd }t        |      dk\  r|d   |d   z
  |d   z  dz  }nd}t        dt	        |dz        t	        |dz        z         }|dkD  rd	nd
}	||	fS )z&Mesure la force de la tendance (0-100))NNr  NrS   r2  r   r   bullishbearish)r   r  r*  minry   )
r  short_periodlong_period	ema_shortema_longspreadrecent_pricesslopestrength	directions
             r   trend_strengthz"TechnicalIndicators.trend_strengthN  s     v;$ (++FLA	&**6;? x'83s: rs}""2&q)99]1=MMPSSEE sC,s519~=>!'!I	""r   c                     t        |       |dz   k  ryt        j                  | |      }|sy| d   }| d   }t        ||z
        |z  dk  }||kD  }||z
  |z  dz  }|xr ||fS )uJ   Détecte un pullback dans une tendance haussière (opportunité d'entrée)rS   Fr   r2  {Gzt?r  )r   r  r*  ry   )r  
ema_periodr*  current_price
prev_priceprice_near_ema	was_abovedistance_pcts           r   pullback_detectionz&TechnicalIndicators.pullback_detectionk  s     v;a'!%%fj9r
BZ
 ]S01C7%?$	 ',3s:+)\99r   c                 @   t        |       |dz   k  ryt        j                  | ||      \  }}}t        j                  | dd ||      \  }}}t        ||||g      sy||z
  |z  dz  }	||z
  |z  dz  }
|r||z
  |z  dz  n|
}|	dkD  rd}n
|	dk  rd	}nd
}|
|dz  kD  }|||	fS )z|Analyse la tendance des bandes de Bollinger
        Retourne: direction ('up', 'down', 'flat'), bandwidth expansion
        rS   r,  Nr  333333?up333333ӿdownflat?)r   r  r0  all)r  r  r.  bb_upperbb_midbb_lowerbb_upper_prevbb_mid_prevbb_lower_prev	mid_slope	bandwidthbandwidth_prevrA  	expansions                 r   bollinger_trendz#TechnicalIndicators.bollinger_trend  s    
 v;!## &9%B%B66SZ%["&(4G4Q4QRXY\Z\R]_egn4o1{MHfh<=# {*k9S@	 (F2S8	P[--7;FLajs?III 55	)Y..r   c           	         t        |       |dz   k  ryt        j                  | ||      \  }}}t        |||g      r|dk(  ry||z
  |z  dz  }g }t	        dt        dt        |                   D ]M  }	t        j                  |	dkD  r| d|	  n| ||      \  }
}}|s,|dkD  s2|
|z
  |z  dz  }|j                  |       O |sd|ddfS t        |      t        |      z  }||k  xs ||dz  k  }|dkD  r t        dt        dd	||z  z
  dz              }nd}| d
   }t        |       d	kD  r| d   n|}d}|s|dkD  r||kD  r||kD  rd}n||k  r||k  rd}||||fS )u3  Détecte un Bollinger Squeeze (compression des bandes = faible volatilité)
        Un squeeze précède souvent une explosion du prix (hausse ou baisse forte)
        
        Retourne: is_squeeze, bandwidth, squeeze_strength, breakout_direction
        - is_squeeze: True si les bandes sont compressées
        - bandwidth: largeur actuelle des bandes en %
        - squeeze_strength: 0-100, plus c'est haut plus le squeeze est serré
        - breakout_direction: 'up' si le prix commence à casser vers le haut, 'down' sinon, None si pas de breakout
        r   )Fr   r   Nr   r     NFffffff?r   r2  rE  rQ  rS  )	r   r  r0  rV  ranger8  appendsummax)r  r  r.  squeeze_thresholdrW  rX  rY  r^  
bandwidthsibb_ubb_mbb_lbwavg_bandwidth
is_squeezesqueeze_strengthrH  rI  breakout_directions                       r   bollinger_squeezez%TechnicalIndicators.bollinger_squeeze  s    v;"$$ &9%B%B66SZ%["&(Hfh/0FaK$ (F2S8	 
r3r3v;/0 	&A2<<APQEVCaR[W]_egnoD$qTkT)C/!!"%		& )Q,,J#j/9 !22Ui-RUBU6U
 1"1c#I4M0MQT/T&UV  r
#&v;?VBZ
!)B.v%-**D%)"'MJ,F%+"9&68JJJr   c                 j   t         j                  | |      }t         j                  | |      }t        |       |k\  rt         j                  | |      nd}t        ||g      syd}t        |       ||z   k\  r[t         j                  | d|  |      }t         j                  | d|  |      }	|r||z
  |z  dz  nd}
|	r||	z
  |	z  dz  nd}|
|z   dz  }nd}|rI||cxkD  r|kD  rn n|dk  rdd	|fS d
d|fS ||cxk  r|k  rn ndd|fS ||kD  r|dk  rdd|fS d
d|fS dd|fS ||kD  r|dk  rdd|fS d
d|fS dd|fS )zpAnalyse la configuration EMA
        Retourne: alignement ('bullish', 'bearish', 'mixed'), force, pente
        N)Nr   r   rh   r  r   r'  rR  r7  K   r6        r  r-   )r  r*  r   rV  )r  shortmidlongema_sema_mema_llookback
ema_s_prev
ema_m_prevema_s_slopeema_m_slope	avg_slopes                r   	ema_trendzTechnicalIndicators.ema_trend  s   
 $''6#''49<V9L#''5RVE5>" v;%(**,00
(1CUKJ,00
(1CSIJ HREJ.*<sBWXKGQEJ.*<sBWXK${2a7II u$u$t#$b)33 #y00&& #y00t#$b)33 "i// "i//u}t#$b)33 "i// "i//r   c                     t        |       |dz   k  ryt        | | dz
  d       }t        | | dz
  d       }| d   }| d   }||kD  r||k  r||z
  |z  dz  }d|fS y)u   Détecte un breakout au-dessus de la résistance
        Un breakout est quand le prix dépasse le plus haut des N dernières bougies
        r   rD  r2  rE  r  T)r   rh  r8  )r  r  historical_highhistorical_lowcurrentprevr@  s          r   breakout_detectionz&TechnicalIndicators.breakout_detection  s    
 v;!# ffWQYr23VVGAIb12*bz _$)@ ?2oELH>!r   c           	      6   t        |       |dz   k  ryg }t        | d      D ]a  }| |   }| |   }|t        |        kD  r| |dz
     n| |   }t        ||z
  t        ||z
        t        ||z
              }|j	                  |       c t        j                  |      S )u@   Average True Range - mesure de la volatilité pour trailing stopr   Nr   )r   re  rh  ry   rf  r  r  )r  r  trsrk  highlow
prev_closetrs           r   atrzTechnicalIndicators.atr&  s     v;!#w" 	A!9D)C()S[L(8!fQiJTCZTJ%6!7S:=M9NOBJJrN	 wws|r   c                     t        |       t        ||      dz   k  ryt        j                  | |      }|syt        j	                  | |      }|sy|||z  z   }|||z  z
  }|||fS )u2  Keltner Channels - Indicateur de volatilité et tendance
        
        Les bandes de Keltner utilisent l'ATR (volatilité réelle) au lieu de l'écart-type.
        Avantages vs Bollinger:
        - Moins de faux signaux (ATR filtre mieux le bruit)
        - Meilleure identification des vraies tendances
        - Breakouts plus fiables
        
        Retourne: (upper_band, middle_line, lower_band)
        - upper_band: EMA + (ATR × multiplicateur)
        - middle_line: EMA (ligne centrale)
        - lower_band: EMA - (ATR × multiplicateur)
        r   r,  )r   rh  r  r*  r  )r  rG  
atr_periodatr_multipliermiddler  upperlowers           r   keltner_channelsz$TechnicalIndicators.keltner_channels6  s     v;Z4q88# %((<# "%%fj9# #./#./fe##r   N)   )   r'  )r   )rS   r  )   )r  r'        @)r     c   )r  )r  r          @)r.   r/   r0   staticmethodr%  r*  r0  r3  rB  rM  ra  rt  r  r  r  r  r2   r   r   r  r    s    & &.   A A H H # #8 : :* / /@ 9K 9Kv 0& 0&d  (   $ $r   r  c                       e Zd ZdZej
                  j                  ed      Zej
                  j                  ed      Z	d Z
d ZddZd Zd	 Zd
 Zd ZeeddfdZddZd Zd Zd Zy)PositionManageru:   Gère les positions ouvertes avec stop-loss et take-profitpositions.jsonztrade_history.jsonc                 x    || _         i | _        g | _        d | _        d | _        d | _        | j                          y r)   )client	positionstrade_historytrade_loggerai_sell_predictormarket_regime
_load_data)r   r  s     r   r   zPositionManager.__init__e  s:     !%!r   c           	         	 t         j                  j                  | j                        rDt	        | j                  d      5 }t        j                  |      }d}d}|j                         D ]  \  }}t        j                  |d         |d<   |j                  dd      }|r|dv rt        d| d| d	       |d
z  }Q|j                  d      dk(  rt        d| d       |d
z  }zt        j                         |d   z
  j                         dz  }|| j                  |<   |d
z  }|dkD  st        d| d|dd        |dkD  rt        d| d       |dkD  rt        d| d       ddd       	 t         j                  j                  | j                         r^t	        | j                   dd      5 }t        j                  |      | _        ddd       t        dt%        | j"                         d       yy# 1 sw Y   xY w# t        $ r}	t        d|	        Y d}	~	d}	~	ww xY w# 1 sw Y   ]xY w# t        $ r}	t        d|	        Y d}	~	yd}	~	ww xY w) z=Charge les positions et l'historique depuis les fichiers JSONrr   r   patternUNKNOWN)Noner  r  nullu      ⚠️ Position u    ignorée (pattern invalide: 'z' - position corrompue)r   source
MARKET_SPYu      🔀 u6   : ignoré par le bot principal (géré par market_spy)     u      ⏰ Position z ancienne (.0fu    h) - sera vérifiée sur Binanceu      📂 u    position(s) restaurée(s)      🗑️ u!    position(s) corrompues ignoréesNu'      ⚠️ Erreur chargement positions: r   r   u      📜 z trade(s) dans l'historiqueu(      ⚠️ Erreur chargement historique: )r!   r"   r#   POSITIONS_FILEr   r[   loaditemsr   fromisoformatrZ   rp   r   total_secondsr  rz   HISTORY_FILEr  r   )
r   rd   r^   loaded_countskipped_countrP   posr  	age_hoursr}   s
             r   r  zPositionManager._load_datan  sl   *	Aww~~d112$--s3 &^q99Q<D $%L$%M'+zz| y+3+A+A#kBR+SK( #&'')Y"?&'5T*T!$7x?]^e]ff}"~)Q.M$
 778,<!HVH4j"kl)Q.M$%-\\^c+6F%F$U$U$WZ^$^	14v.$)$r>!$4VHK	RUVv"wx+y. $a'6PQR$q(M?:[\]M&^V	Bww~~d//0$++S7C 6q)-1D&6T%7%7!8 99TUV 1Y&^ &^N  	A;A3?@@	A6 6  	B<QC@AA	Bsh   A H C(G9+=G9(H 1AH5 2H)*H5 9H>H 	H&H!!H&)H2.H5 5	I>IINc                 ~   t        j                  d      }|j                  d       	 | j                  j	                         }|s|j                  d       yi }h d}h d}| j                  j                         }|s|j                  d       y|j                  dg       D ]d  }|d	   }	|	|v s|	|v rt        |d
         t        |d         z   }
|
dk  r4|	 d}|j                  |d      }|dkD  sQ|
|z  }|dk\  s\|
||d||<   f |j                  dt        |       d       g }t        | j                  j                               D ]-  }||vs|j                  |       |j                  d| d       / |D ]  }| j                  |=  |r.|j                  dt        |       d       | j                          ddl}|j                   j#                  |j                   j%                  | j&                        d      }t)               }	 |j                   j+                  |      rCt-        |dd      5 }t)        t/        j0                  |      j                               }ddd       d}t)        | j                  j                               |z  }|j5                         D ]  \  }}|r||vr||v r||vs|dz  }|d   }|j                  d| d|dd       t7        t8        d       }|d!   |d"   |d!   d|d#z  z
  z  |d!   dt:        d#z  z   z  t=        j>                         d$d%||d!   |d!   d&
| j                  |<   |j                  d'| d(| d)t:         d*        |dkD  r%|j                  d+| d,       | j                          |dk(  rDt        |      dk(  r5|j                  d-t        | j                         d.t        |       d/       yyy# 1 sw Y   uxY w# t2        $ r Y w xY w# t2        $ rA}|jA                  d0|        ddl!}|jA                  |jE                                Y d}~yd}~ww xY w)1u  🔴 FIX 27/02: Synchronise positions locales avec les holdings réels sur Binance.
        
        Détecte les positions orphelines (crypto sur Binance non trackée localement)
        et les positions fantômes (trackées localement mais plus sur Binance).
        Évite l'accumulation de crypto non suivie qui bloque le USDT.
        
        Args:
            watchlist: Set de symboles à vérifier. Si None, vérifie tout.
                       Important sur testnet qui a 400+ coins pré-chargés.
        SyncBinanceu$   🔄 Synchronisation avec Binance...u2   ⚠️ Impossible de récupérer le compte BinanceN>   UARSBRLCOPCZKDAIrI   IDRJPYMXNPLNRONTRYUAHUSDZARAEURBUSDEURIFRAXTUSDUSD1USDCUSDEUSDPr  XUSDBFUSDFDUSDRLUSD>
      币安人生   这是测试币456BNBBETHETHWWBTCBNSOLLDBNBWBETHu0   ⚠️ get_all_prices() a retourné un dict vider   r   r   r   r   r  g      @)r   rW   
value_usdtu   📊 u+    holdings détectés sur Binance (> 5 USDT)u   👻 Position fantôme: z) (dans positions.json mais 0 sur Binance)u   🧹 u%    position(s) fantôme(s) nettoyée(s)zespion_trades.jsonr  r   r  r   r  u   🔍 Position orpheline: z = $r   u     USDT sur Binance (non trackée)rG   rW   r   r  r   RECOVERED_ORPHAN)
entry_pricer   	stop_losstake_profitr   r   r  usdt_invested	max_price	min_priceu   ✅ u    récupéré (SL=u   % serré orphelin, TP=%)u   🔄 u)    position(s) orpheline(s) récupérée(s)u   ✅ Positions synchronisées (z pos. locales, z holdings Binance)u   ⚠️ Erreur sync Binance: )#logging	getLoggerr   r  r   warningr   rZ   r\   r   r   r  keysrf  _save_positionsr!   r"   joindirnamer  setr#   r   r[   r  rz   r  r8  STOP_LOSS_PERCENTTAKE_PROFIT_PERCENTr   r   error	traceback
format_exc)r   	watchlistloggerr   binance_holdingsstablecoinsignore_assets	price_mapbalance_itemr   totalrP   rW   r  phantom_positions_os	_spy_file_spy_tracked_forphan_counttracked_symbolsholdingvalueorphan_sl_pctr}   r  s                             r   sync_with_binancez!PositionManager.sync_with_binance  s    ""=1:;z	1kk--/GST  "QK
 AM 224IQR 'J ; $W-K'5M+Al623eL<R6SSA:!7$!fa019!&J!S((-%**44(0!, KK%$4 566abc
 !#t~~2245 q!11%,,V4NN%=fXEn#opq , +NN6*+ !eC(9$:#;;`ab$$& chh&6&6t7J7J&KMabI5L88??9-iw? A2'*499R=+=+=+?'@A L!$.."5"5"78<GO#3#9#9#; ~y!8\)0 A%L#L1ENN%>vhd5QT+Uu#vw %((93$?M'.w'7$+J$7%,W%5]S=P9P%Q'.w'71?RUX?X;X'Y%-\\^ %#5).%,W%5%,W%5.DNN6* KK$vh.?Ndexdyy{ |};~> aeL>1Z[\$$&q S):%;q%@<S=P<QQ`adeuav`w  xJ  K  L &A UA A V  	1LL7s;<LL--/00	1s|   -O2 7O2 A"O2 1
O2 <AO2 B9O2 )O" 5-O"O" *AO2 9DO2 OO" "	O/+O2 .O//O2 2	P<;7P77P<c                 H   |j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|dk  r|S d}|dk(  r[||k\  r(|dz  |d<   t        d	| d
|dd|d   dd|dd	       d}||k  r|dz  |d<   t        d	| d|dd|d   dd|dd	       d}n_|dk(  rZ||k  r(|dz  |d<   t        d	| d
|dd|d   dd|dd	       d}||k\  r(|dz  |d<   t        d	| d|dd|d   dd|dd	       d}|rt        d| d       |S )zHValide et corrige automatiquement les Stop Loss et Take Profit invalidesr  r   r  r  r   r   Fg333333?
      ⚠️ u   : SL corrigé .6f    → z	 (entry: )TrU  u   : TP corrigé r   gffffff?rX         ✅ u0   : Position validée et corrigée automatiquement)rZ   rp   )r   rP   r  r  r  r  r   fixeds           r   _validate_and_fix_sl_tpz'PositionManager._validate_and_fix_sl_tp0  s   ggmQ/GGK+	ggmQ/wwvu%!J 5=K'#.#6K 
6(.3uSQ\M]^aLbbklwx{k||}~ k)%04%7M"
6(.S8IsS`OabeNffop{|  pA  AB  C  D V^K'#.#6K 
6(.3uSQ\M]^aLbbklwx{k||}~ k)%04%7M"
6(.S8IsS`OabeNffop{|  pA  AB  C  DGF8#STU
r   c                    	 t         j                  j                  t         j                  j                  | j                        d      }t         j                  j                  |      rt        d       yi }| j                  j                         D ]h  \  }}| j                  ||j                               }| j                  |   j                  |d   |d   d       i |d|d   j                         i||<   j t        | j                  dd	
      5 }t        j                  ||dd       ddd       t        dt!        |       d       t        dt#        j$                         j                                 y# 1 sw Y   PxY w# t&        $ r,}t        d|        ddl}|j+                          Y d}~yd}~ww xY w)zGSauvegarde les positions ouvertes avec validation automatique des SL/TPsell_all_signal.jsonuf      🚫 _save_positions() BLOQUÉ: sell_all_signal.json détecté → ne pas écraser le fichier vidéNr  r  )r  r  r   wr   r  r'  Findentensure_asciiu!      💾 Positions sauvegardées: z position(s)u      🔍 Timestamp sauvegarde: u'      ⚠️ Erreur sauvegarde positions: r   )r!   r"   r  r  r  r#   rp   r  r  r  copyupdater   r   r[   dumpr   r   r   rz   r  	print_exc)	r   sell_signal_filer^   rP   r  validated_posrd   r}   r  s	            r   r  zPositionManager._save_positions]  s    	"  "ww||BGGOOD<O<O,PRhiww~~./~  AD#~~335  $ < <VSXXZ P v&--!.{!;#0#?/ 
 # {!;!E!E!G V d))3A AQ		$!%@A5c$i[MN28<<>3K3K3M2NOP	A A
  	";A3?@!!	"s8   A1F 4BF E<-AF <FF 	F="F88F=c           
         	 | j                   }t        j                  j                  | j                        r1	 t        | j                  dd      5 }t        j                  |      }ddd       t        t              rt        |      t        | j                         kD  rt        d | j                   D              }|D cg c]>  }|j                  dd      |j                  dd      xs |j                  d	d      f|vr|@ }}|rb|| j                   z   }|j                  d
        t        dt        |       dt        | j                          dt        |              || _         | j                  dz   }t        |dd      5 }t        j                   ||dd       ddd       t        j"                  || j                         y# 1 sw Y   dxY wc c}w # t        $ r Y }w xY w# 1 sw Y   KxY w# t        $ rn}	t        d|	        | j                  dz   }t        j                  j                  |      r(	 t        j$                  |       n#  Y nxY wY d}	~	yY d}	~	yY d}	~	yd}	~	ww xY w)u7   Sauvegarde l'historique des trades (écriture atomique)r  r   r  Nc              3      K   | ]<  }|j                  d d      |j                  dd      xs |j                  dd      f > yw)rP   r  
entry_timer   NrZ   .0ts     r   	<genexpr>z0PositionManager._save_history.<locals>.<genexpr>  sE      - ! UU8B/|B1G1`155Q\]_K`a-s   AArP   r  r*  r   c                 V    | j                  dd      xs | j                  dd      xs dS )Nr*  r  r   r+  )r.  s    r   <lambda>z/PositionManager._save_history.<locals>.<lambda>  s-    quu\RT?U?tYZY^Y^_jkmYn?trt r   keyu      📜 Fusion historique: z trades disque + u    mémoire = z.tmpr  r'  Fr  u(      ⚠️ Erreur sauvegarde historique: )r  r!   r"   r#   r  r   r[   r  r   r   r   r  rZ   sortrp   rz   r$  replacer%   )
r   history_to_saver  disk_historyin_memory_keysr.  missingtmp_filerd   r}   s
             r   _save_historyzPositionManager._save_history  sY   '	 #00Oww~~d//0d//wG 52'+yy}5!,5#l:KcRVRdRdNe:e), -%)%7%7- *
 (4#"# !hr 2AEE,r4J4caeeT_`bNcdlzz # # #.58J8J.JO+005t0u!$?G~M^_bcgcucu_v^w  xD  EH  IX  EY  DZ  #[  \1@D.
 ((61Hhg6 L!		/1QUKLJJx!2!2315 5# ! 
L L  	<QC@A((61Hww~~h'IIh'D ( (		s   6G6 G G	'AG  AGA&G )G6 G* (G6 	GG 	G'$G6 &G''G6 *G3/G6 6	I-?<I(<II(II((I-c                    t        d | j                  D              }t        | j                        }t        d | j                  D              }t        d | j                  D              }|||||dkD  r
||z  dz  dS ddS )u/   Calcule le P&L total de tous les trades fermésc              3   @   K   | ]  }|j                  d d        yw)pnlr   Nr+  r,  s     r   r/  z0PositionManager.get_total_pnl.<locals>.<genexpr>  s     DAeQDs   c              3   L   K   | ]  }|j                  d d      dkD  sd  ywr>  r   r   Nr+  r,  s     r   r/  z0PositionManager.get_total_pnl.<locals>.<genexpr>  s!     HAEE%Oa4G1H   $$c              3   L   K   | ]  }|j                  d d      dk  sd  ywr@  r+  r,  s     r   r/  z0PositionManager.get_total_pnl.<locals>.<genexpr>  s!     J1aeeE1o6IQJrA  r   r  )	total_pnltotal_tradeswinsr!  win_rate)rg  r  r   )r   rC  rD  rE  r!  s        r   get_total_pnlzPositionManager.get_total_pnl  s    D1C1CDD	4--.Hd00HHJ 2 2JJ"(7Ca7G,s2
 	

 NO
 	
r   Fr  c                 &    t        d| d|        y)u9  Ouvre une nouvelle position
        
        Args:
            bb_breakout_entry: Si True, cette position a été ouverte sur un breakout BB+
                               et sera vendue dès que le prix repasse sous BB+
            pattern: Pattern IA détecté au moment de l'achat (pour statistiques)
              🚫 u6   : ACHATS BOT DÉSACTIVÉS (spy-only mode) — pattern=N)rp   r  r  r   r   r   _lot_size_blacklistr   r   r   r\   rZ   r   r  currencyrg   )r   rP   r   r   stop_loss_pcttake_profit_pctbb_breakout_entryr  r   r   reasonorderr  r   r  r  strategy_labels                    r   open_positionzPositionManager.open_position  s     	 VW^V_`ar   c                 
   || j                   vrt        d|        y| j                   |   }|j                  dt        j                               }t        |t              r	 t        j                  |      }| j                  j                  ||d         }|dk  r2t        d| d|d           | j                   |= | j                          yt        d| d	| d
|d    d       	 | j                  j                  ||      }|rd|v r|j                  dg       }|r-t        |      dkD  rt        |d   j                  dd            }	nd}	|	dk(  r| j                  j                  |      }		 | j                  j                  |      }
t!        |	|
z
  |
z        dz  }|dkD  rIt        d|        t        d|	d       t        d|
d       t        d|dd       t        d        |
}	|	|d"   z
  |d   z  }|	|d"   z  dz
  dz  }t        j                         |z
  j#                         }| j$                  r	 | j$                  j'                  i dt        j                         d#|d$d%d"|d"   d&|	d|d   d'|d(|d)|d*|d+|j                  d+d      d,|j                  d,d      d-|j                  d-d      d.|j                  d.d      d/|j                  d/d0      d1|j                  d1|      d2|j                  d2d             |d%|d"   |	|d   ||||d   j)                         t        j                         j)                         |j                  d3d4      d5}| j*                  j-                  |       | j/                          |j                  d3d4      }t1               }|j3                  ||       t        d6| d7| d       t        d8t4        j7                  |	              t        d9t4        j7                  |d:       d7|d;d<       | j                   |= | j                          |d=k  rhddl}t;        | d>      r| j<                  ni | _        |d?k  rd@}ndA}|j9                         |z   | j<                  |<   |dBz  }t        dC| dD| dE|d;d<       |S y#  t        j                         }Y FxY w# t        $ ri}t        d| d|        t        d| d       |j                  dd      dz   |d<   |d   dk\  rt        d| d       | j                          Y d}~yd}~ww xY w# t        $ r}t        d!|        Y d}~gd}~ww xY w# t        $ r}Y d}~Zd}~ww xY w)FzFerme une positionu&      ⚠️ Pas de position ouverte sur Nr   r   r   u%      ⚠️ Quantité trop petite pour : u      📊 Vente de  z (original: r  u      ❌ ERREUR CRITIQUE vente u      🚨 Position u'    NON FERMÉE - ALERTE MANUELLE REQUISE!failed_close_attemptsr   rh   u      ⚠️⚠️⚠️ u2   : 3+ tentatives échouées! INTERVENTION MANUELLE!r	  fillsrW   r  r   u,      ⚠️  WARNING: exit_price suspect pour z      Prix API fills: r   u         Prix marché actuel: u         Écart: .1fz	% (> 10%)uE         → Utilisation du prix marché pour éviter données erronéesu)      ⚠️  Erreur validation exit_price: r  rP   r   r   
exit_pricer>  pnl_pctrO  duration_secondsr  r  sl_pcttp_pctis_dynamic_sltpFmax_profit_pctmax_drawdown_pctr  r  )rP   r   r  rY  r   r>  rZ  rO  r*  	exit_timer  u   
   📤 POSITION FERMÉE:  (z      Prix sortie:       P&L: r'  +.2fr  皙_last_loss_cooldown      ip     r  u         🕒 Cooldown PERTE zh: u    bloqué (perte )r  rp   rZ   r   r   r   r   r  r  r   r  r  rz   r   r\   r   ry   r  r  log_trade_closer   r  rf  r;  r   record_traderK  rg   rY   r   rf  )r   rP   rO  positionopen_timestampr   rP  r}   rW  rY  market_priceprice_diff_pctr>  rZ  r[  trade_recordpattern_namepmr   cooldown_secondshrss                        r   close_positionzPositionManager.close_position  s    ':6(CD>>&) "k8<<>Bnc*0!)!7!7!G
 ;;..vx
7KLq=9&HZDXCYZ[v&  "!(1VHL*AU@VVWXY
	KK++FH=E Y%'IIgr*EUa"58<<#;<

Q![[226:
G#{{44V<!$j<&?<%O!PSV!V!B&HQR2:c2BCD7S7IJKN>#*>iHIac!-J  778J;OOC"Xm%<<ASHG !) ?NNP   %%55 7#X\\^7 &7 7 &x'>	7
 %j7 #HZ$87 s7 "77 !&7 +,<7 $X\\+q%A7 &x||M1'E7 !(,,x";7 !(,,x";7 *8<<8I5+Q7  )(,,7G*Q!7" +HLL9KQ,O#7 0 !'6($Z0" &{3==?%\\^557#<<	9=L %%l3  $<<	9=L$&BOOL'206(!DE'
(C'DEFKQ 7874.KLv&  "
 ~
 %GNtUjGk4+C+Cqs(
 T>',$'+$38::<BR3R((0&$.23%s6(BRSZ[_R``bcdL[0!)"  	1&A3?@%fX-TUV08=TVW0X[\0\H,-/0A5.vh6hij  "	D  GA!EFFGB ! sQ   "R$ &S  .A=T5 9CU $R= 	T2	AT--T25	U>UU	U.)U.c                    || j                   vry| j                   |   }|d   }|j                  dd      }d}|j                  dd      }|	 t        |t              r)t	        j                         |j                         z
  dz  }nKt        |t              r;t	        j                         t        j                  |      j                         z
  dz  }|d	k(  xr |d
k  }d}	|rt        d| d|dd       g }
	 | j                  j                  |dd      }
t        |
      dk  ry|
D cg c]  }t        |d          }}|d   }g }g }	 |
r6|
D cg c]  }t        |d          }}|
D cg c]  }t        |d          }}|yd|vr||d<   n+||d   kD  r#||d<   ||z  dz
  dz  |d<   | j                          t         j#                  |t$              }t         j#                  |t&              }|r|sy|r'||z
  |z  dz  }|dk  rd}d}	t        d| d|d d!       t         j)                  |t*              }t        |      d"kD  rt         j)                  |dd# t*              n|}t        |      d$k\  r||d#   z
  |d#   z  dz  nd}t        |      dk\  r||d%   z
  |d%   z  dz  nd}t        |      d&k\  r||d'   z
  |d'   z  dz  nd}||z  dz
  dz  }t-        t.        d(d      }|d)k  }|rd*nd+}||k  r^|d*k\  r3t        |      }t        |      d$k\  r||d#   z
  |d#   z  dz  nd}|d,k  rny|d	k(  xr6 |j                  dd      d*k\  xr ||j                  dd      d-z  k  xr |d,kD  }|s|d	k(  xr* |j                  dd      d.k  xr |d/k  xr |dk  xr |d,kD  } |r|r||z
  |z  dz  nd}!|d	k(  xr |dkD  xr |!dk  xr |d0k  xr |d,kD  }"| r(t        d1| d2|j                  dd      d d3|d4d5       n3|"rt        d1| d6|!d d7|d8d9       n|d:k  rt        d| d;|d4d<       yt        d1| d=|j                  dd      d d>|d4d!       g }#d}$d}%||z
  |z  dz  }&|d/k  r't        d?| d@|d4dA|d4dB|d4dC|xs dd8dD|&d4dE       |xs d|xs dz
  }'|'dFkD  r,|r*|dGk  r%d}%|$dHz  }$|#j1                  dI|d8dJ|d8dK|'d8dL       t3        t.        d(      r|st-        t.        d(d      }(|(dMk  rG|d:k  s|r@|dGk  r;d}%|$dNz  }$|#j1                  dO|(dz  d4dP|d dQ       t        dR| dS|(dz  d4dT       n%|(dUk  r |d)k  r|$d$z  }$|#j1                  dV|(dWdX       |d)k  rd}%|$dHz  }$|#j1                  dY|d dZ       n|d:k  r%|d[k  r |$dz  }$|#j1                  d\|d dB|d dE       nf|d]k  ra|d]k  r\|sZ|r9|d^k  r4d}%|$dHz  }$|#j1                  d_|d dB|d dC|d8       t        dR| d`       n|$d$z  }$|#j1                  da|d dB|d dE       |&d/k  rI|dk  rD|dk  r?|$dz  }$|#j1                  db|&d dE       |r"|dck  rd}%|$dz  }$|#j1                  dd|d8de       |r8|dGk  r3|s1d}%|$d&z  }$|#j1                  df|d8dg       t        dR| dh|d8di       n/|r-|djk  r(|s&|d[k  r!d}%|$dNz  }$|#j1                  dk|d8dl|d dE       |r|dmkD  r	 t         j5                  |d
dn      })t         j7                  |d
dn      }*|)r|*r|)|*kD  r||*z
  |)|*z
  z  }+|dokD  r?|+dpkD  r:|dk  r5d}%|$d&z  }$|#j1                  dq|d8dr|+d ds|d dE       t        dR| dt       nq|dukD  r?|+dvkD  r:|d0k  r5d}%|$dHz  }$|#j1                  dw|d8dr|+d ds|d dE       t        dx| dy       n-|dzkD  r(|+d{kD  r#|d*k  r|$dz  }$|#j1                  d||d8dr|+d        |rGt        |      dk\  r8	 t9        t        |            D ,cg c]  },||,   ||,   z
   }-},t;        |d}d       d
z  }.t;        |d#d       d$z  }/t;        |-d#d       t=        t;        |d#d       d~      z  }0|/t=        |.d~      z  }1|0dkD  rM|1dkD  rH|dk  rCd}%|$dz  }$|#j1                  d|0dz  d8d|1dd|d dE       t        dR| d|0dz  d8d|1dd       nc|0dkD  r1|1dkD  r,|dk  r'|$dz  }$|#j1                  d|0dz  d8d|1dd|d dE       n-|0dkD  r(|dk  r#|dk  r|$dnz  }$|#j1                  d|0dz  d8d       |j                  d|      }2|j                  dd      }3||2z
  |2z  dz  }4|4dk  r|$dz  }$|#j1                  d|4dd       |4dk  r|$d$z  }$d}%|#j1                  d|4ddE       |3d*kD  rR||3dz  k  rJ|&dk  rE|$dz  }$|#j1                  d|3dd|ddE       |dk  r!d}%|$dz  }$|#j1                  d|3dd|ddE       |&d/k  r|$d$z  }$|#j1                  d|&d d!       ||k  r||k  r|$dnz  }$|#j1                  d       |d	k(  r|j                  dd      }5|5d*k\  rK||5dz  k  rC|dk  r|dk  rd}%|$dz  }$|#j1                  d|5d d>|d4d|d d|d d!	       t        d| d       nF|5d*k\  rA||5d-z  k  r9|dk  r4d}%|$d&z  }$|#j1                  d|5d d>|d4d|d d!       t        d| d       |d	k(  r|dkD  r|j                  dd      }6|&dk  r?|d0k  r:|dk  r5d}%|$dHz  }$|#j1                  d|&d d|d4d       t        dR| d|d8d       nG|6d.k\  rB||6dz  k  r:|&dk  r5|dk  r0d}%|$dNz  }$|#j1                  d|6d d>|d4d       t        dR| d       |d/k  re|&dk  r`|dk  r[|$dz  }$|#j1                  d|&d d|d4dE       |r:|d^k  r5|d:k  r0d}%|$dz  }$|#j1                  d|d8d       t        dR| d|d8d       t-        t.        d(d      }7|7d)k  }8|&d.kD  xr |dkD  xr |d*kD  xr ||kD  }9| xs |dk\  }:|9r+|:r)|%s'|8s%|$dkD  rt        d| d|&d4d|d4d|xs dd8de	       y|&d0kD  xr |xr dF|cxk  xr dk  nc xr ||kD  };|;r"|%s |$d&k  r|8s|$dkD  rt        d| d|d8de       yt>        rC|d*kD  r>|%s<	 tA               }<|<r/|<jC                  ||||      \  }=}>|=r|$dz  }$|#j1                  |>       d}?t3        | d      r| jD                  r|%s 	 | j                   j                  |i       }| jD                  jG                  |||      }@|@j                  dd      }A|@j                  dd      }B|@j                  dd      }C|Adk(  r!Bduk\  r|$dHz  }$|#j1                  dBd8d!       njAdk(  r!Bdmk\  r|$dz  }$|#j1                  dBd8d!       nDAdv r@|d)kD  r;|	sd}?|$dkD  r2|#j1                  dBd8d!       n|$dkD  r|#j1                  dBd8d!       d}D|%xr |$dHk\  xr |d	k(  }E|%xr |$d&k\  xr |&dk  }F|8rdHnd}G|?r|$Gk  rEsFsd}DnErd}DnFrd}Dn|%r|$dk\  rd}Dn|$dk\  rd}DDr&|%rdnd}H|H d|$ ddjI                  |#dd$        }Id|IfS |$dkD  r7t        d| d@|d4d|$ d|%        |r|dnd}Jt        d|J d|&d4d|d4dE       y# t        $ r Y w xY wc c}w # t        $ r.}t        |      dk  rY d}~yt        |      }|d   }Y d}~d}~ww xY wc c}w c c}w # t        $ r g }g }Y w xY w#  Y MxY wc c},w # t        $ r Y w xY w# t        $ r}Y d}~nd}~ww xY w# t        $ r Y cw xY w)uT  
        Vérifie les indicateurs techniques pour une sortie anticipée.
        Appelée à chaque cycle pour les positions ouvertes.
        
        AMÉLIORATIONS v2.0:
        - Détection des ventes massives avec volume anormal
        - RSI TRAP pattern = vente urgente
        - Chute rapide du RSI = signal critique
        - Momentum négatif soudain avec volumes
        - NOUVEAU: Détection retournement après pic (EMA cross + perte de momentum)
        - FIX: Utilise les klines 1m Binance au lieu des ticks pour cohérence
        
        Retourne: (should_exit, reason)
        )Fr  r  r  r  r   r   Nr  CREUX_REBOUNDr  F      🛡️ u   : CREUX_REBOUND protégé (age=rX  zmin < 20min)1mr-   r   r         r2  rS   	   r  r   r  max_pnlre  Tr  u;   : CREUX protection LEVÉE — tendance BAISSIÈRE (EMA gap=r   r  r  rO  rh   r5  r   _btc_momentum      rP  皙?rg        ?333333?rR  皙?u      🔍 u,   : CREUX ÉCHOUÉ — jamais profitable (max=z%), pnl=rd  u   % → évaluation sortieu-   : CREUX BEARISH — tendance baissière (EMA=u   %), pas de rebond après r  u   min → évaluation sortierw  u   : Quick-exit BLOQUÉ (pnl=u!   % < 0.3%) → SL gère les pertesu*   : CREUX cycle retournement détecté (max+   % → u      📊 [EXIT CHECK] z: pnl=z% Mom3=% Mom5=% RSI=z	 EMA_gap=%-   r      u   🚨 RSI TRAP:    →z (chute zpts)g{Gzr  u   🚨 REAL CRASH: BTCz	% + Mom3=u   % (crash général)      🔴 u   : VRAI CRASH détecté (BTCu   %) → SORTIE IMMINENTEg{Gzu   ⚠️ BTC faible (+.2%z) + en perteu   🚨 CRASH SOUDAIN: z% sur 3 bougies皙u   ⚠️ Chute rapide: Mom3=皙ٿr  u   🚨 CHUTE PERSISTANTE: Mom3=u3   : Chute persistante détectée → VENTE IMMÉDIATEu    ⚠️ Baisse persistante: Mom3=u&   ⚠️ Death Cross confirmé: EMA gap=rc  u   🚨 + RSI faible (r  u   🚨 RSI TRAP CRITIQUE: RSI=u    (survente extrême)u   : RSI TRAP détecté (RSI=u   ) → VENTE IMMÉDIATE   u   🚨 RSI survente (z) + en perte A   r'  rv  g?u   🚨 END_OF_CYCLE: RSI=z BB_pos=z Mom=u[   : PIC EXTRÊME DÉTECTÉ - RSI surachat + BB haute + momentum négatif → VENTE IMMÉDIATEF   g333333?u"   ⚠️ END_OF_CYCLE PRÉCOCE: RSI=u      🟡 u-   : FIN DE CYCLE détectée - Sortie anticipéeD   g=
ףp=?u   ⚠️ Proche pic: RSI=i绽|=g?r  皙ɿu   🚨 SELL SPIKE: z% vente zx avg Mom5=z: SPIKE VOLUMES VENTE (z% sell, u   x avg) → EXIT      ?u   🔴 VENTE DOMINANTE: z% sell zx avg Mom3=g333333?u   ⚠️ Pression vente: z% sell       zChute z% depuis maxg      u   🚨 Chute sévère 皙?   u   ⚠️ Retournement: max +u   % → maintenant +.1fu   🚨 Profit perdu: était +z%, maintenant u   EMA baissière (zPrix sous EMA9 et EMA21      ?皙u   🔻 FIN CYCLE CREUX: pic+z% (mom3=%, mom5=      🔻 u9   : FIN DE CYCLE CREUX - Pic atteint et retourné → VENTEu   🔻 CREUX CRASH: pic+u)   : CREUX CRASH DÉTECTÉ → VENTE URGENTEu   🔻 CREUX BEARISH: EMA=z% + pnl=z% + pas de rebondu?   : CREUX en tendance BAISSIÈRE — rebond RATÉ → VENTE (age=min)u   🔻 CREUX GAIN PERDU: max+z% (EMA bear)u<   : CREUX gain en train de fondre — trend négatif → VENTEu   📉 TREND DÉTÉRIORÉ: EMA=u   🚨 + RSI survente (z) + perte significativeu   : TREND DÉTÉRIORÉ + RSI u    + perte → VENTE皙?(         🚀 u,   : Sortie annulée - Tendance FORTE (EMA gap=%, Mom3=%, RSI=U   u      ✋ u,   : Sortie annulée - EMA bullish + RSI sain (r  actionHOLD
confidence
sell_scoreSTRONG_SELLu   🧠 AI STRONG_SELL (r   u   🧠 AI SELL ()	EXTEND_TPr  u   🧠 AI HOLD override (u%   🧠 AI HOLD IGNORÉ (creux bearish, 333333ÿ      u   🚨 URGENT   ⚡z EXIT (score=): , u      🔍 [DEBUG EXIT] 	%, score=z	, urgent=N/Az
      RSI=z
, EMA_gap=)%r  rZ   r   r   rY   r   r   r  rz   rp   r  r   r   r\   r   r  r  r*  	EMA_SHORTEMA_LONGr%  
RSI_PERIODgetattrr=   rf  r   bollinger_upperbollinger_lowerre  rg  rh  AI_PREDICTOR_AVAILABLEr;   should_sell_earlyr  predict_sellr  )Kr   rP   prices_datark  r  r  position_age_minutes_ts_raw_creuxis_creux_protected_creux_protection_liftedklineskprices_listrH  r}   volumes_listbuy_vols_listema9ema21_ema_gap_earlyr%  rsi_prev
momentum_3
momentum_5momentum_10current_pnl_pct_btc_mom_qe_market_stress_qe	_pnl_gate_prices_tmp	_mom3_tmp_creux_reversal_check_failed_creux_check_ema_gap_gate_creux_bearish_exitexit_reasons
exit_scoreurgent_exitema_gap_pctrsi_dropbtc_momrW  rY  bb_posrk  	sell_volsavg_volrecent_vol_3sell_ratio_3	vol_ratior  r}  drop_from_max_max_pnl_max_pnl_creux_btc_mom_te_market_stress_testrong_uptrendrsi_healthy_for_uptrendema_bullish_with_healthy_rsiai_predictorai_should_sell	ai_reasonai_override_hold	ai_result	ai_actionai_confidenceai_sell_scoreshould_exit_creux_urgent_trend_deteriorated_ai_hold_thresholdurgencyrO  rsi_strsK                                                                              r   check_technical_exitz$PositionManager.check_technical_exit  s    '>>&)}-
 ,,y"-
  ! [$7$mX6,0IIK-:Q:Q:S,SWY+Y(s3,0IIK(:P:PQ^:_:i:i:k,koq+q( &8V=QTV=V#( Kx'FG[\_F``lmn 	,[[++FT+LF6{R 067151;7K7'OM 	5;<ad<<6< =qt = =
   h&$1H[!Xk22$1H[!$1K$?1#D"KHY  " #&&{I>#''X>5
 #e|u4;N%%*"+/(
6(*eftuxeyy{|} "%%k:>LOP[L\_aLa&**;s+;ZHgj UXXcTdhiTi}{26+b/ISPop
TWXcTdhiTi}{26+b/ISPop
WZ[fWgkmWmC(88K<LLPSSst *K71<C k?A>(4/,C#	Y&
 #%";/[^_j[kop[pmk"o=RPTWWvw	t#$
 ?* 'Y*c1'(,,y!"<s"BB'  $&	 " ) . +LLA.5+#d*+ %+ $d* $ CG5$,%!73 >VW. +(1,+!E)+ $c)+ $d* $ 'HVH,XYaYeYefopqYrsvXww  AP  QU  @V  Vn  o  p(HVH,YZghkYl  mF  G[  \_  F`  `z  {  |&-F83Mo^bMc  dE  F  G$HVH$Nx||\efgOhilNmms  uD  EI  tJ  JL  M  N
 u-4 T!)&7MWU_`dTeelmwx|l}  ~D  EH  EM  LM  NQ  DR  R[  \g  hl  [m  mn  o  p Nsyb1 b=SS2XK!OJ/(3s3s)8T\]`Saae fg ;09Kk?A>G J$5##("a
##&:73;t:LIV`adUeex$yz(CGCKPTCUUlmn5_t%;a
##&9'$|$TU K!OJ"6z#6Fo VW$:#4!OJ"<Z<LGT^_bSccd ef $:#4=OsRx"a
##&CJsCSSZ[efiZjjpqtuxpy$z{([\]a
##&FzRUFVV]^hil]mmn$op :#4d9J!OJ"HUXHYYZ [\sRx"a
##&9#c!$DE 38$6K"J">s3iG[ \]HVH$>s3iG]^_S2X&8%"a
##&9#c-P_`cOdde$fg 38.>>{BPQR.>>{BPQRX-@+h68h;NOF RxFTMj1n&*"b(
$++.Ec#YhW]^aVbbghrsvgwwx,yz  1L  M  Nrftm
S8H&*"a
$++.PQTUXPYYabhilammrs}  B  sC  CD  -E  F0]^_rftm
S8H"a
$++.Ec#YhW]^aVb,cd C-2INsS_O`IabA\!_}Q/??b	bl3r23b8"<#459"9RS>2S\"#=N9OQV5WW(3w+>>	  $&9s?zD?P"&K!OJ ''*;L<LS;QQYZcdgYhhst~  @C  tD  DE  )F  GHVH,CLQTDTUXCYYabkloapp  A  B!D(Y_dAR!OJ ''*@cAQRU@VV]^ghk]llw  yC  DG  xH  HI  )J  K!D(Z!^
T@Q!OJ ''*A,sBRSVAWW](^_ LLk:	,,y!,')3y@CG4!OJ&s(;< HI4!OJK"6}S6I KL S=_w}<Qa
##&@M^_nos^ttu$vw"Q&"&K!OJ ''*Egc]R`apqt`uuv(wx
 !OJ"2;s2C2 FG
 4ME$9!OJ 9: o%||Iq1H3?X_#D>j5&8"&K!OJ ''*DXcNRXYhimXnnv  xB  CF  wG  GO  PZ  [^  O_  _a  )b  cHVH,efgS_x#~%E*W[J["b 
##&<XcN&Q`aePffnoyz}n~  A  %B  C(QRS o%*>*B%\\)Q7NU"'<a"a
##&>{3>OxXghlWmm~$  A(gh|  ~A  hB  BF  G  H4'Ons>R,RWbefWfkuxyky"a
##&A.QTAUU[\klp[qq}$~(def T!kE&9j4>O!OJ"?C?PPXYhimXnno pqsRxOd$:"a
##&;C9D[$\](CC9L^_` k?A>(4/ $ !!! D 	 	 (+7":r	 5kRc A~(TU`aeTffnoyz~n  @G  HK  HP  OP  QT  GU  UV  W  X )4c(9(lc(lb3mQSm(lXehlXl$'
RXiA~x'STWX[S\\]^_
 "o&;K/10<0N0N##'	1-NI &"a
$++I6 !4,-$2H2HQ\>>--fb9 22??K	 &MM(F;	 )lA > )lA >--22E!OJ ''*?c?RRT(UV&(]b-@!OJ ''.s8K2(NO"77Od<R 4+/(%>(//2I-X[I\\^0_`%>(//2WXefiWjjl0mn  %WqWW=W*WzR/?WKRWDW #4Q
-? ?^qKK K Z2-K2K '2mGyj\TYY|TVUVGW=X<YZF< >)&7MYWaVbbklwkxyz&)S	uGJwiz+d1C8JW[K\\]^_G  " 8 	,;"$ {+K'OM	,  = = 	LM	H c*  B  L  s   Bz# 7,z8 $z8 (z3=z8 	{< {2${< *{7?{< C7| | 1|D| ;|- .C?} #	z0/z03z8 8	{/{*{**{/2
{< <|||| 	|*)|*-	}<}	}}c                 %   t        | j                        dk(  ryd}d}g }t        | j                  j                               D ][  \  }}| j                  j                  |      }|s$|d   }||z  dz
  dz  }||z  }|dk  r|dz  }|dk  sI|j                  ||f       ] t        | j                        dkD  r|t        | j                        z  }	|	dk  r)t        d|	d	d
| dt        | j                         d       |rCt        dt        |       ddj                  |D 
cg c]  \  }
}|
 d|dd c}}
              t        | j                        dk(  ryt        | j                  j                               D ][  \  }}| j                  j                  |      }||dk(  r|j                  dd      dz   }||d<   | j                          |dk\  rGt        d| d       t        d       | j                  |= | j                          t        d| d       nt        d| d| d       |d   }||z  dz
  dz  }||j                  dd      kD  r||d<   ||j                  dd       k  r||d<   	 t        | d!d"      }|d#v rt        }n|d"k(  rt        }nt        }	 |j                  d%d&      }|rt!        |t"              rt%        j&                  |      }n|}t%        j(                         |z
  j+                         d'z  }||k\  r5t        d(| d)|d*d+| d, d-	       | j-                  |d.| d/|d0d1       d2|vr||d2<   n||d2   kD  r||d2<   | j                          t/        | d3      si | _        t3        j2                         | j0                  j                  |d      z
  d4k\  r	 | j                  j5                  |d5d67      }|rt7        d8 |D              }||j                  d2d      kD  r||d2<   ||z  dz
  dz  }||j                  d9d      kD  rt9        |d6      |d9<   t;        t<              D ]U  \  }}}||k\  s|d|dz  z
  z  }||d:   kD  r5||d;z  k  r-|d:   }||d:<   t        d<| d=|dd>|d	d?|d@dA|d@dB|dCdD        n | j                          t3        j2                         | j0                  |<   |d2   }d}t;        t<              D ]  \  }}} ||k\  s||| f} n |r|\  }}} |j                  dE      dFk(  rdGndH}!||!z  }"|d|"dz  z
  z  }#|d:   }$| dkD  r|d|| z  dz  z   z  }%t7        |$|%      }$t7        |#|$      }&|&|d:   kD  r|&|d;z  k  r|d:   }|&|d:<   | dkD  r
dI| dz  d*dJnd&}'|!dHk  rdKnd&}(t        d<| dL|d*d>|"d	d|' |( dMt>        jA                  |       dAt>        jA                  |&       dN|d0dD       | j                          |j                  dE      dFk(  rk|j                  d9d      })|dkD  r||z
  |z  dz  nd}*|)dOk\  rB|*dPk  r=|dQkD  r8t        dR| dS|)d	dT|dCdU|*d	dV	       | j-                  |dW|*d	dX|dCd1       dY}+	 | j                  j5                  |d5dZ7      },t        |,      tB        k\  r|,D -cg c]  }-tE        |-d[          }.}-tF        jI                  |.tJ              }/tF        jI                  |.tB              }0t        |.      d6k\  r||.d   z
  |.d   z  dz  nd}1t        |.      dk\  r||.d   z
  |.d   z  dz  nd}2|/r@|0r>|/|0z
  |0z  dz  }3|3dOkD  xr |1d\kD  xr |2d]kD  xr ||/kD  }+|+rt        d^| d_|3dCd`|1dCd1       |+s|da   |z  dz
  dz  }4||4dGz  k\  re|dbz  }5|d:   |5cxk  r|k  r(n n%|5|d:<   t        dc| dd       | j                          n*|5|k\  r%t        d| det>        jA                  |       d-       ||4dfz  k\  rX|d|dGz  dz  z   z  }6|d:   |6cxk  r|k  r(n n%|6|d:<   t        dg| dh       | j                          n|6|k\  rt        d| di       tL        rv	 tO               }7|7rht/        |7dj      r[|7jP                  rN| j                  j5                  |dkdl7      }8|8r-t        |8      d'k\  rddl)}9 |9jT                  |8D -cg c]  }-tE        |-d[          c}-|9jV                  m      }: |9jT                  |8D -cg c]  }-tE        |-d          c}-|9jV                  m      };|7jP                  jY                  |:|;      }<|<r|<j                  dndY      rz|<j                  dod      }=|<j                  dpd      }>|=dqk\  rQ|>dGk\  rL|drk  r4t        ds| dt|=d*du|>d	dv|dCdw	       | j-                  |dx|=d*d1       *t        ds| dy|dCdz       |j                  d{dY      r	 || jZ                  v rt        | jZ                  |         d|k\  rlt        | jZ                  |         }.tF        j]                  |.      \  }?}@}A|?r8||?k  r2tF        j_                  |.d|d}d~      \  }B}C}Dt        |.      d6k\  r||.d   z
  |.d   z  dz  nd}1t        |.      dk\  r||.d   z
  |.d   z  dz  nd}2d9|vr||d9<   n||d9   kD  r||d9<   | j                          ||j                  d9d      z
  }EBxr	 |?xr B|?kD  }F|Frrt        d^| d       t        dt>        jA                  |       dt>        jA                  |?       dt>        jA                  B              t        d|dCd|1dCd       	dY}Gd&}HFsd}Gd}Hn,|1dk  r
d}Gd|1d	d1}Hn|2dQk  r
d}Gd|2d	d1}HnEdQk  r	d}GdEd	dV}H|?|z
  |z  dz  }I|IdHkD  r|1d]k  r	d}GdId	d}HGr|?|z
  |z  dz  }Jt        d|        t        dt>        jA                  |       dt>        jA                  |?       d|Jd	d1       t        d|dCd|j                  d9d      dCd       t        dH        | j-                  |d|H d-       
|1dkD  s|2dkD  rt        d| d|1dCd|dCd1       d9|vr||d9<   | j                          | j`                  r		 d}K	 | j                  j5                  |d5d'7      }L|Lr)t        L      dk\  rLD -cg c]  }-tE        |-d[          }K}-Krt        K      dk\  r| j`                  jc                  |K|      }M|Mj                  dd      }N|Mj                  dod      }O|Mj                  dd      }P|Mj                  dg       }QdY}R	 | jd                  r"| jd                  jg                         \  }S}T|Sdk(  }RRrdnd'}URrdlnd}VNdk(  roOUk\  rjdj                  Qdd6       }Wt        d| dOd*dPd*d-       t        d|dCdMj                  d       d|W        | j-                  |d|Wdd'  d-       Ndk(  rOVk\  rRr|dkD  xs |dk  n|dGkD  xs |dk  }X|Xrdj                  Qdd6       }Wt        d| dOd*d|dCd1       t        dMj                  d       d|W        | j-                  |d|Wdd'  d-       Ndk(  rOdk\  rMj                  d      }Y|YrnY|j                  dad      kD  rY|da   }ZY|da<   | j                          t        d| dt>        jA                  |Z       dAt>        jA                  |Y       dOd*d1	       Mj                  d      }[|[rj[|j                  d:d      kD  rU|d:   }[|d:<   | j                          t        d| dt>        jA                  |       dAt>        jA                  |[       d       |dk  rt        d| d|d	d       | j-                  |d      }\|\s^t        d| d       	 | j                  ji                  ||d   dz        }]| j                  jk                  ||]      }^|^rt        d|        ||d:   k  rV|j                  dd      }_|_d6k\  rIt        d| dŝ       t        d|d	dǝ       | j                  |= | j                          t        dȫ       |dkD  rnt        d| dt>        jA                  |       d|d	d1       | j-                  |d̫      }\|\rP_dz   |d<   | j                          t        d| d|_dz    dϝ       t        d| dt>        jA                  |       dt>        jA                  |d:          d-       | j-                  |dҫ      }\|\r_dz   |d<   | j                          t        d| d|_dz    dϝ       ||da   k\  st        d| dt>        jA                  |       dt>        jA                  |da          d-       | j-                  |d֫       ^ yc c}}
w # t        $ r d$}Y Sw xY w# t        $ r}Y d}~d}~ww xY w# t        $ r Y yw xY wc c}-w # t        $ r}Y d}~
d}~ww xY wc c}-w c c}-w # t        $ r}Y d}~d}~ww xY w# t        $ r}t        d| d|        Y d}~d}~ww xY wc c}-w #  Y xY w#  Y xY w# t        $ r}Y d}~d}~ww xY w#  t        d| d       Y xY w)u  
        Vérifie les stop-loss et take-profit avec TRAILING STOP DYNAMIQUE
        
        Le trailing stop permet de:
        - Remonter le stop-loss quand le prix monte
        - Ne pas vendre trop tôt quand une crypto continue à monter
        - Protéger les gains acquis
        
        SÉCURITÉ AJOUTÉE:
        - Circuit breaker si pertes > 10% du capital
        - Stop-loss d'urgence à -5% (au lieu de -1.5%)
        - Détection de positions bloquées
        - Nettoyage automatique des positions invalides
        r   Nr  r   r  rO  r5  u   
🚨 ALERTE: P&L moyen = r   z% | /z positions en perteu   ⚠️ z positions critiques (< -5%): r  rU  rX  r  failed_price_checksrS   u      🚨 u0   : 5+ échecs de prix → SUPPRESSION AUTOMATIQUEu;         Raison: Symbole potentiellement délisté ou invalideu      ✅ Position u    supprimée du portefeuiller  z!: Prix non disponible (tentative z/5)r_  ir`  i  current_regimeNEUTRALBEAR
CORRECTION   r   r  r  u
      ⏱️ z: Position ouverte depuis r  zmin (>u   min) → MAX_HOLD (régime=r  	MAX_HOLD_zmin (r  r  r  _kline_max_tsZ   rx  rh   ry  c              3   8   K   | ]  }t        |d            yw)r'  N)r\   )r-  r  s     r   r/  z>PositionManager.check_stop_loss_take_profit.<locals>.<genexpr>  s     (Gqt(Gs   r}  r  g+?u      📈 z: Trail KLINE-HIGH +z% (dist=z%) SL .5fr  z [kline_pnl=rd  z%]r  rv  r  rG   z | lock z% gainsu    [CREUX×0.5]z: Trail PALIER+z) SL z [P&L=r  r  rw  r  u   : CREUX PEAK EXIT — pic+r  % (z% depuis max)zcreux-peak-exit (z% du pic, P&L=Frc  r{  r  r  r  uG   : Tendance FORTE détectée - Paliers protection désactivés (EMA gap=r  r  gjt?rw  z(: Stop au break-even (50% du TP atteint)u4   : Break-even stop ignoré (au-dessus du prix actuel r        💰 z.: Protection 50% des gains (75% du TP atteint)u1   : Protect stop ignoré (au-dessus du prix actuel)reversal_predictorr  r  r  is_danger_signalr  reversal_probabilityr  r  u      🧠 u%   : LSTM REVERSAL_DOWN détecté (conf=z%, prob=z) P&L=u   % < 0.8% → FERMETUREzLSTM_DANGER (conf=u   : LSTM DANGER ignoré - P&L=z% >= 0.8% (laisser courir)rN  r  r   r  u=   : Maintien position - KC>BB+ (tendance haussière confirmée)z      Prix: z, BB+: z, KC+: rc  z%, Momentum 3min: Tu"   KC≤BB+ (fin tendance haussière)rR  zBaisse active (mom3=u   Tendance baissière (mom5=zGains en baisse (zLoin de BB+ (-z%) + momentum faibleu   
   📊 BB+ BREAKOUT EXIT: z < BB+: z (-z      P&L actuel: z% | P&L max: z      Raison: zbb-breakout-exit (r  z,: BB+ exit suspendu - Hausse continue (mom3=z%, P&L=u   : Erreur vérification BB+ - r-   r  r  r  reasonsBULL_STRONGrv  r  u   
   🧠🔴 AI STRONG_SELL: z (conf=r  z	% | Dir: predicted_direction | zai-strong-sell (r   r        rg  u   
   🧠🟡 AI SELL: z      Dir: z	ai-sell (r  r  ai_take_profitu      🧠📈 u   : IA étend TP u    (continuation prédite, conf=ai_stop_lossu      🧠📊 z: IA resserre SL z (protection IA)u   
   🚨 STOP-LOSS D'URGENCE: z (P&L: z	% <= -5%)zstop-loss-urgenceu'      ⚠️⚠️⚠️ ÉCHEC fermeture u   ! Tentative forcée...r   Gz?u      ✅ Vente forcée réussie: u$      ❌❌❌ ÉCHEC TOTAL! Position u
    BLOQUÉE!rV  u	   
   🚨 u1   : 3+ échecs de fermeture → SUPPRESSION FORCÉEu         P&L estimé: u   % (non réalisé)u/      ✅ Position supprimée pour éviter blocageu   
   🟡 TRAILING STOP: z (Prix: z	 | P&L: +ztrailing-stopu      ⚠️ Échec trailing stop z (tentative /3)u   
   🔴 STOP-LOSS: z <= SL: 	stop-lossu      ⚠️ Échec stop-loss u   
   🟢 TAKE-PROFIT: z >= TP: take-profit)6r   r  r   r  r  r   rf  rp   r  rZ   r  r  MAX_HOLD_MINUTES_BEARMAX_HOLD_MINUTES_NEUTRALMAX_HOLD_MINUTES_BULLrz   r   r   r   r  r   r  rt  r   r  rY   r   rh  roundreversedTRAILING_TIERSrK  rg   r  r\   r  r*  r  r  r;   r  numpyr  float64predictr  r0  r  r  r  r  get_current_regimer   r  )`r   total_pnl_pctpositions_in_losscritical_positionsrP   rk  rH  r  rZ  avg_pnlspr  r  _regime_for_holdMAX_HOLDING_MINUTESopen_tsentry_dtholding_minutesr}   recent_k
kline_high	kline_pnl	_tier_min_tier_trail
_tier_lock_kline_trail_slold_slr  active_tiertier_min_pcttier_trail_pcttier_lock_ratio_creux_trail_mult_effective_trailnew_stop_trailnew_stop_locklocked_gainnew_stoplock_str	creux_str_cpx_max_pnl	_cpx_dropis_strong_uptrendr  r  r  r  r  r  r  r  r]  breakeven_stopprotect_stopai_pred	klines_5mr  	prices_5m
volumes_5mlstm_resultdanger_confdanger_probrW  rX  rY  kc_upperkc_midkc_lowerpnl_drop_from_maxkc_above_bbr  exit_reasonbb_distancebb_distance_display	ai_prices	ai_klinesr  r  r  r  
ai_reasons_is_bull_strong	_reg_namer   _strong_sell_conf
_sell_confreasons_str_sell_pnl_okai_tpold_tpai_slr   reduced_qtybackup_orderfailed_attemptss`                                                                                                   r   check_stop_loss_take_profitz+PositionManager.check_stop_loss_take_profit  s     t~~!#  $T^^%9%9%; < 
	AFH KK11&9M&}5)K71<C(R<%*%R<&--vw.?@
	A t~~"#c$..&99G|3GC=EVDWWXY\]a]k]kYlXm  nA  B  C!$6 788VW[W`W`  Q  bRvzvwyzefdgghijknhoopbq  bR  XS  WT  U  Vt~~!# $T^^%9%9%; < l	;FH KK11&9M$(:&.ll3H!&Lq&P#2E./$$&&!+HVH,\]^WYv.((*,VH4OPQJvh.OPcOddghi"=1K - ;q@CGO .>!EE-<)*.@#!FF/>+,	*#*41A9#M #'==*?'%2*B'*?'",,{B7!'3/#+#9#9'#B#*'/||~'@&O&O&QTV&VO&*==
6(2L_]`Laagh{g|  }X  Yi  Xj  jk  l  m++Fi@S?TTYZijnYooq4rs  (*(5%+!66(5%$$&
 41%'"yy{T//33FA>>"D#{{55ftST5UH%((Gh(G%G
%[!(DD4>H[1*4{*Ba)G3(NI(8<<	1+EE6;Iq6I 3 GO~F^ 
* B	;
#,	#96@AVYHYDY6ZO(7(;:O(O,;me>S,S19+1F@O(=(-@TU^_bTc d77B36GvfUX\Y^_nor^s t<<Ed;K2/O )P %*
* !002 .2YY[""6* -I KAI.AY =no"l2#/"QK
 @K=no ,4<<	+Bo+UC[^!#14E#E  "+a2BS2H.H!I !) 5"Q&"-o6W[^5^1^"_K$'{$CM ~}= h{33=SXCX8X%k2F,4H[)N]`aNa/#*=c)B'JgiH3Ds3JPRIHVHOL;MXVfgjUkklmulv  xA  wB  BG  HP  HW  HW  X^  H_  G`  `e  fn  fu  fu  v~  f  e@  @F  GV  W[  F\  \^  _  `((* ||I&/9 (Y :S\_`S`-)";y!HC Ofg	4'I,=/TXBXHVH,F|TWFXX^_nos^ttw  yB  CF  xG  GT  U  V''2CIc?R`apqu`vvx0yz !&//R/Pv;(*8>"?151;"?K"?.22;	JD/33KJE`cdo`ptu`u=;r?#BkRTo"UY\!\{|J`cdo`ptu`u=;r?#BkRTo"UY\!\{|J(,u'=&D ($. 1&,1&,1 *D0	 * -!HVH4{  }H  IM  |N  NV  Wa  bf  Vg  gi  #j  k
 %#M2[@AEL"fsl2%05%8N,~MM0>-F83[\],,.'=8
6(2fgogvgv  xE  hF  gG  GH  I  J #ftm3#.!7LPS6S2S#TL  ,|KmK0<-0^_`,,.%6
6(2cde &.0G774H#IgNhNh$(KK$:$:6DXZ$:$[	$Y2)=.(0y1Q!%!+1QY[YcYc(dI)1	2R151;2RZ\ZdZd)eJ*1*D*D*L*LYXb*cK*{?QSX/Y.9oolA.N.9oo>TVW.X $/"#49L'6'<(-@efqruevv~  @K  LO  P  PV  Wf  gk  Vl  lB  /C  )D(,(;(;FFXYdehXiikDl(m(0(-@\]lmq\r  sM  /N  )O ||/7SQ,T[[5H1IR1O&*4;;v+>&?5H5R5RS^5_2&(#(@ :M9]9]^ikmoqsv9w6Hfh illwhx|}h}=;r?+JkZ\o*]ad)d  DEJhklwhx|}h}=;r?+JkZ\o*]ad)d  DEJ  )86E 3!08I3F!F6E 3 $ 4 4 60?(,,yZ[B\0\- ,4+X+XXPXEXK* !&8u&v w %X__]5S4TT[\d\k\klt\u[vv}  G  N  N  OW  X  ~Y  'Z  ![ %OD3II[\fgk[llm&n o ( +0K*,K $/.20R ",d!2.20DZPSDTTV.W ",d!2.20J:VYJZZ\.] "3T!9.20ABSTWAXXe.f -5},D+UY\*\K*S0Z#5E.20>{3>OOc.d*8@=8PTa7aeh6h 3 %(EfX&N O %X__]5S4TT\]e]l]lmu]v\wwz  |O  PS  {T  TV  'W  !X %(:?4:PP]^f^j^jktvw^xy}]~~  'A  !B %{m&D E $ 3 3F>PQ\P]]^<_ ` ( $.>Z!^$)GF8;ghrswgxx  AP  QU  @V  VX  +Y  %Z (&5#$$& %%J $I$(KK$:$:6DXZ$:$[	$Y2)=>G(Hqt(HI(H !S^r%9$($:$:$G$G"Ix%	 "+x!@%.]]<%C
%.]]<%C
%.]]9b%A
 +0!#11/3/A/A/T/T/V	13<3M 3BBr)+:R
 "]2zEV7V*.))JrN*CK!$B6('R\]`Qaajkuvyjzz{"|}!K/EYy}}]rOsNttw  yD  xE  #F  G //:J;WZXZK[J\\]8^_$ $v-*
2J apOc,A,[_W[E[,;c,A,[_W[E[ )+.2ii
2A.G %(?xwzZ]N^^efuvze{{}&~  %IMMBW4X3YY\]h\i&j k $ 3 3FiTWUWHXGYYZ<[ \ ( ${2zR7G$-MM2B$CE$mQ1O)O)1-)@:? 7 $ 4 4 6 %VHOHOO\bLcKddijrjyjyz  kA  jB  B`  ak  lo  `p  pr  's  !t !*n = UX\\+q-I%I%-k%:F49H[1 002!L8I(//Z`JaIbbghphwhwx}h~g  @P  #Q  R "$7xwWZF[[def,,V5HICF8KabcY&*kk&A&A&(S]J^aeJe&f'+{{'>'>v{'S'!$CF8"LM   55"*,,/F"J"a'Jvh._`a//DDUVWv.((*KM"Q&5fXXhooVcFdEeeno~  @C  oD  DF  G  H!00IF!<Ka<O!89,,. ?x|TcfgTgShhklm1&(//R_B`Aaaijrjyjy  {C  DO  {P  kQ  jR  RS  T  U!00EF!<Ka<O!89,,. ;F8<P_bcPcOddghi (="99/xxP]@^?__ghphwhw  yA  BO  yP  iQ  hR  RS  T  U##FM:Yl	; bR`  *&)#*  b ! N #@"  ` 2R2R" ! v ! QJvh.KA3OPPQ0 )I$! \ ! Y DVHJWXs  #AG 7*AG&"BAG80BAHAAH 4AH$AH)B:AH$A+AI3AH;
#AI+AI 
 B(AI*AIE>AIC4AI!AIAJ2AJ	AJAJ	A9AJ.AJA>AJB
AJDAJAAJ0G&AG5G4AG5G8	AHHAHH	AHHAHHAH$H$	AH8H3AH8H;
AII	AIIAII	AJI%AI<I<AJJAJ	J	AJJAJJAJJAJJ	AJ-J(AJ-J0AKc           	      ,   t        | j                        dk  ryg }g }g }t        | j                  j                               D ]  \  }}	 | j                  j                  |      }|s%|j                  d|      }||z  dz
  dz  }	 | j                  j                  |dd      }	|	r+t        |	      d	k\  rt        |	d
   d         }
||
z
  |
z  dz  }nd}|j                  ||||f       |t        k  r|j                  |       |t        kD  r|j                  |||f        t        |      dk(  ryt        |      t        |      z  }|t        k  ryt        dt        |       dt        |       dt        dz  dd       t        ddj                  |              g }t!        |d d      D ]A  \  }}}t        d| d|dd       | j#                  |d|dd       |j                  |       C d}|D ]U  \  }}}}||v r|| j                  vr| j                  |   }|dz  }||j                  dd      kD  sF||k  sL||d<   |dz  }W |dkD  r | j%                          t        d | d!       yy# t        $ r d}Y w xY w# t        $ r Y Ow xY w)"u/  
        Détecteur de collapse global du portefeuille.
        Si PORTFOLIO_BEAR_MELT_RATIO des positions perdent simultanément,
        vend en priorité celles qui sont encore en profit pour sécuriser les gains.
        Ensuite resserre les SL des positions restantes près du prix actuel.
        rh   Nr  r   r  rx  r  ry  rS   r5  r{          r   u   
🚨 PORTFOLIO BEAR MELT: r  u    positions en chute (≥r  r  z   Dropping: r  c                     | d   S )Nr   r2   xs    r   r1  z;PositionManager.check_portfolio_bear_melt.<locals>.<lambda>w
  s
    ! r   Tr3  reverseu      💰 Vente BEAR_MELT z P&L=rd     % → SécurisationzBEAR_MELT_PROFIT (r  r  r  rw  u:    SL resserrés à -1% du prix actuel (positions restantes))r   r  r   r  r  r   rZ   r   r\   rz   rf  PORTFOLIO_BEAR_MELT_DROP_PCTPORTFOLIO_BEAR_MELT_MIN_PNLPORTFOLIO_BEAR_MELT_RATIOrp   r  sortedrt  r  )r   dropping
profitableall_positions_datarP   r  cur_pxepcur_pnlr  px_5agomom5
drop_ratiosold	tightenedtight_sls                   r   check_portfolio_bear_meltz)PositionManager.check_portfolio_bear_melt@
  s    t~~" 
 4 4 67 	KFC..v6WW]F3"RK1,3![[33FTQR3SF#f+"2"'r
1"6!''!1W <C" #))667D*IJ66OOF+88%%vw&?@/	6 !"a']S);%<<
11,S]O1SAS=T<UUm  oH  IL  oL  MP  nQ  QS  T  	Udii1234 '-jnVZ'[ 	 #FGV,VHE'$GZ[\*<WTN"(MNKK	  	-? 		)FFGT~T^^+..(C~H#''+q11h6G#+K Q			 q=  "K	{*def U ! D  s>   
J(JAI4AJ4J?JJJ	JJr)   )manual)r.   r/   r0   r1   r!   r"   r  
SCRIPT_DIRr  r  r   r  r  r  r  r;  rG  r  r  rR  rt  r  re  r~  r2   r   r   r  r  _  s    DWW\\*.>?N77<<
,@AL6BpH1T+Z""H)V
 FW&9U\eZx[zh	T[;FKgr   r  c                   (   e Zd ZdZej
                  j                  ed      Zej
                  j                  ed      Z	d Z
dededefdZdefd	Zd
 Zd Zd dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd!dZd Zd Zd Z d Z!d Z"d Z#y)"
TradingBotzBot de trading automatiquezbot_settings.jsonzwatchlist.jsonc           	         t        d       t        d       t        d       t        t        t        t              | _        | j                         | _        t        | j
                        | _	        | j                  j                  t        | j                               | j                  D ci c]  }|t        d       c}| _        d| _        i | _        i | _        t"        j$                  j'                  t"        j$                  j)                  t*              d      }	 t"        j$                  j-                  |      rt/        |d	      5 }t1        j2                  |      }|j5                  d
d      | _        | j6                  t9        j8                         kD  rCt;        | j6                  t9        j8                         z
        }t        d|dz   d|dz   d       nd| _        d d d        nd| _        d| _        d| _        d| _         g | _!        dd l"}g | _#        |jI                         | _%        | jM                         | _'        i | _(        d| _)        d | _*        d | _+        i | _,        d | _-        d| _.        d| _/        t        dt`                t`        rt        d       	 tc        | j
                        | _-        ddl-m2}  || j
                         | jZ                  jg                  d      \  }}	| jZ                  ji                         }
|	j5                  dd      }	  |       }|r||_.        |	|_5        t        d| d| d|
 d       nt        d!       tr        r	 tu               | _;        t        d"       nd | _;        t        d$       | jv                  | j                  _;        tx        r	 t        d%       t{               | _*        t        d&| jT                  d u        t}               | _+        t        d'| jV                  d u        t        d(t        | j                         d)       dd*l*m@}  || j                         t        d+       | jT                  j                  | j
                         | jV                  j                  | j                         | jV                  j                  | j                         t        d,       d | _F        t        rJ	 tx        r| jT                  nd }t        |      | _F        t        d.| j                  j                  d u d/       | j                  | j                  _F        t        | d1      r| jZ                  nd | j                  _-        d | _K        t9        j8                         | _L        t9        j8                         | _M        t        r4	 t               | _K        | j                  rt        d2       y t        d3       y y c c}w # 1 sw Y   xY w#  d| _        Y xY w# tl        $ r Y w xY w# tl        $ r-}t        d |        dd l7}|jq                          Y d }~d }~ww xY w# tl        $ r }t        d#|        d | _;        Y d }~d }~ww xY w# tl        $ r-}t        d-|        dd l7}|jq                          Y d }~d }~ww xY w# tl        $ r}t        d0|        Y d }~d }~ww xY w# tl        $ r}t        d4|        d | _K        Y d }~y d }~ww xY w)5Nui      ══════════════════════════════════u(      🚀 TradingBot.__init__() DÉMARRAGE)rl   rm   rn   )r  r  maxlenFtrading_pause.jsonr  paused_untilr   u      ⏸️ PAUSE ACTIVE: r  min 
s restantsr  r   x   rS   r  u"      🔍 MARKET_REGIME_AVAILABLE = u0      🔧 Initialisation Market Regime Detector...)binance_clientget_market_regime_detectorTforce_updatescoreu"      ✅ Market Regime initialisé: z	 (score:    ) → z positions maxu      ⚠️ Market Regime ERROR: uJ      ⚠️ Market Regime module non chargé (MARKET_REGIME_AVAILABLE=False)u7      ✅ Trade Logger initialisé (logs dans trade_logs/)u'      ⚠️ Trade Logger non disponible: u7      ⚠️ Trade Logger non disponible (import échoué)u)      🔧 Initialisation surveillance IA...u      ✓ AIPredictor obtenu: u#      ✓ SurveillanceService obtenu: u      🔧 Configuration avec  symboles...)setup_klines_fetcheru7      ✓ klines_fetcher configuré sur instances globalesu-      ✅ Service de surveillance IA initialiséu'      ⚠️ Erreur init surveillance IA: u+      ✅ AI Sell Predictor initialisé (LSTM=r  u,      ⚠️ AI Sell Predictor non disponible: r  uG      ✅ FreqAI Manager initialisé (Auto-Retraining + Outlier Detection)u'      ⚠️ FreqAI Manager non disponibleu&      ⚠️ Erreur init FreqAI Manager: )Prp   rj   BINANCE_API_KEYBINANCE_API_SECRETTESTNET_MODEr  _load_watchlistwatch_symbolsr  position_managerr  r  r   r  runninglast_signal
last_trader!   r"   r  r  __file__r#   r   r[   r  rZ   trading_paused_untilrY   rv   signal_cooldowntrend_cooldowntrade_cooldownpending_signals	threading_hot_ai_signalsLock_hot_ai_signals_lock_load_settingssettingsbuys_per_hourmax_buys_per_hourr  surveillance_serviceai_watchlistr  r  _last_regime_sellall_timeMARKET_REGIME_AVAILABLErB   r  detect_regimeget_max_positionsregime_configrz   r  r%  TRADE_LOGGER_AVAILABLEr:   r  r  r;   r<   r   r  _fetch_klines_for_aiset_binance_clientset_on_signal_on_ai_signalset_symbolsr  AI_SELL_PREDICTOR_AVAILABLEr@   modelr   freqai_managerlast_freqai_checklast_watchlist_cleanupFREQAI_AVAILABLErC   )r   r'  
pause_filerd   
pause_data	remaining	_thr_initr  regime_nameregime_detailsmax_posr  
_singletonr}   r  r  rG  s                    r   r   zTradingBot.__init__
  s+   yz89yz##) 
 "113 / < 	//#d>P>P:Q/R595G5GHq%s++H WW\\"''//(";=QR
	*ww~~j)*c* 6a!%1J0:~q0QD-00499;>$'(A(ADIIK(O$P	 8BtIVXL>Ycde4516 6 -.)  " !!
 	&!$-NN$4!++-  !" !$(! "')*&23J2KLM"DE&%9%U"D*$++F.2.@.@.N.N\`.N.a+^,,>>@&**7A6!;!=J!4?
13A
0 :;-yQVPWW]^e]fftuv ^_ ")$4$6!OP
 !%DKL .2->->*!&AB$4$6!3D4E4ET4Q3RST,D,F);D<U<U]a<a;bcd3C8J8J4K3LLYZ >$T%>%>?OP !!44T[[A))778J8JK))55d6H6HIEF "&&J/E$++4);G)D&CDDZDZD`D`hlDlCmmnop
 372H2H/DKDRaDbd.@.@hl+ #!%&*iik#+&8&:#&&cdCD ] I6 6	*()D%d ! 
  &7s;< ##%%&  )?sCD$(!!)<  &?sCD ##%%&  JDQCHIIJ(  +>qcBC&*##+s   -W +W, BW#W,  A?X  W; 7X Y /DY0 A	Z) &&[ [ W)$W, ,	W8;	XX XX 	Y"X<<Y	Y-Y((Y-0	Z&9"Z!!Z&)	[2[[	[6[11[6rP   r   r   c                 <    | j                   j                  |||      S )z$Fetcher de klines pour le service IA)r  r   )r   rP   r   r   s       r   r  zTradingBot._fetch_klines_for_aiB  s    {{005IIr   c                     ddl }t        d| d|j                   d|j                          | j                  5  | j
                  D cg c]  }|j                  d      |k7  s| c}| _        | j
                  j                  ||j                  |j                  xs d|j                  |j                  |j                  xs i |j                  |j                         dd	d

       ddd       yc c}w # 1 sw Y   yxY w)uh   Callback IA → file d'attente prioritaire HOT SIGNAL (réaction immédiate, sans attendre fin de cycle)r   Nu      🔥 HOT SIGNAL reçu: z	 - Score=	 Pattern=rP   r  ACHATT)
rP   r  r  predicted_gainr  featuresstatusdetected_atsmart_signalsmart_eligible)rY   rp   r  r  r  r  rZ   rf  r  r  r  r  )r   rP   r   _t_hotr'  s        r   r  zTradingBot._on_ai_signalF  s    *6()DJJ<yQUQ]Q]P^_`&& 	/3/C/C#a!quuXZ`G`A#aD   '' <<49"&"5"5"oo MM/R++%{{} '"&) 	 	#a	 	s$   C4C/"C/&B C4/C44C=c                 H   	 t         j                  j                  | j                        r!t	        | j                  dd      5 }t        j                  |      }t        |j                  dt                    }|j                  di       }t        |      }|D ]  }||vs|j                  |        t        |      }t        |      |z
  }t        dt        |       d| d|rd	| d
nd d       t        ddj                  |dd D 	cg c]  }	|	j                  dd       c}	       t        |      dkD  rdnd        |cddd       S t        dt        t               d       t        S c c}	w # 1 sw Y   0xY w# t         $ r}
t        d|
        Y d}
~
Od}
~
ww xY w)u  Charge la liste des cryptos depuis watchlist.json (synchronisée avec le dashboard).
        
        🔧 FIX 29/03: Inclut symbols[] (dashboard) + spy_injected{} (spy detections).
        N'inclut PAS auto_added{} (spy scanning only, pas pour le bot).
        r  r   r  r   spy_injectedu      📋 Watchlist chargée: z
 cryptos (z
 dashboard + z spyr  r        r  Nr   r  z...u'      ⚠️ Erreur chargement watchlist: u      📋 Watchlist par défaut:  cryptos)r!   r"   r#   WATCHLIST_FILEr   r[   r  r   rZ   WATCH_SYMBOLSr  rf  r   rp   r  r5  rz   )r   rd   r^   r   r  symbols_setsym	spy_count
dash_countr'  r}   s              r   r  zTradingBot._load_watchlistZ  s   	Aww~~d112$--sWE #99Q<D"488I}#EFG#'88NB#?L"%g,K+ 0k1#NN3/0 !$L 1I!$W	!9J8WjQ[P\\f  AJilmvlww{g|  PR  gS  ST  U  VF499WUXVX\-Zaii.C-Z#["\fijqfruwfw]b}  ]A  B  C"# #$ 	/M0B/C8LM .[# #  	A;A3?@@	AsJ   AF  AE4 A*E4
E/# E4	F  /E44E=9F   	F!	FF!c                    | j                          | j                         }|D ]T  }|| j                  vs| j                  j                  |       t	        d      | j
                  |<   t        d| d       V | j                  dd D ]t  }||vs|| j                  j                  vrF| j                  j                  |       || j
                  v r| j
                  |= t        d| d       ft        d| d	       v y)
u4  Recharge la watchlist (pour mise à jour dynamique)
        
        🆕 FIX 27/02: Gère aussi l'expiration des symboles injectés par le spy.
        Les symboles spy_injected ont un TTL de 24h. Après expiration, ils sont
        retirés automatiquement sauf si une position est ouverte dessus.
        r  r  u      ➕ Ajout u    à la surveillanceNu      ➖ Retrait z de la surveillancer  u"    a une position ouverte, conservé)
_cleanup_expired_spy_symbolsr  r  rf  r   r  rp   r  r  r%   )r   new_symbolsrP   s      r   reload_watchlistzTradingBot.reload_watchlistw  s    	))+**, " 	CFT///""))&1&+3&7F#fX-@AB		C ((+ 	SF[(!6!6!@!@@&&--f5, KK/OF83FGHJvh.PQR	Sr   c                 .   d}	 t         j                  j                  | j                        syt	        | j                  dd      5 }t        j                  |      }ddd       j                  di       }|j                  dg       }t        j                         }g }d}	t        |j                               D ]  \  }
}|j                  d	d
      }|j                  d|j                  dd            }	 t        j                  |      }||z
  j                         |dz  kD  r)|
| j                  j                  vr|j!                  |
        |rg	 ddlm} t+        |      }|rSt        |      D ]E  }||vs||vs|| j                  j                  vs&|j!                  |       t/        d| d       G |r_|D ]-  }
|
|v r|j1                  |
       |
|v r||
= t/        d|
 d       / ||d<   ||d<   |j3                         |d<   t5        |      |d<   d}	|	r|t	        | j                  dd      5 }t        j6                  ||d       ddd       t9        j:                  d      j=                  dt5        |       ddj?                  |              yy# 1 sw Y   <xY w# t"        t$        f$ r- |
| j                  j                  vr|j!                  |
       Y %w xY w# t,        $ r t+               }Y w xY w# 1 sw Y   xY w# t,        $ r Y yw xY w)ug  Retire les symboles injectés par le spy après expiration de leur TTL.

        Mode normal  (deep=False, toutes les 30s) : traite uniquement les entrées
        qui ont une métadonnée 'spy_injected' avec last_surge + ttl_hours.

        Mode profond (deep=True,  toutes les 2h)  : en plus, retire les symboles
        qui n'ont PAS de métadonnée spy_injected mais dont le fichier watchlist.json
        lui-même a été modifié il y a plus de WATCHLIST_BASE_TTL_H heures, ce qui
        signifie qu'ils ont été injectés par le spy lors d'une session passée sans
        jamais être nettoyés.
        0   Nr  r   r  r  r   F	ttl_hoursr  
last_surgeadded_atr  r  r   )r  u      🧹 uG   : hors liste de base + sans métadonnée TTL → retiré (deep cleanup)u      🕵️⏰ u.    expiré (spy TTL) → retiré de la watchlist
updated_atcountTr  r'  r   WatchlistCleanupu   🕵️ u'    symbole(s) spy expiré(s) retiré(s): r  ) r!   r"   r#   r  r   r[   r  rZ   r   r   r   r  r  r  r  r  rf  
ValueError	TypeErrorconfigr  r  rz   rp   r%   r   r   r$  r  r  r   r  )r   deepWATCHLIST_BASE_TTL_Hrd   r^   r  r   r   expiredchangedrP   r   r  last_surge_strr  _base_symbolsbase_setr  s                     r   r  z'TradingBot._cleanup_expired_spy_symbols  s
     "B	77>>$"5"56d))3A $Qyy|$  88NB7Lhhy"-G,,.CGG !%\%7%7%9 : 
/ HH["5	!%,R8P!Q/!)!7!7!GJj(779I<LL!)>)>)H)HH#NN62
/ %E"=1H #G} h.3l3J"$*?*?*I*II 's 3 %5|&} ~	 % cF(v.-(0N6(2`abc #*Y'3^$%(]]_\" #GW$--sWE 1IIdAa01!!"45::s7|n,STXT]T]^eTfSghj o$ $$ #I. /T%:%:%D%DDv./ ! %"uH%81 1
  		s   )L L JBL 4AJ#L K" !L 6L ;L BL 1K<
A
L J L #8KL KL "K95L 8K99L <LL 	LLc                    t        d       t        d       t        d       t        | j                  j                        dk(  rt        d       t        d       yt        dt        | j                  j                         d	       g }g }t	        | j                  j                  j                               D ]  \  }}	 | j                  j                  |      }||dk(  r!t        d
| d       |j                  |       J|d   }|d   }|d   }||z  dz
  dz  }	||k  r0t        d| d|dd|dd|	dd	       |j                  |d|	f       nH||k\  r0t        d| d|dd|dd|	dd	       |j                  |d|	f       nt        d| d|	dd         |D ]W  \  }}}t        d#| d$| d%|dd&       | j                  j                  ||      }|r<t        d'       |j                  |       Y |rtt        d(t        |       d)       |D ]2  }|| j                  j                  v s| j                  j                  |= 4 | j                  j                          t        d*       t        d+t        | j                  j                                t        d       y# t        $ r-}
t        d!| d"|
        |j                  |       Y d}
~
d}
~
ww xY w),u   
        Vérifie et nettoie les positions au démarrage du bot
        Appelle la méthode verify_and_cleanup_positions du PositionManager
        z=
============================================================u1      🔍 VÉRIFICATION DES POSITIONS AU DÉMARRAGE<============================================================r   u'      ℹ️  Aucune position à vérifierz=============================================================
N      📊 u    position(s) détectée(s)
      ❌ u3   : Prix indisponible (symbole invalide ou délisté)r  r  r  r   r  r  z: SL atteint (r  z <= z), P&L: r   r  r  u      🟢 z: TP atteint (z >= r  u      ✓ z: OK (P&L: rd  r  r  u   : Erreur vérification - u"   
   🔄 Fermeture automatique de rb  r  z%)...u3      ⚠️ Échec fermeture, suppression manuelle...u   
   🗑️ Suppression de z position(s) invalide(s)...u      ✅ Nettoyage terminéu   
   📊 Positions finales: )rp   r   r  r  r   r  r  r   rf  rz   rt  r  )r   positions_to_removepositions_to_closerP   rk  rH  r  r  r  r  r}   rO  r>  r   s                 r   verify_and_cleanup_positionsz'TradingBot.verify_and_cleanup_positions  s.   
 	mABft$$../14;<- T22<<=>>Z[\  $T%:%:%D%D%J%J%L M 	3FH3 $ 5 5f = (MQ,>GF8+^_`'..v6&}5$[1	&}5$1K$?1#D"K !I-HVHN=:MTR[\_Q``hixy|h}}~  A&--v{O.TU"k1HVHN=:MTR]^aQbbjkz{~j  @A  B  C&--v}o.VWGF8;t6LBOP/	3< $6 	3FFC7xr&CPT:UZ[\**99&&IFKM#**62	3 05H1I0JJefg- @T22<<<--77?@ !!113-/-c$2G2G2Q2Q.R-STUm-  3
6(*CA3GH#**6223s    ?AJ$BJ$$	K-"KKc                     ddl }ddl}	 d|j                  v r9|j                  |j                  d          ddlmamamamam	a	m
a
mamamamama yy# t         $ r}t#        d|        Y d}~yd}~ww xY w)uN   Recharge dynamiquement le module config.py pour obtenir les dernières valeursr   Nr  )r  r  MAX_ORDER_SIZERSI_OVERSOLDRSI_OVERBOUGHTr  r  	BB_PERIODBB_STDr  REQUIRED_SIGNALSTu)      ⚠️ Erreur rechargement config.py: F)	importlibsysmodulesreloadr  r  r  r  r  r  r  r  r  r  r  r   rz   rp   )r   r  r  r}   s       r   _reload_config_modulez TradingBot._reload_config_module*  ss    	3;;&  X!67   
  '  	=aSAB	s   AA 	A3A..A3c                    | j                          t        t        t        dt        d}	 t
        j                  j                  | j                        rZt        | j                  dd      5 }t        j                  |      }d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   d	d	d	       t        d|d    d|d    d|d    d|d           |S # 1 sw Y   .xY w# t        $ r}t        d
|        Y d	}~Md	}~ww xY w)u   Charge les paramètres depuis config.py (fichier maître pour SL/TP) et bot_settings.json (pour positionSize, autoTrade et maxPositions)T)stopLoss
takeProfitpositionSize	autoTrademaxPositionsr  r   r  r
  r  r	  Nu)      ⚠️ Erreur chargement paramètres: u#      ⚙️ Paramètres chargés: SL=r  z% (config.py), TP=r  z% (config.py), Taille=u	   €, Max=)r  r  r  r  MAX_OPEN_POSITIONSr!   r"   r#   SETTINGS_FILEr   r[   r  rz   rp   )r   r  rd   user_settingsr}   s        r   r  zTradingBot._load_settingsA  sa    	""$ *-*.
	Cww~~d001$,,cGD Q$(IIaLM"m30=k0J-%63@3P0%63@3P0Q 	3HZ4H3II[\deq\r[s  tJ  KS  Tb  Kc  Jd  dm  nv  wE  nF  mG  H  	IQ Q  	C=aSABB	Cs0   AC +:C%C CC 	C?'C::C?c                    | j                   r| j                  j                  sy	 | j                   j                         }|j	                  dg       }d}d}| j                  j                  j                         D ]<  t        fd|D        d      }|s|j	                  dd      }||k  s3|dk  s9|}}> ||fS # t        $ r}t        d|        Y d}~yd}~ww xY w)	z
        Trouve la position avec le score IA le plus faible pour remplacement.
        Retourne (symbol, score) ou (None, 0) si aucune position faible.
        )Nr   all_symbolsNr  c              3   L   K   | ]  }|j                  d       k(  s|  ywrP   Nr+  r-  r'  rP   s     r   r/  z4TradingBot._find_weakest_position.<locals>.<genexpr>r  s!     #X!aeeHoQW>WA#X   $$r  r-   u)      ⚠️ Erreur _find_weakest_position: )	r  r  r  get_surveillance_statusrZ   r  nextrz   rp   )	r   	ai_statusr  weakest_symbolweakest_scoresymbol_datar  r}   rP   s	           @r   _find_weakest_positionz!TradingBot._find_weakest_positiona  s    
 ((0E0E0O0O	11IIKI#--r:K!NM//99>>@ 0"#X{#XZ^_'OOGR8E},(-)/0 "=00 	=aSAB	s*   A.B= B= -B= 3	B= =	CCCc           	         | j                   r	 | j                   j                         }| j                   j                         \  }}| j                  j	                  dt
              }	 ddl m}  |       }|r|j                  |k7  r||_        |dk(  rOt        t        d      r?t        t        dd      }d|cxk  rdk  r#n n t        |dz        }t        d	|d
d|        t        d| d| d|        ||k7  rt        d| d| d| d       |S | j                  j	                  dt
              }
t        d|
 d       |
S # t        $ r Y w xY w# t        $ r,}t        d|        ddl}	|	j                          Y d}~pd}~ww xY w)u   
        Obtient le nombre maximum de positions selon le régime de marché actuel.
        Adaptation dynamique en temps réel - PAS DE LIMITE FIXE.
        r  r   r  	BULL_WEAKr  gQ~jthr  u1      ⚠️ BULL_WEAK + baisse modérée (BTC Mom5=.2%u   ) → Positions réduites à u4      📊 [DEBUG] get_dynamic_max_positions(): regime=z, regime_max=z, settings_max=u      📊 Adaptation dynamique: r  u     positions max (config ignoré: r  u,      ⚠️ Erreur get_dynamic_max_positions: Nu=      ⚠️ Market Regime non disponible - utilisation config: 
 positions)r  r  r"  r  rZ   r  r  r  rz   r   r=   r  rv   rp   r  r%  )r   
regime_maxr  r   settings_max_gmrd_sbtc_mom5r}   r  fallbacks              r   get_dynamic_max_positionsz$TradingBot.get_dynamic_max_positions  s    "&!//AAC
!%!3!3!F!F!HQ#}}00ASTQBb//;>,7) +-'+2W&{OQGH161%(d):%;
 QRZ[^Q__|  ~H  }I  J  K L[MYfgqfr  sB  CO  BP  Q  R -:;-uZLXx  zF  yG  GH  I  J!! ==$$^5GHMhZWabc; ! (  &DQCHI ##%%&s=   AE '%E BE 	E
E EE 	F"F  Fc                    t        dt        | j                         d       t        dt         dt         dt
         dt         dt         dt         d       | j                  D ]  }|| j                  vrt        d	
      | j                  |<   | j                  j                  |t        d	      }|sN|D ],  }| j                  |   j                  t        |d                . t        d| dt        | j                  |          d        y)u   Charge les données historiquesu/   
📊 Chargement des données historiques pour z cryptos...u    ⚙️  Paramètres actifs: RSI=r  z, EMA=z, SL=z%, TP=r  r  r  r{  r  rT  z bougiesN)rp   r   r  r  r  r  r  r  r  r  r   r  r   DEFAULT_INTERVALrf  r\   )r   rP   r  r  s       r   load_historical_datazTradingBot.load_historical_data  s"   @TEWEWAX@YYdef0a?OvV_U``abjakkp  rC  qD  DJ  K^  J_  _`  a  	b(( 	NFT[[(&+3&7F#[[++F4DcJF <AKK'..uQqT{;<xr#dkk&.A*B)C8LM	Nr   c           	         t         j                  j                  t        dd      }	 t         j                  j	                  |      rdt        |dd      5 }t        j                  |      | _        ddd       t        dt        | j                  j                  di              d	       y
	 i | _        y# 1 sw Y   ExY w# t        $ r}t        d|        Y d}~i | _        yd}~ww xY w)u2   Charge le cache IA avec les scores d'opportunitéscrypto_cachezcrypto_data.jsonr  r   r  Nu      🧠 Cache IA chargé: r   r  Tu&      ⚠️ Erreur chargement cache IA: F)r!   r"   r  r  r#   r   r[   r  ai_cacherp   r   rZ   rz   )r   
cache_filerd   r}   s       r   load_ai_scoringzTradingBot.load_ai_scoring  s    WW\\*n>PQ
	@ww~~j)*cG< 1$(IIaLDM123t}}7H7HTV7W3X2YYabc	 * 1 1  	@:1#>??	@s/   -B? B3/:B? 3B<8B? ?	C'C""C'c                    | j                   r| j                  rx	 | j                   j                         }|j                  dg       |j                  dg       z   }t	        | j                   d      r| j                   j
                  nd}|r0t	        |d      r#|j                  j                         D ]  \  }}||k(  st	        |d      r|j                  ndt	        |d      r|j                  j                  d	d      ndt	        |d      r|j                  nd
dk\  rdn t	        |d      r|j                  nd
dk  rdndt	        |d      r|j                  ndt	        |d      r|j                  nd
t	        |d      r|j                  ndt	        |d      r|j                  j                  dd
      nd
ddc S  |D ]  }|j                  d      |k(  s|j                  dd      |j                  di       j                  d	d      |j                  dd
      dk\  rdn|j                  dd
      dk  rdnd|j                  dd      |j                  dd
      |j                  dd      |j                  di       j                  dd
      ddc S  	 t	        | d      r| j                  s| j                          | j                  j                  di       }||vrddddddS ||   }	|	j                  di       }
|	j                  di       }d}|
j                  d	d      }|dk  r|dz  }n6|d k  r|d!z  }n+|dk  r|d"z  }n |d#kD  r|d$z  }n|d%kD  r|d&z  }n
|dkD  r|d'z  }|j                  d(d      }|dk(  r|d&z  }n
|dk(  r|d&z  }|
j                  d)i       }|j                  d*d
      }|d
kD  r|d+z  }n
|d,k  r|d+z  }|j                  d-d      }|d.k(  r|d&z  }n
|d/k(  r|d&z  }|
j                  d0d1      }|d2k  r|d"z  }n
|d3kD  r|d"z  }t!        d4t#        d
|            ||d||	j                  d5d
      |	j                  d6d
      dd7S # t        $ r}Y d}~d}~ww xY w)8uI   Récupère le score IA d'une crypto - utilise le service IA si disponibleready_signalswatching_signals	predictorNr  r  r-   r  r%  r   r  r6  r  r7  neutralr  r  r  rO  r  price_currentT)r  r%  trendr  r  rO  rW   from_ai_servicerP   r-  r   F)r  r%  r6  r  r7  
indicatorssignalsr  rc  r  r   rv  r  r  r  rS   r6  macd	histogramr  rw  
rsi_signaloversold
overboughtbb_positionr  r  r  r  rW   priceChangePercent)r  r%  r6  r  macd_histogramrW   
change_24hr7  )r  r  r  rZ   r   r3  r  r  r  r  r  r  rO  rz   r-  r/  r8  rh  )r   rP   r  all_signalsr3  r  r   r}   r   r^   r8  signals_cacher  r%  r6  r:  r;  r<  r?  s                      r   get_ai_scorezTradingBot.get_ai_score  s    $$):):#22JJL$jj"=

K]_a@bb DK4KdKdfqCrD55??x|	K!@%.%8%8%>%>%@ 	T&=7>tW7MSUGNtU_G`t}}'8'8'CfhELTSZE[tzzabgi6i  LS  TX  Za  Lb  ~B  ~H  ~H  hi  mo  }oox  u~;B4;S4<<YbAH|A\doobc9@x9P$++VXRYZ^`jRk):):?A)Nqr37	$ 	 ( Dxx)V3%)XXgr%:#'88J#;#?#?r#J26((7A2F"2LY_c_g_ghoqr_svx_xR[  H'+xx	9'E*.((<*C&*hhx&<%)XXj"%=%A%A/ST%U/3	  	  tZ(  "--##Ir2 Y9inoovXXlB/
B/  nnUB'8RKE2XRKE2XRKE2XRKE2XRKE2XQJE !!'95IRKEiRKE ~~fb)HH[!,	q=QJEQJE #&&|Y?
#RKE<'RKE !nn]C8RKE3RKE c!Um, 'XXgq)((#7;$	
 		
}  s,   B#Q  C:Q ;Q B:Q Q 	Q"Q"c           	          | j                   r| j                  sdddddg g ddS | j                   j                         }d|d<   |S )z:Retourne le statut de la surveillance IA pour le dashboardFr   )
is_runningtotal_symbolsanalyzedready_to_buywatchingtop_opportunitiesr1  ai_availableTrM  )r  r  r  )r   r  s     r   r  z"TradingBot.get_surveillance_status<  sZ    ((0A0A#!" !%'!# %	 	 **BBD!%~r   c                 R    | j                   sg S | j                   j                         S )u)   Retourne la watchlist IA triée par score)r  get_watchlistr,   s    r   get_ai_watchlistzTradingBot.get_ai_watchlistO  s%      I  ..00r   c                 &   ddd}	 | j                   j                  |t        d      }|r*t        |      dk\  r|D cg c]  }t	        |d          }}nt        | j                  |         }d}g }g }	 |r6|D cg c]  }t	        |d          }}|D cg c]  }t	        |d	          }}t        |      dk  rd
i dfS |d   }t        j                  |t              }	t        j                  |t              }
t        j                  |t              }t        j                  |      \  }}}t        j                  |ddd      \  }}}t        j!                  |d      }t        j#                  |      \  }}}t        j%                  |t        t        d      \  }}}t        j'                  |d      \  }}t        j)                  |t              \  }}t        j+                  |      \  }}}} d}!d}"d}#t        |      dk\  r|
r|rt        j                  |dd t              }$t        j                  |dd t              }%t        j                  |dd t              }&t        j                  |dd t              }'t        j                  |dd t              }(t        j                  |dd t              })|$r|%r|$|%k  }*|
|kD  }+|*r|+rd}"d}!|!s|&r|'r|&|'k  },|
|kD  }+|,r|+rd}!|!s|(r|)r|(|)k  }-|
|kD  }+|-r|+rd}!|!sF|$rD|%rB|r|
|z
  |z  dz  nd}.|%r|$|%z
  |%z  dz  nd}/|.|/kD  }0t-        |.      dk  }1|xr |dkD  }2|0r|1r|2rd}#|!s|#s|$r|%r|r|
|z
  |z  dz  nd}.|%r|$|%z
  |%z  dz  nd}/t        |      dk\  r|d   |d   z
  |d   z  dz  nd}3t        |      dk\  r|d   |d   z
  |d   z  dz  nd}4|3|4kD  }5|.|/kD  }6|6rt-        |.      dk  r|3dkD  r|5r	|r|dkD  rd}#| j/                  |      }7|7j1                  dd      }8|7j1                  dd      }9|9r|7j1                  d      xs dnd}:d};g }<t3        |xr | dk(        }=|dk(  r|r|dk  rd};|<j5                  d       |r|d k  rd};|<j5                  d!|d"d#       t        |      dk\  r-|d   }>||>z
  |>z  dz  }?|?d k  rd};|<j5                  d$|?d%d#       t        |      dk\  r-|d&   }@||@z
  |@z  dz  }A|Ad'k  rd};|<j5                  d(Ad%d#       |	r|	d)k  r|r|d*k  rd};|<j5                  d+       |rV||k  rQ|=sOt        |      dk\  rAt7        |d,d&       dz  }Bt7        |d&d       dz  }C|C|Bk  }D|Ds|d-k(  rd};|<j5                  d.       |
r(|r&|
|k  r!|r|d/k  r|=sd};|<j5                  d0|d%d1       |
rC|rA|
|k  r<t        |      dk\  r.||d&   z
  |d&   z  dz  }E|Edk  rd};|<j5                  d2Ed%d3       |8r|8dk  r|=sd};|<j5                  d4|8 d5       d}Fg }G|d6k(  r|
r|r|
|z
  |z  dz  }HFd7z  }FGj5                  d8|Hd%d#       |	r!|	dk  rFd7z  }FGj5                  d9|	d"d5       n"|	r |	d:k  rFd;z  }FGj5                  d<|	d"d5       |r |d=kD  rFd;z  }FGj5                  d>|d"d#       ||
kD  r||kD  rFd;z  }FGj5                  d?       n|s|d@kD  r| dk(  r`Fdz  }FGj5                  dA|dBd#       |d6k(  s|r|dkD  rFd7z  }FGj5                  dC       |	r|	d:k  rFd;z  }FGj5                  dD|	dBd5       n|dkD  r|d6k(  rFd7z  }FGj5                  dE|dBd#       |rg|dkD  rbFd;z  }FGj5                  dF       nK|d6k(  rF|rD|rB|dGk  r=Fd7z  }FGj5                  dH|d"d#       |	r |	dk  rFd;z  }FGj5                  dI|	dBd5       |r||dJz  k\  r||k  r||z
  |z  dz  }I|rz|dkD  rt|xr ||kD  }J|xr	 |xr ||kD  }KJr"Kr Fdz  }FGj5                  dKId"dL|d"d#       nAJr Fdz  }FGj5                  dMId"dN|d"d#       nFd7z  }FGj5                  dOId"dN|d"d#       |d6k(  rFd;z  }FGj5                  dP       n|r||kD  r|xr ||kD  }Lt        |      dk\  r|dd }Mt        |      dkD  rt        j                  |dd       d   n|}N|NrMd   Nk  nd}O|Or||z
  |z  dz  }PLrFdz  }FGj5                  dQPd%dR       nFdz  }FGj5                  dSPd%dT       |d6k(  rFd;z  }FGj5                  dU       |r |dkD  rFd;z  }FGj5                  dV|d"d#       d}Q|	rT|	dWkD  rNd}R|
r|r|dkD  r|
|z
  |z  dz  }Rd}Sd}Tt        |      dk\  r||d&   z
  |d&   z  dz  }St        |      dk\  r||d,   z
  |d,   z  dz  }TRd=kD  xr Sd=kD  xr TdkD  xr |	dXk  }U|UrGj5                  dY|	dBdZRd"d[Sd"d#       n|r'||kD  r"|r |dkD  rGj5                  dY|	dBd\|d"d#       n|	d]k  r.Usd}Qt9        dFd;z
        }FGj5                  d^|	d"d_Rd"d#       n_|xr ||kD  xr |xr |d`kD  xr RdakD  }V|Vs(d}Qt9        dFd7z
        }FGj5                  db|	d"dc       nGj5                  dY|	dBdd|d"d#       t        |      dk\  rPt9        |ded       }W|W|z
  |Wz  dz  }X|Xdk  r2|xr ||kD  }Y|Ys'd}Qt9        dFd7z
        }FGj5                  dfXd"dg       d}Zg }[t        |      dk\  r||d   z
  |d   z  dz  nd}\t        |      dk\  r||d&   z
  |d&   z  dz  nd}St        |      dk\  r||d,   z
  |d,   z  dz  nd}T|
r|r|
|z
  |z  dz  nd}R|RdkD  xr \dkD  xr SdkD  }]|	r#|	dhkD  r]sDZd7z  }Z[j5                  di|	d"d5       n(|	r&|	t:        kD  r]sZd;z  }Z[j5                  dj|	d"d5       |r||kD  r]sZd;z  }Z[j5                  dk       |;r$t        |<      d7k\  rZd7z  }Z[j5                  dl       |r!|dk  rZd7z  }Z[j5                  dm|d"d#       n"|r |d k  rZd;z  }Z[j5                  dn|d"d#       |
r|r|
|k  r]sZd;z  }Z[j5                  do       |
r"|r ||
k  r||k  rZd;z  }Z[j5                  dp       i dq|	dr|
ds|dt|||fdu|||fdv|dw|dx|dy|dz|d{|d||d}|d~|d|d|d| |8|;|<FZd}^t        | j<                  j>                        }_d}`g }a|;rd}`ajA                  |<       |	r|	dkD  rd}`aj5                  d|	dBd5       t        |      dk\  r.||d   z
  |d   z  dz  }b|bd k  rd}`aj5                  dbd%d#       t        |      dk\  r.||d,   z
  |d,   z  dz  }c|cdk  rd}`aj5                  dcd%d#       |8dk  rd}`aj5                  d|8 d5       n|8dWk\  rFd;z  }FGj5                  d|8        t        |      dk\  r.||d&   z
  |d&   z  dz  }E|Edk  rd}`aj5                  dEd%d#       t        |      dk\  r7||de   z
  |de   z  dz  }d|ddk  r!|8r|8dXk\  s|=sd}`aj5                  ddd%d#       | jC                         }e|:dvrNtE               }f|fjG                  |:|8      \  }g}h|gstI        d| d|: dh        d
^d|h fS fjK                  |:       |:dk(  rtI        d| d       d
^dfS |
r|r|
|kD  s|#s|=rFdk\  sd
^dfS |	r|	dkD  r\d=kD  xr Sd=kD  }i|
xr |xr |
|z
  |z  dz  dkD  }j|8xr |8dWk\  }k|	dkD  rtI        d| d|	dBd       d
^d|	dBdfS |	dkD  r!irjstI        d| d|	dBd       d
^d|	dBdfS |	dkD  r#is!jskstI        d| d|	dBd       d
^d|	dBdfS tI        d| d|	dBd\d"dj d|8 d5       |"rA_ek  r<\dkD  }l|lr!|
r|r|
|z
  |z  dz  nd}md|md%d|	dBd}nd^|nfS tI        d| d\d"d       n|!rZ_ek  rU|8r|8dk  rnTrTdk  rnd}ot        |      dk\  r||d   z
  |d   z  dz  }b|bdkD  }oorY|
|z
  |z  dz  }md|md%d|	dBd|8 }nd^|nfS |#r:_ek  r5|8r3|8d@k\  r.|	r,|	dk  r'|
r|r|
|z
  |z  dz  nd}Rd|Rdd\d"d|	dBd|8 }nd^|nfS |8r|8dXk\  rdnd}p`r3_ek  r.Fpk\  r)|
r|r|
|z
  |z  dz  nd}HdF dp d|Hd%d|	dBd|8 
}nd^|nfS `rFpk  rn`sar	 _ek  r|;s|
r|r|
|kD  rFdk\  r|
|z
  |z  dz  }qd}ot        |      dk\  r||d   z
  |d   z  dz  }b|bd*kD  }od}rt        |      dk\  r t9        |ded       }W|W|z
  |Wz  dz  }s|sdk  rd}r|r*|dkD  r%|	r#|	dXk  r|8dk\  rorrsdF dqd%d|	dBd|8 }nd^|nfS || j<                  j>                  v r| j<                  j>                  j1                  |      }t|trtj1                  d|      }u||uz
  |uz  dz  }v|vdk\  rdvd%d}nd^|nfS |
r,|r*|
|kD  r%|
|z
  |z  dz  }H|HdkD  rvdakD  rdHd%dvd%d}nd^|nfS d}w|
rD|rB|r@|
|z
  |z  dz  }xd}St        |      dk\  r|d   |d&   z
  |d&   z  dz  }SxdkD  r|dkD  rSdkD  rd}w|	r|	d]kD  rvdkD  rwsd|	dBdvd%d}nd^|nfS Zdk\  rvd kD  rdZ dvdǛd}nd^|nfS vtL         k  rdvd%d}nd^|nfS d
^dfS c c}w #  t        | j                  |         }d}Y uxY wc c}w c c}w # t        $ r g }g }Y Uw xY w)u  
        ANALYSE AMÉLIORÉE v2.0 - Ne jamais acheter en tendance baissière!
        
        Règles strictes:
        1. JAMAIS acheter si EMA/Bollinger orientés à la baisse
        2. Détecter les breakouts pour réagir aux hausses
        3. Utiliser le scoring IA du cache
        4. Trailing stop dynamique pour ne pas vendre tôt
        5. NOUVEAU: Adapter selon régime de marché (BULL/NEUTRAL/BEAR/CRASH)
        r  T)regimeallow_tradingr  r-   r{  NrS   r|  r  u   Pas assez de donnéesr2  r  r   r  r  FrE  rO  r   rP  rh   r  r  r7  r  rQ  rS  rR  zBB + EMAs en chuterg  zMomentum tres negatif (rX  r  zChute forte (r   r5  r  zChute prolongee (r  rw  zRSI extreme + Momentum negatifr~  r7  u7   Prix < EMA21 descendante (tendance baissière continue)re  u%   EMA9 < EMA21 + pente EMA9 négative (z%) = Baisse activez!EMA9 < EMA21 + Prix baisse 5min (z%) = INTERDICTION ACHATzScore IA trop faible (r  r6  r'  u   Tendance haussière EMA (+zRSI FAVORABLE (7   r   zRSI acceptable (r  zMomentum+ (zPrix > EMAsr  zSQUEEZE BREAKOUT UP (force=r  zEMA favorablezRSI marge (zSQUEEZE TENSION (force=z	Momentum+r  zPULLBACK EMA (z
RSI cool (g
ףp=
?u   🎯 SETUP OPTIMAL: KC>BB+ (z% de BB+, mom=u    PRÉ-BREAKOUT BB+ CONFIRMÉ KC (z% restant, mom=u   PRÉ-BREAKOUT BB+ (z"EMA + approche BB+ = setup parfaitu   🚀 DOUBLE BREAKOUT BB+KC (+z% BB)zBB+ BREAKOUT (+z% au-dessus)zEMA + BB+ = double confirmationzMomentum fort (r  rv  u   ✅ RSI u    accepté (tendance forte: EMA+z%, Mom5=u#    accepté (BB+ breakout + momentum r  u   ⚠️ ZONE HAUTE (RSI=z) sans tendance forte (EMA+r  rG   u   ⚠️ RSI ÉLEVÉ (u    > 70) - pénalité signalu(    accepté (breakout extrême + momentum iu   ❌ PROCHE MAX 20min (z	% du max)P   zRSI surachat extreme (zRSI surachat (zPrix > BB hautezTendance baissiere confirmeezChute rapide (zMomentum negatif (zEMA death crosszPrix sous EMAsr%  r;  r<  bbkcbb_directionbb_bandwidthema_alignment	ema_sloperW   r3  is_breakoutbreakout_strengthis_pullbackrq  rr  squeeze_breakout)ai_score
is_bearishbearish_reasonsbuy_signalssell_signalsN   zRSI trop haut (zPrix en baisse (r  u   Momentum 10min négatif (#   zScore IA trop bas (z
IA: Score r  zChute 5min (u   Tendance 20min baissière ()Nr  r4  rI  
: Pattern u    bloqué - u   Pattern bloqué: END_OF_CYCLEu      🔴🔴🔴 u4   : PATTERN END_OF_CYCLE détecté - ACHAT BLOQUÉ !!!z%END_OF_CYCLE pattern - Achat interditz%EMA9<EMA21 (bearish) - Achat interditr  r  r  z: RSI trop haut (z > 78) - FIN DE CYCLEzRSI z > 78 - Achat interditH      : RSI élevé (z) sans tendance fortez$ > 72 sans momentum - Achat interditz) sans aucun supportz# > 65 sans support - Achat interditr  : RSI u    accepté (Mom3=z%, EMA_bull=z, AI=uE   🚀🚀🚀 GOLDEN CROSS IMMÉDIAT (1 bougie) ! EMA9 croise EMA21 (+z%), RSI=z - ACHAT PRIORITAIREr   r  u6   : Golden Cross immédiat IGNORÉ - Chute brutale Mom3=r  u-   ⚡ GOLDEN CROSS (2-3 bougies): EMA9>EMA21 (+r  u'   🔮 EARLY MOMENTUM: EMA convergentes (z.3fz	%), Mom3=r  zACHAT HAUSSIER (zpts/zreq): EMA9>EMA21 (+r  zTREND FOLLOWING (zpts): EMA9>EMA21 (+z%), Momentum+, RSI=r  zTAKE PROFIT: +r   zSELL REBOND: EMA9>EMA21 (+z
%), P&L: +zSELL SURACHAT: RSI=z, P&L: +zSELL SIGNAL TECHNIQUE: z signaux baissiers, P&L: rd  zSTOP LOSS: zConditions non remplies)'r  r   r)  r   r\   r   r  rz   r  r%  r  r*  r  r  r0  r  r3  ra  r  r  rM  rt  ry   rE  rZ   boolrf  rg  rh  r  r  r  extendr'  r   is_pattern_allowedrp   record_signalr  )yr   rP   regime_infor  r  r  volumes_list_abuy_vols_list_arH  r%  r;  r<  rW  rX  rY  rN  rO  rP  r3  rY  bb_expandingbb_sloper[  ema_strengthr\  r]  r^  r_  pullback_distancerq  rZ  rr  r`  golden_cross_recentgolden_cross_immediategolden_cross_imminent
ema9_prev1ema21_prev1
ema9_prev2ema21_prev2
ema9_prev3ema21_prev3was_below_1is_above_nowwas_below_2was_below_3ema_gap_nowema_gap_prevgap_reducing	gap_closemom_okmom3	mom3_prevmom_acceleratinggap_convergingai_datara  ai_from_service
ai_patternis_bearish_trendrc  squeeze_overrideprice_3_agoprice_change_3price_5_agoprice_change_5price_avg_5_agoprice_avg_nowema21_fallinglast_5_changerd  buy_reasonsema_gapapproach_distancekeltner_confirmedrR  keltner_breakoutprices_recentrZ  was_below_bbrT  high_zone_blockr  r  r  rD  is_extreme_breakoutmax_20distance_from_maxis_bb_activere  sell_reasonsr  r  r8  current_positionscan_buyblock_reasonslast_3_changelast_10_changelast_20_changemax_positionsrq  pattern_allowedpattern_reasonis_strong_momentumema_strongly_bullishhigh_aimomentum_okema_gap_crossrO  	last_3_okmin_buy_signalsema_gap_bullish	near_peakpeak_distancerk  r  rZ  strong_uptrend_posema_diffsy                                                                                                                            r   analyzezTradingBot.analyzeU  s    "+TB		[[66v?OQTUF#f++/56!%!+66dkk&12 	!7=!>!%!+!>!>8>"?151;"?"?
 v;2666r

 "%%fj9'++FI>	&**68<%8%B%B6%J"&(%8%I%I&RTVXZ]%^"&(&//;
 0C/R/RSY/Z,lH1D1N1NvW`bjln1o.|Y)<)O)OPVXZ)[&&)<)O)OPVXa)b&& H[GlGlmsGtD
L"24D
 $!& %v;!	h,00iHJ-11&"+xHK -00iHJ-11&"+xHK -00iHJ-11&"+xHKk(;6(83<-1**.' ':+(;6(83<*.' ':+(;6(83<*.' ':+KS	H 4@CGYZS^k!9[ HCOde*\9,t3	!2hlI&,0) '/DXcKS	H 4@CGYZS^k!9[ HCOdeILVXYIYfRj0F2J>#E_`NQRXk]^N^fRj6":5CsJde	#')#3 !,|!; #s;'7$'>3J#3A,0) ##F+;;w+!++&7?>Mgkk),9	SW
 !   %$
 6!iI4D#""#78 4#""%<XcN"#MN v;! *K,{:kISPN$#' &&~c6J"'MN v;! *K,{:kISPN$#' &&):>#:Nb'QR 38X_#""#CD 09I6{b "%fSn"5"9 #F23K 01 4 - ? !MY$>'+$#**+de
 i(&:yYY]M]fv#""%J9UX/Yk#lm i(&:s6{a?O+fRj8F2JF#MMt##' &&)J=Y\J]]t'uv
 2.>#""%;H:Q#GH  I%)!H,8C?G1K!;GC=KL sRxq ""_SIQ#?@rq ""%5c#Ya#@A HsNq ""[#b#AB y(]X-Eq ""=1 +b04'q ""%@AQRU@VVX#YZ !I-)	D@P1$K&&7 381$K&&SIQ'?@!B&=I+Eq ""%<=Mc<RRT#UV 11$K&&{3 i'K<M 3&q ""^4Ec3J"#MN381$K&&C9A'>? D8]X=U"*]":m!Ks RHsN%+%F0F!  (LHLH9L$1$K&&)EFWX[E\\jkstwjxxz'{|&1$K&&)IJ[\_I``opxy|o}}  (A  B1$K&&)<=Ns<SSbcklobppr'st !I-1$K&&'KL -(2 !) E]X-E 6{a &rsQTU[Q\_aQa 3 = =fSbk J1 MgoCP}Q/-?V[  $1H$<#HC"OK'#q(#**-J;WZJ[[`+ab#q(#**_[<M\+Z[ %	1#q(#**+LM  HsN#q(#**_XcN"+MN   38KX(Q, )H 4@CG JK6{a,vbz9VBZG3N
6{b  -s ;vc{JcQ c! S c! b	  !""Xc#Y6UVabeUffnoyz}n~  A  $B  C mh68SV""Xc#Y6YZbcfYggi#jk (&*O"%aq"9K&&)@S	Idepqtduuw'xy (0 (8MH4L (8&.(83;c>(8&1C&7 $ +&*O"%aq"9K&&)=c#YF`'ab&&#c:bcklobppr'st v;"&F"(="8F!Bc I 3& ( E]X-E#&*O"%aq"9K&&)?@QRU?VV_'`a  KNf+YZJZ}vbz1VBZ?3F`a
JMf+YZJZ}vbz1VBZ?3F`a
MPQW[\^M^s3vc{BcIde ENRZ	H,83>ab%/Sj3.>S:PSCS 38!!##&<SIQ$GHS>)!!##nSIQ$?@ 0!!##$56 O 4 9AL >? 2AL.#b AB(T/AL"4XcN" EF i(&:!!##$56 mi&?MT\D\AL 01
3

 
 8VX.	

 8VX.
 L
 L
 ]
 
 ]
 
 ;
  !2
 ;
 *
   0!
"  0#
$ !*.&(-

4   5 5 ? ?@ 
 G  1 38G  ?3s)1!=> v;!+fRj8F2JF#MMt#$$'7c7J"%MN v;",vc{:fSkISPN$$$'@PS@TTV%WX b=G  #6xj!BC^1KH:67 v;!+fRj8F2JF#MMt#$$|M#3Fb%IJ v;",vc{:fSkISPN$h8r>Sc$$'B>RUBVVX%YZ 668 99$&B.0.C.CJPX.Y+O^"
:,k.IYZ[z->~>N+OOO Z( '$VH,`ab:'NNN h9x+? )2B{VWGWz+RRR 38",s"2"GzC7G$- %U( %U&/(&:h%F#$MPT$T !2HNGRx(9#cBWXYzT#c:P+QQQr#5:NCy@UVWzT#c:^+___r#59MQX Cy@TUVzT#c:]+^^^ xvc#Y6FzRUFVVbcwbxx}  G  ~H  HI  J  K "&7-&G
 &,KNW\d)h"6(!Bc Ikl`anor`ss{|  AD  |E  EY  Zj&00
6(*`aklo`ppqrs !%6%F HrMt!3 !	v;!#&3fRj&@F2J%NRU$UM - 4I&/(&:h%F#$MML][^L__ghklogppuv~u  AF *f44 #'8='HHNssRxLUZb	H 4@CGijB;sBSS\]ghk\llstwx{s|  }B  CK  BL  Mj&00 !)X^!!(=8[O=[DMRZ	H,8C?abG'}D8II\]deh\iiqruvyqzz  AI  @J  KF*f,,6] },5E X)h*>;RSCS$-$8H#D"K 	v;!#&3fRj&@F2J%NRU$UM - 4I "	v;"$ .F&,}&<%F#$MM$s*$(	1rhRTnYbkt0=PQ`adPeexy|  ~A  yB  BG  HP  GQ  RF *f44
 T**444,,66::6BH&ll=-H)K7;F#M c>-gc]!<F!:v55 i(.B )H 4@CGG}3#=gc]*U\]`Taab!c%z699 &+"h!*X!5 ASHH!"J6{a''-bzF2J'>&*&LPS%S
!|3:;K-1*38!<N23s)8GC=PQRF!:v55
  1$46|nD]^efj]kklmF!:v55 ///*73-q9F!:v55 z#<<<u 7	$++f-.FF "?"? 	!N O	!s^   5AK AJ?AK 3AK0 9AK&AK0 AK+)AK0 J?AK KAK#K&
AK0 K0ALL ALNc                 "   | j                   t        j                         kD  rJt        | j                   t        j                         z
        }|dz  }|dz  }t        d d| d| d       y| j                  }|r:|j                  d      }	|j                  d      }
|	r|	d	kD  r|
d
k(  r| j                  }| j                  v rJt        j                         | j                     z
  }||k  r!t        ||z
        }t        d d| d       y| j                  v r^t        j                         | j                     z
  }|| j                  k  r+t        | j                  |z
        }t        d d| d       yt        | j                  di       }|v rSt        j                         |   k  r9t        |   t        j                         z
        }t        d d|dz   d       y| j                         | _        t        | j                  j                        }| j!                         }|dk(  r҉| j                  j                  vr| j                  j                  dd      st        d d       y|r^|j                  dd      }|j                  dd      }|dk  r|dk  rt        d d|d d!|d"d#       y|d	k  rt        d$ d%|d d&       ||k\  rt        d d'| d(| d)       y	 dd*lm}m} t)        j*                         j,                  }|r||v rt        d+ d,| d-       yt)        j0                         j,                  }| j2                  j                  |d      }d}| j4                  rU| j4                  j7                         }|j                  d.g       }t9        fd/|D        d      }|r|j                  d0d      }|d1k\  r#t        d$ d2| d3| d(| j:                   d)	       n2|| j:                  k\  r#t        d4 d5| d(| j:                   d6| d7	       y| j<                  j?                  d8      }|st        d d9       y| j                  j                  d:t@              }|}|d;   |d<z   k  r6tC        |d;   d<z
  d      }t        d d=tD        jG                  |              |r~|j                  dd      }tI        | d>      xr | jJ                  d?k(  }|d@kD  r0|s.|dAz  }t        d dB|dCdDtD        jG                  |              n|d@kD  r|rt        dE dF|dCdG       t        dH dItD        jG                  |d;          dJtD        jG                  |       dKtD        jG                  |              |tL        k\  
r.t        dL dM|dNz    d(| d)       d}| j4                  r| j4                  j7                         }|j                  d.g       }t9        fdO|D        d      }|rL|j                  dPi       }|j                  dd      }|j                  d0d      }t        dQ dR| dS|d d)       tN        }tP        } tI        tR        dT      rtt        tR        dTd      }!tI        | d>      xr | jJ                  dUv }"|"s0|!dVk  rdW}t        dX|!dYdZ       n-|!d[k  r(d\}t        d]|!dYd)       n|!dVk  rt        d^|!dYd_       d`}#|r<da|v r8db|v r4|da   }|db   } |j                  dcd      }$d}#t        dd| de|  df|$ dg       nt        dh| de|  di       |#stI        tR        dT      rt        tR        dTd      }!	 | j<                  jU                  djdkl      }%t        |%      dmk\  rS|%D &cg c]  }&tW        |&dn          }'}&tX        j[                  |'do      }(tX        j[                  |'dp      })t        |'      dnk\  r|'dq   |'dr   z
  |'dr   z  dsz  nd}*t        |'      dtk\  rtX        j]                  |'du      nd}|(r|)r|(|)z
  |)z  dsz  }+|+dvkD  xr |*dwkD  },|+dxkD  xr |*dxkD  }-|!dykD  r2|,rdz} t        d{|!d|d}|+d~d|*d~d#       ny|-rwd} t        d|!d|d       nd|!dkD  r%|,rd} t        d|!d|d       nJ|-rHd} t        d       n:|!dVkD  r#|,rd} t        d|!dYd       n d} t        d       nd} t        d|!d|d       | j`                  r	 | j`                  jc                  d      \  }/}0|#s|/dv rCt        d|/ d| d)       t        d       |/| _%        	 ddl0m2}1  |1       }2|2r|/|2_%        |0|2_3        y|/dk(  r1dW}d} |dz  }t        d| de|  dtD        jG                  |       d       |/| _%        	 ddl0m2}1  |1       }2|2r|/|2_%        |0|2_3        | jh                  r|r	 | jh                  jk                  t)        j0                         d|j                  d0d      |j                  d      xs d|j                  dd      |j                  dd`      |j                  dPi       || |#r$n| |z  |#dd|d       d`}3|r|j                  dPi       }djm                  |j                  dg             }4d|4v sd|v rd}3|j                  dg       D ]b  }5d|5v sd|5v s	 |5jo                  d      dN   jo                  di      d   }6tW        |6      }7|7dkD  r|7dAz  }8| |8z  } t        d|7d"d| dCdi        n t        d       d}9|r|j                  d      xs d}9|9dv rI|j                  dg       }:|:D ]2  };d|;v rd}9 n*d|;v rd}9 n"d|;v rd}9 nd|;v rd}9 nd|;v rd}9 n
d|;v s0d}9 n |9dv r-|j                  d0d      }<|<dk\  rd}9t        d d|< d|9        |9dv r3|r1d|v rd}9nd|v rd}9nd|v rd}9nd|v rd}9|9dk7  rt        d d|9        |9dv r-|r+|j                  dd      }=|=r|=dvr|=}9t        d d|9        	 ddl8m9}>  |>       }?|?ju                  |9      st        d d|9 dŝ       y	 	 | j<                  jw                        }@|@r@dN| dsz  z   z  }A| j<                  jU                  ddsl      }B|Br^t        B      dk\  rOBD &cg c]  }&tW        |&d          }C}&BD &cg c]  }&tW        |&d<          }D}&i }Ety        C|D      D ]p  \  }F}G@|Fcxk  rAk  sn t{        F@dz  z        |@dz  z  }H|HEvr	ddddʜEH<   EH   dxx   dNz  cc<   |E|H   dxx   Gz  cc<   tC        |E|H   d   F      |E|H   d<   r d}It}        Ej                               D ],  }HE|H   }J|Jd   dk\  sJd   dz  }K|K@z  dNz
  dsz  }L|Ldk\  s*J}I n IrLId   }M|Mdz  }N|N@z  dNz
  dsz  }O|Odk\  r2O| k  r-t        dω dMdћdId    d| dCdOdCdi       t{        |Odȫ      } | j                  j                  d||| |3|9ի      }P|PrT|dNz   | j2                  |<   ||dNz
  dz  g}Q| j2                  j                         D RSci c]  \  }R}S|RQv sRS c}S}R| _        | jh                  rPr|r	 tW        Pj                  di g      d   j                  dd            }T|Tdk(  r| j<                  jw                        }T| jh                  j                  i dt)        j0                         dډdddTdtW        Pj                  dd            d|d|TdN|dsz  z
  z  d|TdN| dsz  z   z  d|d| d| |z  d|#d|j                  d0d      d|j                  d      xs dd|dP|j                  dPi              t        j                         | j                  <   t        j                         | j                  <   yt        d dtD        jG                  |       dtD        jG                  tL               d)       y|dk(  r| j                  j                  v rmt        d        | j                  j                  d       t        j                         | j                  <   t        j                         | j                  <   yyy# t.        $ r Y jw xY wc c}&w # t^        $ r}.Y d}.~.d}.~.ww xY w# t^        $ r Y yw xY w# t^        $ r Y 4w xY w# t^        $ r}.t        d|.        Y d}.~.Ud}.~.ww xY w# t^        $ r}.Y d}.~.d}.~.ww xY w#  Y xY w# t^        $ r Y w xY wc c}&w c c}&w # t^        $ r Y ]w xY wc c}S}Rw # t^        $ r}.Y d}.~.d}.~.ww xY w)u5   Exécute un signal de trading avec cooldown dynamiquer  u
      ⏸️ z: Trading en pause - m r  NrB  trend_directionr  r6  z   Cooldown signal z	: encore r'  z   Cooldown trade rf        🕒 : Cooldown PERTE actif (u   min restantes) - BLOQUÉr   r
  Tr  u!   : Trading automatique désactivér%  r-   r3  r   r  r  rI  u&   : ACHAT REFUSÉ - Crash extrême (RSI=r  z, Mom=r   r        ⚡ u#   : Signal accepté malgré RSI bas (u   ) - L'IA a validéz: Max positions atteint (r  r  BLOCKED_TRADING_HOURS_UTCENABLE_HOUR_FILTER      🕐 : Heure toxique (u%   h UTC) - achat bloqué (AUCUN bypass)r1  c              3   L   K   | ]  }|j                  d       k(  s|  ywr  r+  r  s     r   r/  z,TradingBot.execute_signal.<locals>.<genexpr>  s!     '\a!%%/U[B['\r  r  _   z: Score EXCEPTIONNEL (z) - BYPASS limite horaire (      ⏳ z : Limite achats/heure atteinte (u    à zh)r  u$   : Impossible de récupérer le solder	  r   rS   u*   : Solde insuffisant, position réduite à r  r  r  r  rk  rX  u!   ) - Réduction position à 50% = r  rl  u8    élevé mais BULL_STRONG → position maintenue à 100%r
  z: Solde libre=z | Position cible=z	 | Ordre=z
SIGNAL ACHAT: z (Position r   c              3   L   K   | ]  }|j                  d       k(  s|  ywr  r+  r  s     r   r/  z,TradingBot.execute_signal.<locals>.<genexpr>>  s!     +`!aeeHoY_F_A+`r  r  r  u   : Signal IA validé (Score=, RSI=r  r  r  r  r  u)      ⚠️ SL SERRÉ -1.5%: BTC baissier (r  u   ) → Protection renforcéeMbPr  u-      🟡 SL INTERMÉDIAIRE -2.0%: BTC faible (u      ✅ SL maintenu 2.5%: BTC u"    mais BULL → pas de resserrementF
dynamic_sl
dynamic_tp
dynamic_rru      🎯 SL/TP DYNAMIQUES: SL=z% TP=z% (R/R=z:1)u      📊 SL/TP FIXES: SL=r  rx  rc  ry  r  r{  r|  rz  r2  rT  r  r   r  r  r  r  rF  g      @u      🚀 TP ÉTENDU 6%: BTC+r  z + Tendance forte (EMA rd  z% Mom3 g      @u      📈 TP ÉTENDU 4.5%: BTC+z + Tendance moyennegMb`?u$      📈 TP ÉTENDU 4.5%: BTC stable+z + Tendance forteg      @u4      📊 TP MOYEN 3.5%: BTC stable + Tendance moyenneu%      ⚠️ TP RÉDUIT 3.5%: BTC neutrez mais crypto forte      @u2      ⚠️ TP STANDARD 2.5%: BTC neutre, sécuriseru"      🚨 TP COURT 2.5%: BTC baisse u    → Sécuriser viter  r   u      🐻🛑 REGIME u   : ACHAT BLOQUÉ (score=uR      → FIX 28/02: ZERO achat en BEAR/CORRECTION — Seules les ventes sont activesr  r  ffffff?u      ➡️ NEUTRAL: SL=z% Position=z (35%)u%      ⚠️ Erreur ajustement régime: r  r  r  r  r  )r\  r]  rr_ratio
is_dynamic)r   rP   signal_typera  r  r  r  r  dynamic_sltpexecutedrO  rU  r  zBB+ BREAKOUT+z(+rG   u&      🎯 TP ADAPTATIF: Breakout fort (+u   %) → TP augmenté à uG      📊 Détection: Entrée sur BREAKOUT BB+ - Vente auto si prix < BB+)r  r  r  NCREUXrv  BREAKOUTSQUEEZE_BREAKOUTEXCEPTIONNELSCORE_EXCEPTIONNELGOLDENGOLDEN_CROSSEARLYEARLY_MOMENTUMTRENDTREND_FOLLOWINGrV  SMART_VALIDATEDu      🔧 u'   : Pattern récupéré depuis score IA (r  zGOLDEN CROSSzEARLY MOMENTUMzTREND FOLLOWINGzACHAT HAUSSIERACHAT_HAUSSIERu+   : Pattern déduit de la raison d'achat → u,   : Pattern récupéré depuis indicators → PatternManagerrh  u    BLACKLISTÉ → achat annulé15mr   r'  g{Gz?)r  volmax_hr  r  r  gףp=
?u      🧱 u!   : Résistance 15min détectée @ r  rb  u    highs) → TP u   %→)rN  r  r  rW  rW   r   rP   r   r  r   executedQtyorder_size_usdr  r  r\  r]  r  r^  ra  rO     z: Montant insuffisant ( < r   z
SIGNAL VENTE: signal)Dr  rY   rv   rp   r  rZ   r  r  r  r  r  r  r  r  r   r  r'  r  r  r  r   utcnowhourImportErrorr   r  r  r  r  r  r  r   r  rh  rK  rg   r   r  MIN_ORDER_SIZEr  r  r=   r   r\   r  r*  r%  rz   r  r  r  r  r  
log_signalr  r   pattern_managerr  ro  r   zipr  rq  r  rR  r  log_trade_openrt  )Ur   rP   r  r8  rO  r  minutessecondscooldownrB  r  elapsedloss_cooldownsr  r  r%  r3  r  r  current_hour_utccurrent_hourbuys_this_hourra  r  signal_datamatching_signalr   position_sizeorder_amountis_bull_strongr  rL  rM  r  is_bull_regimer^  r  r  r  r  r  r  r  r  is_strong_trendis_medium_trendr}   r  r  r  r  rN  buy_reasons_strr  bb_dist_strrT  tp_bonussignal_patternbuy_reasons_listbrai_sc_ind_patternr  _pm_current_px	_tp_price_k15	_highs_15_vols_15_resistance_clusters_h_v_band_best_cluster_info_trial_tp_px_trial_tp_pct
_resist_px
_new_tp_px_new_tp_pctrP  hours_to_keephcr  sU    `                                                                                   r   execute_signalzTradingBot.execute_signal  s\    $$tyy{2D55		CDI2oG"nGJvh&;G9BwizZ[ '''^^,<=N(nn->?O.2"5/Y:V.. T%%%iikD$4$4V$<<G!7 23	+F89YKqIJ T__$iikDOOF$;;G,,, 3 3g =>	*6()I;aHI
 !!6!68MrR^#		nV6L(LN62TYY[@AIHVH$<Y]OKcde ++-   5 5 ? ?@668U?vT-B-B-L-LL==$$[$7
6(*KLM  nnUB/%>>*a8 84HVH,RSVWZR[[abjknaooqrs 8GF8+NsSViWijk !M1
6(*CDUCVVWXeWffghi
P#+??#4#9#9 %*:>W*WHVH,=>N=OOtuv $<<>..L!//33L!DN H(( 55MMO	'mmOR@"&'\;'\^b"c".227A>H 2~x'=hZGbcqbrrstx  uK  uK  tL  LM  N  O4#9#99x'GGWWXY]YoYoXppt  vB  uC  CE  F  G kk--f5G
6(*NOP
 !MM--nnMM(L v!11"76?Q#6:
6(*TU]UdUdeqUrTstu  nnUB/")$0@"A"jdFYFY]jFj8N C'LJvhoc#YFghphwhw  yE  iF  hG  H  I2X.GF86#c:rstHVHN8??76?3S2TTfgogvgv  xE  hF  gG  GP  QY  Q`  Q`  am  Qn  Po  p  q~-(<Ma<O;PPQR_Q``abc #',, $ 9 9 Q Q SI"+--"DK&*+`{+`bf&gO&#2#6#6z2#F&ll5"5#2#6#6w#B 0KH:U[\_`c[ddefg !2"5
 ;8%k?AFG '.d4D&E&}$J]J]a}J}N)"V+,/M!$MgVZ^[v"wx$v-,/M!$QRYZ^Q__`"ab 6) =gd^Kmno #("|'F<[jKj$3L$AM&5l&CO.22<CH&*O9-oM^^efneoorst4]O5HYYZ[\ '7;+P%k?AFG.!%!7!7UW!7!Xv;",;A%BaeAaDk%BF%B#6#:#:61#ED$7$;$;FB$GEUXY_U`deUeVBZ&*%<r
$Jc#QklDILVXZIZ"5"9"9&""E`bC  $04u/E.L 4?3E3T$QT*3>3D3SPS $+U?'6:=(-0KGTW=Xop{  }A  pB  BI  JN  OS  IT  TV  /W  )X)8:=(-0MgVY]Zm.n(o%,u_'6:=(-0TU\]`Taar.s(t)8:=(-0d(f%,v%5'6:=(-0UV]^bUccu.v(w:=(-0b(d69O$),NwWZm[o*p$q %%+K6:6H6H6V6Vdh6V6i3^  /*.DD
 !&(;K=H_`h_iij&k l %(z |6A 3!)$X1K1MJ'1DO
(ACQ
(@ !'!,	!9 1425 , 4 %(>}oUSbRccnowo~o~  @L  pM  oN  NT  'U  !V 3>D/% T-G-I
#-@KJ$=?MJ$< $$))44)1&,+0(7(;(;GQ(G'6':':9'E'R,;,?,?PR,S.=.A.ABRTY.Z(7(;(;J(K*7*98GHo^kNk.=	- )-&,#6 . %*!".22:rBH&)hh/B/B=RT/U&VO%8Nf<T,0) "1!4!4]B!G )A-2sax!)23''$-2B2H2H2Ma2PK272DK (3S'83>3D(78(C(-0VWbcfVgg~  @O  PS  T  TU  /V  )W$))"  gi "+"%4%8%8%C%PyN &)FF+:+>+>}b+Q("2 &B&"}1@ %!+r!11C %!/2!51E %!)R1? %!(B1A %!(B1B %%&* &)FF / 3 3GQ ? B;->N!HVH4[\a[bbhiwhx"yz "%BBv%/)7)V3)9*f4):)V3)9%20[\j[klm "%BBz#->>)Y#GL#<Y(Y)50\]k\lmn
>(*C11.A
>:JJhij B'"&++"7"7"?K"$/17L3L$M	#{{55fuTW5XCIO>B(Cqt(CI(C>B(Cqt(CH(C350*-i*B yB#.#@y#@,1"d8J2K,LP[^bPb,cE',4H'HPQZ[fgFh(<U(C$8$?$HA$M$H$8$?$FB$N$FKNOcdiOjkrOsuwKx$8$?$Hy -1M)/0D0I0I0K)L .(<U(C#(>Q#649'NU4JL5AK5ORS5SWZ4ZM'4';8=(-.  --:7-C
-7%-?
/9K/G!/Ks.R#.##5+:W$)HVH<]^hil]m n..;G.D-E_UdehTiimnyz}m~~+A %B6;K6KO --;; !#&7* <  7E7ID&&|4%1L14D3J$KM;?;M;M;S;S;U)l41aYZ^kYk!Q$)lD& $$?&+EIIgt,DQ,G,K,KGUV,W&X&!+*.++*?*?*GK))88 :':$f: #E: *;	:
 'eiiq.I(J: -l: (MC<O8O)P: *;!oPS>S:S+T: %m: %o: '-(G: .: '(;(;GQ(G: &':':9'E'R:  %f!:" '(;(;J(K#: * ,099;  (*.))+'F8#:8??<;X:YY\]e]l]lm{]|\}}~  Av&D,A,A,K,K"K$VH-.!!00B'+yy{DV$&*iikDOOF#	 #Lu  n &CT % < (1 !)$( &!)* $- % $%$ K EaSIJJK2 % 8!)$(T !  )D(C> ! $ *m8 % sr  2>AB 1AB$ ABD:AB$ A	AC )AB; =AC AC
 1BAC? *AAD0AD ?AAD8 AD.1AD8 7AD3!AD8 .BAD8 ;AD8 AAD8 AEAE3DAE B	ABBABBAB$ B$	AB8B3AB8B;	ACCAC CACCAC C
	ACCAC CACCAC C	AC<C#AC7C7AC<C?	ADDADDADD	AD+D*AD+D.
AD8 D8	AEEAEE	AE"EAE"c                 	   t        d       t        d       t        d       t        d       t        dt        j                         j                  d              t        dt        rdnd        t        d	t
                | j                  j                  d
      }t        dt        j                  |d          dt        j                  |d          d       t        d       t        | j                  j                        }| j                         }| j                  j                  dd      rdnd}t        d| d| d| dt          dt"         d       | j                  j                  r| j                  j                  j%                         D ]  \  }}| j                  j'                  |      xs |d   }||d   z  dz
  dz  }|dkD  rdnd}	t        d |	 d!| d"|d#   d$d%t        j                  |d          d&t        j                  |       d'|d(d)        nt        d*       t        d+       ||d,z  k\  rd,nd}
t        d-|
 d.       i | _        | j*                  D ]\  }t-        | j.                  |         }t        |      d/k  r+| j1                  |      \  }}}|||f| j(                  |<   |j                  d0d      }|j                  d1d      xs d2}|j                  d3d2      }|j                  d4d5      }|j                  d6d7      }|j                  d8d      }|j                  d9d:      }|d;k(  rd<n|d=k(  rd>nd?}|d@k(  rdAn|dBk(  rdCndD}|| j                  j                  v rdEndF}|dGk(  rdn|dHk(  rdn|rdIndJ}	t        d |	 d!| | d"t        j                  |       dK|dLdM| d| dN| dO|        _ | j                  j3                         }|dP   dkD  r|dQ   dk\  rdnd}t        dR|dP    dS       t        d | dT|dQ   d(dU       t        dV|dW   dXdY|dZ    d[|d\    d]       | j                  j4                  d^d_ }|rjt        d`       t7        |      D ]Q  }|j                  dadb      }|dk\  rdnd}|j                  dcdb      }t        dd| d!|de    d"|d(df|d(dg|dh    
       S t        di       t        dj       | j9                          y_)kzAffiche le statut du botz[2J[HzF======================================================================u(     🤖 TRADING BOT - ORDRES AUTOMATIQUESu     ⏰ %Y-%m-%d %H:%M:%Su     📡 Mode: u   🧪 TESTNETu   ⚠️ PRODUCTIONu     💱 Devise: r  u     💰 Solde: r   z (libre) | r   u
    (bloqué)r
  Tu	   🟢 AUTOu   🔴 MANUELu   
📊 POSITIONS: r  r  z | SL: z% | TP: r  r  r   r  r   u   🟢u   🔴r  rU  rT  r   r  z @ r  rb  rd  r  u   
📊 Aucune position ouverteu   
📈 ANALYSE EN TEMPS RÉEL:r'  z   (Signaux requis pour achat: r  r  rW   r%  r-   ra  rY  rT  r[  mixedrd  rb  Fr6  u   📈r7  u   📉u   ➡️rQ  u   ⬆️rS  u   ⬇️u   ➖u   📍r  r   r   u   🚫u   ⚪z | RSI:r  z AI:zEMA z	BB | Sig:rD  rC  u   
📜 HISTORIQUE (z	 trades):z P&L Total: rJ   u      📊 Win Rate: rF  rX  r	  rE  zW / r!  zL)rO  Nu      📝 Derniers trades:r>  rg  rZ  r  rP      € (%) - rO  zG
======================================================================u     [Ctrl+C pour arrêter])rp   r   r   strftimer  rO   r  r   rK  rg   r   r  r  r'  r  rZ   r  r  r  r   _cached_analysisr  r   r  r  rG  r  r  save_analysis_data)r   r   r  r  auto_statusrP   r  r  rZ  iconrequired_signalsr  r  r8  rO  rW   r%  ra  rY  r[  buy_signals_countrb  
trend_iconbb_iconin_positionstatspnl_iconrecentr.  t_pnlt_icons                                  r   display_statuszTradingBot.display_status  s   oh89hx||~../BCDEFnBUVWX 0123 ++))&1xwv?@HOO\cdl\mLnKooyz{h   5 5 ? ?@668%)]]%6%6{D%Ik}"#4"5Q}oSU\]n\oow  yL  xM  MN  O  	P  **#44>>DDF ]++//7M3};M#c-&88A=D!(1v&D66("S_S,AX__UXYfUgEhDiinowo~o~  @G  pH  oI  IK  LS  TX  KY  Y[  \  ]	] 23 	./ 1mq6H I1q/0@/AEF !#(( 	fF$++f-.F6{R)-f)=&FJ-3Z,HD!!&)NN7A.E..*0bC!~~j"5H%>>.&AL&NN?GDM *}a @#e<J $1I#=]^gMg6muJ".$"6hX^H^HdiG$*d.C.C.M.M$M&SUK#u_6Ff<L&\fRXlqD CvQvh{m2hooe6L5MWUXY\T]]abjakknoynzz~  @G  H  HQ  Rc  Qd  e  f/	f4 %%335 1$!&{!3q!8vfH'n(='>iHICzeK.@-FcJK&uZ'8&=SvtTYZbTcSddfgh **88=F01!&) nAEE%-E',zVvFeeIs3GF6(!AhK=5,eGTX>Y^_`ai_j^klmn 	o() 	!r   c                    	 t        d       t        | j                  j                        }| j	                         }| j                  j                         }g }| j                  D ]\  }t        | j                  j                  |g             }t        |      dk  r8t        | d      r"|| j                  v r| j                  |   \  }}}	n| j                  |      \  }}}	|j                  dd      }
|j                  dd      xs d}|j                  dd      }|j                  d	d
      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      xs d}|| j                  j                  v }|j                  ||
t        |d      |||||||t        |d      |	d       _ g }| j                  j                  j                         D ]p  \  }}| j                   j#                  |      xs |d   }||d   z  dz
  dz  }|j                  ||d   |d   |t        |d      t        |d   |d   z  d      d       r g }| j                  j$                  dd D ]  }|j                  dd      }|dk\  rdnd}|j                  ||d    d|d d!|j                  d"d      d d#|d$    |j                  d%t'        j(                         j+                               d&        t-        d' |D              }t-        d( |D              }t        |      }t-        d) |D              }||z
  }|D  cg c]  } | d   t.        k  s|  }!} |D  cg c]  } | d   t0        kD  s|  }"} |D  cg c]  } | d*   t2        k\  s|  }#} |D  cg c]  } | d+   t4        k\  s|  }$} g }%||d,z  kD  r!|%j                  d-| d.| d/|dz  |z   d0       t        |$      dk(  r|%j                  d1t4         d2       t        |#      dk(  r|%j                  d3t2         d4       t        |!      dk(  r|%j                  d5t.         d6       t7        |d7 8      dd9 }&||||dkD  rt        |dz  |z  d      ndt        |!      t        |"      t        |#      t        |$      |%|&D  cg c]  } | d   | d+   | d*   | d   | d:   | d$   d; c} t4        t2        t.        t0        d<d=}'t'        j(                         j+                         ||t        |j                  d>d      d      t        |j                  d?d      d      |j                  d@d      |j                  dAd      |j                  dBd      dC||dD|'|||| j8                  j                  dEdF      t:        t<        t>        dGdH}(t@        jB                  jE                  tF        dI      })tI        |)dJdKL      5 }*tK        jL                  |(|*ddM       ddd       t        dNt        |       dOt        |       dP       yc c} w c c} w c c} w c c} w c c} w # 1 sw Y   GxY w# tN        $ r,}+t        dQ|+        ddl(},|,jS                          Y d}+~+yd}+~+ww xY w)RuB   Sauvegarde les données d'analyse en temps réel pour le dashboardu-      💾 [DEBUG] save_analysis_data: Début...r  r-  rW   r   r%  r-   ra  rY  rT  r[  r)  rd  rb  Fr3  r   r'  )rP   rW   r%  aiScoreemaAlignmentbbDirection
buySignalsr  	isBearish
inPositionr3  rO  r  r  r   )rP   r   
entryPricecurrentPricepnlPctinvestedr~  Nr>  rg  successr  rP   rT  rd  r*  rZ  r+  rO  ra  )r   r*   r   c              3   2   K   | ]  }|d    dk(  sd  yw)r  r   r   Nr2   r-  r%  s     r   r/  z0TradingBot.save_analysis_data.<locals>.<genexpr>d  s     #T!q{e?SA#T   c              3   2   K   | ]  }|d    dk(  sd  yw)r  r   r   Nr2   rI  s     r   r/  z0TradingBot.save_analysis_data.<locals>.<genexpr>e  s     $V1(v@UQ$VrJ  c              3   ,   K   | ]  }|d    s	d  yw)rA  r   Nr2   rI  s     r   r/  z0TradingBot.save_analysis_data.<locals>.<genexpr>i  s     Ja1[>Js   
r=  r@  rd  u   Marché baissier: r  u!    cryptos en tendance baissière (r  zAucune crypto n'atteint u-    signaux d'achat (paramètre MIN_BUY_SIGNALS)z!Aucune crypto n'a un AI Score >= u    (paramètre MIN_AI_SCORE)z!Aucune crypto en survente (RSI < r  c                     | d    | d    fS )Nr@  r=  r2   ri  s    r   r1  z/TradingBot.save_analysis_data.<locals>.<lambda>|  s    Q|_DTWXYbWcVcCd r   r2  rS   rA  )rP   r@  r=  r%  rA  rO  )minBuySignals
minAiScorersiOversoldrsiOverbought)totalCryptosbearishCountbullishCountbearishPercentrP  rQ  highAiCountwithSignalsCountblockerstopOpportunitiesrequirementsrF  rC  rD  rE  r!  )r  r  winRater>  totalTradesrE  r!  )buysellr
  T)r
  r  r  rn   )r   r6  r9  marketAnalysisr  cryptoslogsr  zbot_analysis.jsonr  r   r  )r!  r   u(      ✅ [DEBUG] bot_analysis.json saved: z
 cryptos, z posu*      ❌ [DEBUG] Erreur save_analysis_data: )*rp   r   r  r  r'  rG  r  r   r  rZ   r   r-  r  rf  r  r  r  r   r  r   r   r   rg  r  r  MIN_AI_SCORE_FOR_BUYMIN_BUY_SIGNALSrq  r  r  r  r  r!   r"   r  r  r   r[   r$  rz   r  r%  )-r   r  r  r6  cryptos_datarP   r  r  r8  rO  rW   r%  ra  rY  r[  r2  rb  r3  r5  positions_datar  r  rZ  ra  r.  r9  log_typebuy_signals_totalsell_signals_totaltotal_cryptosbearish_countbullish_countr%  rsi_oversoldrsi_overboughtr  with_signalsrX  rL  market_analysisanalysis_dataanalysis_filerd   r}   r  s-                                                r   r.  zTradingBot.save_analysis_data  s   e	"AB #D$9$9$C$C D ::<M))779E L,, 'dkkoofb9:v;# 4!344CXCX9X151F1Fv1N.FJ15f1E.FJ"w2 nnUA.4"%>>*b9)~~nfE * H$.NN=!$D!'^^L%@
%>>*a8=A$(=(=(G(GG##$" a='$1#/"3$!+"- %h 2$% 5'T  N#44>>DDF 
++//7M3};M#c-&88A=D%%$ #J"%m"4$+#GQ/ %c-&83z?&JA N' 
 D**88> eS)(-
9$"#H+btE!%%	SVBWX\A]]bcdemcnbop!"{HLLN4L4L4N!O  !$#T|#T T!$$V$V!V  -MJ<JJM)M9M'3O!qx,7NAOLO)5SA5N9RaSNS".WQ!I,BV2VqWGW'3Z!q/7YAZLZ H}s22"4]O1]OSt  vC  DG  vG  IV  vV  uW  WY  !Z  [< A%":?:KKx yz7|q "CDXCYYs tu< A%"CL>QR ST !'|9d efhgh i !. - -S`cdSd%(;m(KQ"Ojk"<0!$^!4"7|$'$5$ -%.   k"#L/ |U8!";k& %. &5"6#/%3	!%O8 &\\^557!2$1$UYYz1%=qA ;!:A>#(99^Q#?!IIfa0#ii!4 -. #2+'!%!2!2;!E 1"5+	'M8 GGLL5HIMmS7; Jq		-qIJ<S=N<OzZ]^lZmYnnrst[ PSWZ4%.\J J  	">qcBC!!		"s   MY 
X*X* Y &X/8X/<Y X4X4Y X90X94C;Y /"X>DY #Y=,Y *Y YY 	Z"Y??Zc                   K   t         rt| j                  rg	 | j                  j                  |      }|r| j                  |   j                  |       t        j                  d       d{    | j                  rfyy|j                         dz   }d| }| j                  r	 t        j                  |      4 d{   }|2 3 d{   }| j                  s n@t        j                  |      }| j                  |   j                  t        |d                Wddd      d{    | j                  ryy7 # t        $ r5}| j                  rt        j                  d       d{  7   Y d}~d}~ww xY w7 7 6 h7 \# 1 d{  7  sw Y   lxY w#  | j                  rt        j                  d       d{  7   Y xY ww)u6   Met à jour les prix via WebSocket (ou API en testnet)r'  NrS   z@tradez!wss://stream.binance.com:9443/ws/r(  )r  r  r  r   r  rf  asynciosleeprz   r  r6   connectr[   loadsr\   )	r   rP   rW   r}   streamr   wsr*   r^   s	            r   price_updaterzTradingBot.price_updater  s|     ,,/ KK11&9EF+2259!--*** ,, \\^h.F5fX>C,,	/)11#6 I I"-/ I I'#'<< %#'::g#6D KK/66uT#Y7GHI I ,, +  /||%mmA.../IIRI I I I/||%mmA...s   G	AD: )D8*D: .G	;&G	"F ;E;<F ?FE?E=E?
AFF $F%F )G	6G	8D: :	E8$E3'E*(E3-G	3E88G	;F =E??FF F	F
FF &G>G?GG	c                 x  %&'K   t        j                  d       d{    t        d| j                          d}d}d}d}d}| j                  7ri|dz  }|dk  rt        d| d| j                          t	        | d      r=| j
                  r0t        j                         }g }| j                  5  | j
                  D cg c]  }||j                  d	d      z
  d
k  s| }	}|	| _        ddd       	rt        | j                  j                        | j                         k  rd}
| j                  |kD  rd}
|
r"	 t               }|j                         \  }}|sd}
|
ra|	D ]\  }|j                  d      }||j                  d	d      z
  }|j                  dd      }|dk  sA|dk\  sGt        d| d|dd| d       ^ |dz  }|dk\  r`| j"                  rQ	 | j"                  j%                         \  }}| j"                  j'                         }| j"                  j)                  d      \  }}| j"                  j'                         }||k7  s||k7  r| j"                  j*                  j                  dd      }t        d| d| d| d| d| d       |dv r|dv rt        d| d        t-        | j                  j                  j/                               D ]  }| j                  j                  |   }d!|v s!d"|v s&|d"   }	 | j0                  j3                  |      xs |}||z  dz
  d#z  }|d$kD  r|d%z  }d&|d'd(}n|d)z  }d*|d'd(}||d!   kD  s}||k  s|d!   }||z
  |z  d#z  } ||d!<   t        d+| d,|d-d.|d-d| d'd/| d        	 | j                  j5                          t        | j                  j                        }!t        j                         t7        | d0d      z
  d1kD  }"|!dkD  r|"rt-        | j                  j                  j/                               }#d2|#d3| d.| t9        j:                         j=                         d4}$t>        j@                  jC                  tD        d5      }%	 tG        |%d6d78      5 }&tI        jJ                  |$|&d9:       ddd       t        j                         | _&        t        j                         d1z   }'t>        j@                  jC                  tD        d;      }(tG        |(d6d78      5 }&tI        jJ                  |'d<| t9        j:                         j=                         d=|&       ddd       |'| _        t9        jN                  |'      jQ                  d>      })t        d?|! d@|        t        dA|#        t        dB|)        n|!dkD  rz|"sxtS        d1t        j                         | jL                  z
  z
        }+t        dD|+ dE       n;| j"                  j*                  j                  dd      }t        dF| d| d| d       d}|dz  }|dHk\  rp	 | jX                  ddI D ]Z  }| j0                  j[                  |t\        dJ      }.|.s't_        |.D /cg c]  }/ta        |/dK          c}/d#L      | jb                  |<   \ 	 d}| jd                  rt        j                         }0|0| jf                  z
  dMk\  r	 t        dN       | jd                  ji                         }1|1rt        dO       t        dP       t        dO       t        dQ|1j                  dRdS              t        dT|1j                  dUd      dVdW       |1j                  dXg       }2|2rt        dYdZjC                  |2              t        dO       nt        d[       |0| _3        tj        rS	 | j0                  jm                         }3| jX                  D ](  }||3v s| jb                  |   jo                  |3|          * 	 | j                  jq                          	 | j"                  j%                         \  }4}t7        | d^|4      }5d_}6|5|6v }7|4d`v }8|7xr |8}9t7        tr        dad      }:|:dbk  };|9s|;rt        | j                  j                        dkD  rt7        | dcd      }<t        j                         |<z
  ddkD  rj|9rdendf|:dgd(}=t        dh|= d|5 di|4 d       d}>d}?t-        | j                  j                  ju                               D ]  \  }@}A	 | j                  j0                  j3                  @      }B|Bs/Aj                  d"B      }C|B|Cz  dz
  d#z  }D|DdjkD  r:t        dk@ dlDdmdn       | j                  jw                  |@do|Dd'd(       |>dz  }>n=Bdpz  }EAj                  d!d      }F|E|FkD  r!EAd!<   |?dz  }?t        dq@ drFdsdi|Edsdt        |>dkD  s|?dkD  r,| j                  j5                          t        du|> dv|? dw       t        j                         | _<        |4| _=        t	        | dx      sd| _>        | xj|                  dz  c_>        | j|                  dk\  r"	 | j                  j                          d| _>        t-        | j                  j                  j/                               D ]  }|| jb                  v st        | jb                  |         dyk\  s/| j                  j                  j                  |      }I|IrEIj                  dzd      }Jt        |Jt8              rJj                         }KnIt        Jt              r%	 t9        j                  J      j                         }Knt        j                         }Kt        j                         Kz
  ddz  }Lt	        | d{      r| j"                  j%                         d   nd|}MIj                  d}d~      }N|Ndk(  rdd}On
Ndk(  rd}Ond}Od}P	 t7        tr        dad      }Q| j"                  j%                         \  }R}|Qdbk  xs Rdv }PPrd}OLOk  rt        d| dM dLdVdO d	       | j                  j                  || jb                  |         \  }S}T|Sst        d| drT        | j                  jw                  |d       t        j                         | j                  |<    |dz  }|dk\  r| j                          d}t        j                         | j                  z
  dk\  r6t        d       | j                  d       t        j                         | _G        | j                  t        j                         kD  rtS        | j                  t        j                         z
        }U|Uddz  }V|Uddz  }Wt        d|V d|W dW       t        d       | j                          t        j                  d9       d{    t               }X|Xj                         \  }Y}Zt        d|Y d|Z d       |YsHt        dZ        t        d       | j                          t        j                  d9       d{    !t        d       g }[t        | j                  j                        }\| j                         }]t        d|\ d|] d| j                  du        t        d| j                  du d|\|]k          | j                   r\]k   r	 | j                  j                         }^|^j                  dg       }_t	        | d      r| j
                  rt        j                         }`| j                  5  | j
                  D cg c]  }`|j                  d	d      z
  dk  r| }a}|a| _        _D ch c]  }|j                  d       }b}d}caD ]A  }d|dj                  d      bvs_j                  dd       bj                  |dd          cdz  }cC cdkD  rt        dc d       ddd       t        dt        _       d       i }eg d}fd|}g	 | j                  j                         }ggdk(  rdnd}ht	        | d      rF| j                  r:	 | j                  j                         }i|iD jci c]  }j|jj                  d      |j }e}j_D ]  }k|kj                  d      }|kj                  dd      }|kj                  d}d|      }l|lrldv rd|}lt        d| d| dl d       	 t	        | d      sddlQmR}m  |m       | _S        | j                  }n|nj                  l      st        d| dl d       	 	 ddlUmV}omW}p t9        j                         j                  }q|pr[qov rWkj                  di       j                  ddJ      }rldk(  rrdk  rt        d| drddq d       nt        d| dq d       *kj                  d	d      }st        j                         |sz
  }td
}uldk(  r|dk\  rd}un|dk\  rd}ut        d| dtddu dW       |t|ukD  rt        d| dtddu dŝ       kj                  di       }v|vj                  dd      }w|vj                  dd      }xldk(  rwvj                  ddJ      }y	 | j"                  j%                         \  }z}zdk(  rd}{dj}|dd}}nzdk(  rd}{d}|dJ}}nd}{d}|d}}w{k\  }~|w|k\  xr y}kD  }~sr6~rdwdgd{ dz dndwdgd| dydd} dz d}t        d| d|        rx"dxcxk  rdk  rn nt        d| dx d؝       vj                  dd      }ldk(  rHF	 | j"                  j%                         \  }}dv rdnd}|k  rt        d| ddgd d d	       ej                  |i       }|j                  dd      }|j                  d}d|      }|j                  di       }t        d| dt        |       d| d|        |j                  dz|j                  d	d            }|rt        j                         z
  nd}rd
kD  rt        d| ddd       j                  d}l      }|ldv sdv r	 | j0                  j                  |ddd      }|rt              dk\  rD /cg c]  }/ta        |/dK          }}/D /cg c]  }/ta        |/d9          }}/D /cg c]  }/ta        |/d          }}/t        t         d       t        z  }t        |t        t        t        |             d       t        t        t        |            z  }t        |      dKk\  rd   |d   z
  |d   z  d#z  nd}t              dk\  rd   |d   z
  |d   z  d#z  nd}t              dKk\  rt        dd       nd   }d   |z
  |z  d#z  }t              dKk\  rt        dd       nd   }d   |z
  t        |d      z  d#z  dk  }t        dd       t        dd       z
  t        t        |dd       d      z  d#z  }|dk  xr dkD  xr dkD  }h d}t              t              z
  t        t        |      d      z  d#z  }|dk  rs|vrt        d| ddVd       k  xr dk  xs+ dk  xs$ dk  xs dk  xr  xr  xr k  xs dk  }|rj                  dkj                  di             }|j                  dd      }|j                  ddJ      }|dk(  xr xr dkD  xr djkD  xr dkD  }|dk7  xr xr dk  xr dkD  xr dkD  }kj                  dd      }d}	 | j                  j                         dk(  }xr- dk\  xr& dbkD  xr dkD  xr dkD  xr xs k  xr dk   }rt        d| d dmddmddd	       nrt        d| ddddmd       nrt        d| d ddmd	dmd(	       not        d
| dk   ddmddmd	dmd d ddVd       t        d       t        d| ddmddmd	dmd d ddVd       ldv r	 | j0                  j                  |dddI      }|rt              dk\  rD /cg c]  }/ta        |/dK          c}/%D /cg c]  }/ta        |/d9          }}/t        |dd       }|dkD  r%d   z
  |z  d#z  nd}t        %      dk\  rt        %dd       n"t        t        %      dkD  r%dd n%      }|dkD  rz
  |z  d#z  nd}t        %      dk\  r%d   %d   z
  %d   z  d#z  nd}t        %dd       }%d   |z
  t        |d      z  d#z  dk  }%d   |z
  t        |d      z  d#z  }|dkD  }d}	 | j                  j                         d_v }d}	 D /cg c]  }/ta        |/d          c}/&D /cg c]  }/ta        |/d          c}/'t        %&'fd t        dK      D              }t        %&'fd!t        dK      D              }|t        |d      z  }t        d"| d#dmd$dmd%dmd& d'dmd(dVd)       kj                  di       j                  ddJ      }|dk  xr dk  }rd*nd}ldk(  rGsEsCkD  r>rt        d| d+dd,dmd-       n!t        d| d.dmd/dVd0dmd1	       
r0kj                  dd      }|kj                  d}d|      }rdv rd|}fv rt        d| d3 d4       
hk  rt        d| d5 d6h d7       t        z
        dk\  rt        d| d8 d9 d:       kd<   rBd|k7  r=	 ddlQmR}m  |m       }|j                        st        d| d; d       	 kd}<   |}ln!ld|k7  rt        d| d<l d=       d|}ld|kd}<   kd<   |kj                  d>      d?k(  xr kj                  d@d      }xr d|k7  }xr }d>v rs
d>   kd><   d@v rs
d@   kd@<   j                  dAd      }|j                  dBd      }|j                  ddJ      }|j                  dd      }|j                  dCd      }|j                  dD|dEk  rdnd      }dIk  rNdk(  rIdk  r*t        dF| dGdVdH       t        dIdgdJ       t        d| dKdVdLdgdM       dNk  r3dk(  r.dk  r)t        dF| dOdVdPdgdQ       t        dR       dSk  r7dk  r2dk(  r-djk  r(t        d| dTdgdUdVdV       t        dW       Pdk  xr dk  xr dk  }ldv xr dkD  }rEsCkj                  d}d|      }t        d| dXdgdYdgd(       t        dZ|ś d[dgd\       dEk  xr d]k  }kj                  d>      d?k(  xr kj                  d@d      }ldv xr- dkD  xr& d^kD  xr dHk  xr dIkD  xr dk(  xr	 dkD  xr xs6 |dk(  xr/ ldv xr) d_kD  xr! d`kD  xr dk  xr dNkD  xr
 dakD  xr }rst        d| dbdgdYdgd\       yrrt        dc| dddgdUdde       ldv r2|dk7  r-t7        tr        dad      }|dk  rt        df| dgdmd(       ddhg}ʐdig}ːdjg}̐dkg}dk  xr dlk  xr dmk  }lv }dkD  }kj                  d>      d?k(  xr kj                  d@d      }|xr hk\  xr
 xr xs }lv }j                  dn      }|dk\  xr dok\  }dpkD  }xr d`kD  xs xr }j                  dn      }dk(  xr! dqk\  xr dk\  xr dkD  xs lv xr dkD  xs) |dk(  xr" dqk\  xr dk\  xr dkD  xr dkD  xr dkD  }dk(  xr ld|k(  xr dk\  xr dkD  xs$ |dk(  xr ld|k(  xr dok\  xr drkD  xr dakD  }j                  dn      }kj                  d>      d?k(  xr( kj                  d@d      xr dk\  xr ddk\  xr dkD  }sssssg }dk\  r!ddk\  rjo                  dsdgdUdd       ssjo                  dtl du d       dqk  rjo                  dv d       dk  rjo                  dwdgdx       dykD  rjo                  dzdgd{       t        d| d|d}jC                  ݫ              =g }rjo                  d~dmdUdd       rjo                  dl d       rjo                  d d       rjo                  d d       rjo                  d d       t        dc| dd}jC                  ޫ              }}lnkj                  dd      }|kj                  d}d|      }lt        d| d| d|l d       |hk  rt        d| d| dh d       A|| jb                  v rCt        | jb                  |         dk\  r't-        | jb                  |         dd }t        j                  |ߐd      }t        j                  |t              }t        j                  |t              }t        |߫      dKk\  rd   |d   z
  |d   z  nd}t        ߫      dk\  rd   |ߐd   z
  |ߐd   z  nd}ryrwdkD  rrz
  |z  }|dk  r1dk  r+rdnd}t        d| ddddd| dV	       `dk  r-dk  r'dk  r"t        d| dd#z  dgdYd#z  dgdQ       | jd                  r\	 || jb                  v rLt        | jb                  |         dIk\  r0t-        | jb                  |         dd }kj                  di       j                  dg       }|sYt	        | j0                  d      rB	 | j0                  j[                  |t\        dJ      }.|.r|.D /cg c]  }/ta        |/d          c}/ng }| jd                  j                  |rndgt              z  rj                  d      ndrj                  dA      ndd      \  }}|r4r2t        d| dj                   dZ|j                  dd| d	       |dk  r| j                  r	 | j                  j                  t9        j:                         |d|lkj                  d>d?      |kj                  d@d      |kj                  di       |kj                  di       dd| dd|l dd       || j                  j                  v r| j                  r	 | j                  j                  t9        j:                         |d|lkj                  d>d?      |kj                  d@d      |kj                  di       |kj                  di       ddd|l dd       Jkj                  d@d      }|kj                  d>d      }|rd?k7  r| j                  rm	 | j                  j                  t9        j:                         |d|lkj                  di       |kj                  di       dd| d| dd|l dd       t        d| d d d       g d}fl|fv rt        d| dl d       (t7        | j                  di       }||v rC|   j                  dz      }|r*t9        j:                         z
  j                         dMk  r|= d}d|}| j"                  r1	 | j"                  j%                         \  }}|j                  dd      }|k  r| j                  r	 | j                  j                  t9        j:                         |d|lkj                  d>d?      |kj                  d@d      |kj                  di       |kj                  di       dd| d d dd| d| d| dd       t        d| d| d d d7	       g d}d|k(  rlvrt        d| dl d       dv rlvrt        d| dl d d       dv r#lv r|dk  rt        d| d| d d       |hk\  s|| j                  j                  vst7        | j                  di       }||v rTt        j                         |   k  r:tS        |   t        j                         z
        }Ut        d| d|U d       || j                  v rt        j                         | j                  |   z
  }|| j                  k  r| j                  r	 | j                  j                  t9        j:                         |d|lkj                  d>d?      |kj                  d@d      |kj                  di       |kj                  di       ddtS        | j                  z
         dĝd|l dƝd       kj                  di       }|j                  ddJ      }|j                  dDd      }|j                  dd      }|j                  dd      }|j                  dCd      }d}g }ldk(  rd}jo                  ddVddVd(       dIk  r$dk  rd}jo                  ddddVd(       dbk  rdNk  rd}jo                  ddgd       dkD  r*|dk  r%dk  r d}jo                  d| dd#z  dVd(       dkD  r dNk  rd}jo                  dddѝ       ldk(  r\j                  dd      }|j                  dd      }|dk(  r1dk(  r,d}jo                  d d d       t        d| dם       tS        j                  dd            }d}	 | j                  j                         }dJk  rdk(  xr |dk\  xs dk(  xr |dk\  }ndk  rdk(  xr |dk\  }dkD  r9dkD  r4ldv r0s.d}jo                  d dڝ       t        d| d| dܝ       n#dkD  rrt        d| d d| d dߝ	       d|}	 | j                  j                         }dk(  rdn
dk(  rdndS} dkD  r2 k  r,dk  r'd}jo                  ddgd  ddd d	       j                  dAd      }dkD  r=dykD  r6ldv r2d}jo                  ddgd       t        d| d|dd       rt              dk\  rt        d| ddZjC                         d       | j                  r	 dZjC                        }| j                  j                  t9        j:                         |d|lkj                  d>d?      |kj                  d@d      |kj                  di       dd| dd|l dd       qdHk  rdkD  rt        d| ddddgd       kj                  dRdl       }[jo                  |d||ldd|l d| d|dd||||dk  rdndHk  rdndz   dd        	 | j                  r\]k\  r	 | j                  j                         }^|^j                  dg       }_|_D ]  }k| j                  s	 | j                  j                  t9        j:                         kj                  d      d|kj                  dd      |kj                  d}d|      |kj                  d>d?      |kj                  d@d      |kj                  di       |kj                  di       dd\ d] dd|kj                  d}       dd        	 [rU[j                  d d       t        dt        |[       d       t        |[dd       D ]_  \  }}|dk(  rdndk(  rdnd}t        d| dd    d|d     d|d   j                  d}       d|d   d
       a d}d}	 ddl$}	ddlm}
mq} |
j                          |dd      z
  }t>        j@                  jC                  t>        j@                  j                  t              dd      }t>        j@                  j                  |      rtG        dd78      5 }|j                         dd }ddd       D ]  }	 	j                  j                               }|j                  dRd~      j                  d	      reta        j                  d
d            dk  rEt        j                  dzd~            dd }
j                  |d      }|kD  rdz  } dk\  rd}t        d d       d9}d}[D ]  }r4d   j                  d}      dk(  rt        dd    d d       <\]k  rpk  rid   | j                  j                  vset        dd    d|d    d       | j                  |d   d|d   |dR          dz  }\dz  }\\]k\  sk  sd   | j                  j                  vs| j                         \  }}|rd   dz   kD  rt        d dddd    d|d   dd	       | j                  jw                  |d       t        j                         | j                  |<   \dz  }\t        j                  d       d{    t        dd    d|d    d       | j                  |d   d|d   |dR          dz  }\dz  }\t        dd    d\ d] d       | j                  jo                  |        t        | j                  j                        }\| j                         }][rt        [      nd}t        d| d\ d]        t        j                         }t	        | d      sd| _}        | j                  z
  dk\  r| _}        	 t	        | j0                  d      r| j0                  j                  ju                         D /cg c]  \  }/}|z
  dkD  r|/ }}/}|D ]P  }/| j0                  j                  j                  |/d       | j0                  j                  j                  |/d       R t        | j                  j                        dkD  r*| j                  j                  d d | j                  _        d!z
  }d"D ]  }t7        | |d      } t        | t              s&t               d#kD  s7 ju                         D /!cg c]&  \  }/}!t        |!tR        t`        f      r	!k  r|/( }"}/}!|"D ]  }/ |/=   ddl}#|#j	                          t        j                         }$|$|z
  dk\  r| j                          $}t        j                  d       d{    | j                  r7hyy7 7c c}w # 1 sw Y   6xY w# t         $ r Y 6w xY w# t         $ r |}Y 4w xY w# t         $ r Y 4Pw xY w# 1 sw Y   3cxY w# 1 sw Y   2xY w# t         $ r}*t        dC|*        Y d}*~*2d}*~*ww xY w# t         $ r-},t        dG|,        ddl*}-|-jW                          Y d},~,2Id},~,ww xY wc c}/w # t         $ r},Y d},~,1d},~,ww xY w# t         $ r},t        d\|,        Y d},~,1d},~,ww xY w# t         $ r},t        d]|,        Y d},~,0d},~,ww xY w# t         $ r Y /w xY w# t         $ r}GY d}G~G.d}G~Gww xY w# t         $ r}HY d}H~H.d}H~Hww xY w# t         $ r t        j                         }KY -w xY w# t         $ r Y -w xY w7 +m7 *c c}w c c}w # 1 sw Y   )XxY w# t         $ r Y ),w xY wc c}jw # t         $ r},t        d|,        Y d},~,(d},~,ww xY w# t         $ r Y (cw xY w# t        $ r Y 'w xY w# t         $ r t7        | dd|      }zY '-w xY w# t         $ r t7        | dd|      }Y &w xY wc c}/w c c}/w c c}/w # t         $ r! t	        | dȫ      xr | j                  dk(  }Y "w xY w# t         $ r },t        d| d|, d       Y d},~,!d},~,ww xY wc c}/w c c}/w # t         $ r Y  ew xY wc c}/w c c}/w # t         $ r Y w xY w# t         $ r}t        d| d2 d       Y d}~cd}~ww xY w# t         $ r Y w xY wc c}/w #  dgt              z  }Y xY w# t         $ r},t        d| d|,        Y d},~,qd},~,ww xY w# t         $ r Y w xY w# t         $ r Y Iw xY w# t         $ r Y w xY w# t         $ r},Y d},~,d},~,ww xY w# t         $ r Y Tw xY w# t         $ r Y Zw xY w# t         $ r Y dw xY w# t         $ r Y w xY w# t         $ r Y w xY w# t         $ r.},t        d|,        ddl*}-|-jW                          Y d},~,Od},~,ww xY w# t         $ r Y !w xY w# t         $ r Y Qw xY w# 1 sw Y   	xY w# t         $ r Y 	w xY w# t         $ r}Y d}~	Hd}~ww xY w7 c c}}/w c c}!}/w # t         $ r Y w xY w7 ƭw($  zBoucle principale de tradingr   Nu1      🔍 [TRADING_LOOP] Démarrage - self.running=r   rh   u#      🔍 [TRADING_LOOP] Itération #z - self.running=r  r  r  TFrP   r  rc  r  u      ⚡ FAST-PATH: u    détecté il y a r  z	s (score=r  r  global_scoreu   
📊 MARKET REGIME CHANGÉ: rb  u
    pos) → z pos) [Score: ])r  r  )r  r  r  u0      🛡️ Resserrage des Stop-Loss (passage à u5   ) — SL depuis PRIX ACTUEL pour sécuriser les gainsr  r  r  rG   gQ?zprix actuel -1.5% (P&L=r  r  r  u   entrée -1.0% (P&L=u
         • z: SL r   r  u   % depuis entrée) [r  i  SELL_ALL_COOLDOWNzAUTO-REGIME: )r  r   rO  r   r  r  r   r  r'  r  r  
AUTO_SELL_r  rO  r   %H:%M:%Su#      🚨 AUTO SELL-ALL déclenché: u    positions → u      📤 Vente: u0      ⏸️ Trading en PAUSE 30min — reprise à u,      ⚠️ Erreur écriture sell_all_signal: u&      ⏳ AUTO SELL-ALL: cooldown actif (zs restants)u      📊 Market Regime stable: u.      ⚠️ Erreur actualisation market regime: r  r  r-   r{  r  r  u5   
🔍 FreqAI: Vérification retraining périodique...r  u    ✅ FREQAI: RETRAINING EFFECTUÉu      • Raison: rO  r  u      • Durée: durationrX  r'  models_retrainedu      • Modèles: r  u$      ✓ Pas de retraining nécessaireu(      ⚠️ Erreur FreqAI periodic check: u      Erreur récupération prix: _last_known_regimer  )r  r  r  r  r  _last_regime_protection_timer  u   RÉGIME DÉGRADÉzBTC STRESS (mom=r   u   
🚨 PROTECTION RETOURNEMENT: r  r  u      💰 Vente PROTECTION z: P&L=rd  rm  zREGIME_PROTECT (gX9v?u      🛡️ SL RESSERRÉ rT  r  z (-0.8% du prix actuel)u      📊 Bilan: z
 vendues, u    SL resserrés_bear_melt_counterrz  r   r  r  r  r  rv  EMA_BULLISHr  r  r   rS   rw  z: Skip quick-exit (z protection, age=zmin < r  u   
   ⚡ z
quick-exitr   rh  u5   
🧹 Nettoyage profond watchlist (deep TTL check)...)r  u*   
⏸️ TRADING EN PAUSE - Temps restant: r  u>      🔒 Aucun achat autorisé (protection après vente totale)u   🔍 [DEBUG] Market safety: u   
🛑 ACHATS BLOQUÉS - uL      💡 Le trading reprendra automatiquement quand le marché se stabiliserauO   🔍 [DEBUG-AFTER-SAFETY] Market safety OK, continuons vers section achat IA...u0   
🔍 [DEBUG-ENTRY] SECTION ACHAT IA: Positions=r  z, Surveillance=z)   [DEBUG-ENTRY] Condition: surveillance=z, positions_ok=r1     r  u&    HOT SIGNAL(S) ajouté(s) en prioritéu#   🔍 [DEBUG] Ready signals reçus: z (dont hot))ACTIVE_CRASHPRICE_CORRECTIONRSI_TRAPSTRONG_DOWNTRENDBEARISH_TRENDCREUX_TOO_DEEPri  r  r  rU  r  r  u8      ⚠️ Impossible de récupérer watchlist fraîche: )r  r  r  u      🔎 z: Traitement signal (score=z	 pattern=_pattern_manager_cacher  rI  rh  u    BLACKLISTÉ → signal ignorér  r  r%  r  u   : CREUX_REBOUND extrême (RSI=u"   ≤30) — BYPASS heure bloquée (zh UTC)r  r  u   h UTC) - achat bloquérv  ih  rV  rH   u      🔎 [TR1] z: age=zs max=u      ⏰ z: Signal TROP VIEUX (zs > u   s) - IGNORÉr\  candles_since_bullish_crossr  r  r  rP  gQ?r  g?rg  z
EMA slope=z>=u    (rebond entamé, régime=z + RSI=>u    (post-creux, régime=u   : CREUX_REBOUND rejeté — u   : Golden cross TROP RÉCENT (u3    bougies) → signal peu fiable (WR historique=11%)ema21_sloperR  rw  u(   : CREUX_REBOUND rejeté — EMA21 slope=z% < u   % (couteau qui tombe, régime=z	   [TR2] z: fresh=z fscore=z
 fpattern=u!   : Données fraîches PÉRIMÉES (u(   s) - watchlist obsolète, signal ignoré)rv  PULLBACK1hr  )r   r   r2  rT  r  ir  r  r  r  >
   ADAUSDTBNBUSDTBTCUSDTDOTUSDTETHUSDTLTCUSDTSOLUSDTXRPUSDTAVAXUSDTDOGEUSDTg      @u      🚫📊 u   : COIN PLAT — range 24h=u   % < 4% → aucun potentielrg  gffffffr  r  r     &   g      u      ⭐🕐 u5   : BTC rebond au creux — override 1h bearish (mom3h=z	%, mom5m=r  u:   : CREUX RÉEL — override 1h bearish (bottom 4h ✓, RSI=z<38, Mom5m=z%>0.40%)u      ⭐📈 u   : SCORE_IA_OVERRIDE — score=u'    ≥ 90 en tendance 1h douteuse (Mom3h=z%, DepuisHigh=u      🚫🕐 u3   : CREUX rejeté — tendance baissière (EMA<EMA21=z, Mom3h=z	%, Mom6h=z%, NearBot=z
, Squeeze=[z%])u>         → Essoufflement post-pump ou déclin continu détectéu      ✅🕐 z#: Tendance 1h OK pour CREUX (Mom3h=r  u   : Vérif 1h indisponible (u   ) → confiance 5min seulementr  i   iir  r  rg  c              3   R   K   | ]  }d |z      d |z      k\  sd |z         ywrT  Nr2   r-  rk  c5mo5m_iv5m_is     r   r/  z*TradingBot.trading_loop.<locals>.<genexpr>  s:     5paWZ[]^_[_W`dijlmnjndoWoeBqDk5p   ''c              3   R   K   | ]  }d |z      d |z      k  sd |z         ywr  r2   r  s     r   r/  z*TradingBot.trading_loop.<locals>.<genexpr>  s:     6pqX[\^_`\`XadijlmnjndoXouRT{6pr  u
      ✅⏱ u   : 5min info — drop=z%, pump=r  z%, atBottom=z, recovery=z%, sell/buy=rj  r  u&   : anti-pump BYPASSÉ — RSI survente=u   ≤35 + pump modéré=u#   %<2% → rebond légitime autoriséu+   : CREUX_REBOUND BLOQUÉ post-pump — pump=z	% (seuil=z%) et hors du fond (recovery=u%   % < 2% seuil) → chasse-pump évitéu&   : Vérif 5min post-pump indisponible (z: CRASH ACTIF (u   ) - BLOQUÉ SÉCURITÉz: Score FRAIS=z < minimum (u   ) - BLOQUÉz: Utilisation score FRAIS=z (cache=u    obsolète)z: Fresh pattern u   : Pattern caché=u=    OBSOLÈTE (frais=NEUTRAL) → forcé NEUTRAL pour décisionsr  r  r  r?  r  r  ema_trend_bearishr  u      🚫🔴 z: RSI TRAP ABSOLU - RSI=u!    + EMA Bearish → ACHAT INTERDITu         → Momentum=z8% insuffisant (besoin >0.5% pour confirmer retournement)z: RSI=u)    extrême MAIS retournement violent Mom3=u   % → autorisér  z: SURVENTE EN BAISSE - RSI=z EMA_bearish Mom3=u   % → BLOQUÉuV         → Acheter en survente dans tendance baissière = piège (besoin Mom3>0.3% min)r  u'   : TENDANCE BAISSIÈRE FORTE - EMA_diff=r  u    → BLOQUÉu=         → Attendre retournement confirmé (Mom3>0.2% minimum)u4   : FIN DE CYCLE détectée - Momentum en chute (Mom3=r  u         → Pattern=z
 EMA_diff=u   % → ACHAT BLOQUÉre  g      пg      ?r  r  z: BAISSE ACTIVE - EMA_diff=r  z): CREUX_REBOUND en zone basse - EMA_diff=u&    → ACHAT AUTORISÉ (creux légitime)u      ⛔🔴 u"   : CREUX refusé — BTC en chute (r  r  HIGH_SCORE_OVERRIDEPOSSIBLE_BLOCKED*   g?
base_scorer  r  r  r  zNi CREUX (EMA+zNi BREAKOUT (pattern=z score=zNi EXCEPTIONNEL (score=zMom3=z	% (chute)rd  zBB_pos=z
 trop hautu   : Aucune stratégie validée - r  z
CREUX (EMAz
BREAKOUT (zEXCEPTIONNEL (score=zNEUTRAL_HIGH (score=zSMART_VALIDATED (score=u   : Stratégie(s) validée(s) - u7   : Pas de données fraîches - Utilisation cache (score=z
, pattern=z: Score cache=r  u8    ET absent watchlist → BLOQUÉ (qualité insuffisante)ir  gMb@r  ?z#: BAISSE ACTIVE (cache) - EMA_diff=z.4fz Mom5=z RSI=r  z: FIN DE CYCLE (cache) - Mom3=volumesget_volumesi@B )rP   r  r  r%  r?  block_on_outlieru
      ℹ️ z: Outlier (z.0%u   ) — score IA=u    prédominez: Erreur FreqAI outlier check: r   r  zSCORE_TOO_LOW (z < 45)u   📊 Signal u    rejeté (score faible))r   rP   r  ra  r  r  r  r  r  r  rejection_reasonrO  ALREADY_IN_POSITIONu   ♻️ Signal u    rejeté (position existante)r  zSMART_BLOCKED (eligible=z	, signal=u   🚫 Signal u     rejeté (BEARISH/NON-ÉLIGIBLE)u!   : Signal BLOQUÉ (smart_eligible=u   : Pattern DANGEREUX bloqué (rJ  	min_scorezREGIME_MIN_SCORE (score=z < min=z	, regime=u   🛡️ Score u    insuffisant pour régime z (min: z: Score u
    (régime )rv  r  r  EARLY_BREAKOUTCONSOLIDATION_BREAKOUTr  CROSSOVER_IMMINENTVOLUME_REVERSALRSI_REVERSALSTRONG_UPTRENDr  u6    BLOQUÉ en régime NEUTRAL (seuls rebonds autorisés)u    BLOQUÉ en régime u    (seuls rebonds autorisés)z < 80 pour rebond en u
    - BLOQUÉrf  r  r  u   s restantes) - BLOQUÉz
COOLDOWN (zs restantes)u   🕒 Signal u    rejeté (cooldown)r  zACTIVE_CRASH(Mom3=z%,Mom5=r  zCrash_Violent(RSI=z,Mom=zChute_Extreme(Slope=zEMA_Bearish(Score=z,Mom5=zRSI_TRAP_ABSOLU(RSI=z,EMA_Bearish)r  ema_cross_freshema_cross_bullishzCROSSOVER_LATE(cross_fresh=z,cross_bull=uG   : CROSSOVER trop tardif - Opportunité ratée (>2min après croisement)R   zDOWNTREND_STRUCTURAL(z bougies sans golden cross)u   : DOWNTREND STRUCTUREL — u,    bougies sans EMA cross → CREUX impossibleu#   : DOWNTREND_STRUCTURAL ignoré — z	 + score=z	 bougies)g333333zEMA_ACTIVELY_FALLING(slope=<r  zNOT_A_CREUX(bb_position=z! > 0.70, prix haut + EMA bearish)u   : Pas un creux — prix à z des BB avec EMA bearishu(   : Signal IA REJETÉ - Danger confirmé (zBEARISH_DANGER (u    rejeté (danger)u   : Rebond détecté - RSI=z + Momentum positif (zIA: )ra  r%  r  u   🤖 IA SIGNAL: z (Score=)rP   r  r8  rO  ra  r%  priorityr7  u6      ⚠️ ERREUR CRITIQUE dans traitement signaux IA: zMAX_POSITIONS (u   ⛔ Signal u    rejeté (limite positions)c                     | d   S )Nr  r2   ri  s    r   r1  z)TradingBot.trading_loop.<locals>.<lambda>>  s
    Qz] r   rk  u   
🤖 SIGNAUX IA PRÊTS (z):u   🔥r  u   ✨r  rU  z: Score=ra  r  r8  )r   	timedelta)r  
trade_logsztrades_log.jsonlr  ijr  r>     r(  u   
🛑 CIRCUIT BREAKER ACTIF: u1    stop-losses en 60 min → CREUX_REBOUND suspenduu      🛑 u-   : CREUX_REBOUND bloqué (circuit breaker — z
 SL/60min)u   
🤖 ACHAT IA: z	 (Score: r  u    
🔄 REMPLACEMENT INTELLIGENT: r  zremplacement-prioritaireu   
🤖 ACHAT IA (remplacement): r  z: En attente (max u   
💡 Cycle terminé: z signaux IA | Positions: _last_mem_cleanupr   ru   iiQ )r  r  rf  r   )rs  rt  rp   r  r   r  rY   r  rZ   r   r  r  r'  r  r   check_safetyrz   r  r"  r  r  market_datar   r  r  r   r  r  r   r   r   r!   r"   r  r  r   r[   r$  r  fromtimestampr,  rv   r  r%  r  r   r)  r   r\   r  r  r  periodic_checkr  r   rf  re  r=   r  rt  r  r  r  r~  r   r   r   r  r  r  r  r  r  r.  r  r  insertaddr  _get_market_regimerO  r  r  r  ro  r  r  r  r  r  r  rm  r   rg  r  r8  r  rh  r  re  ry   r  r%  r*  should_check_outliersr   r  r  r  r  r  r4  	enumerater  r  r  r#   	readlinesrv  strip
startswithstrptimer&  r  r  r  r   r   r   r  dictgccollectr;  ((  r   watchlist_check_counterklines_refresh_countermarket_regime_counter_last_display_time	iteration	_now_fast_fast_candidatesr'  _fresh
_market_ok_ms_safer   _hot_hot_sym_hot_age
_hot_scoreold_regime_nameold_maxnew_regime_namer  new_maxr  rP   r  rv  ru  rw  new_sl
lock_labelr5  r\  n_pos_cooldown_oksymbols_to_sellsell_signalsell_all_pathr  _pause_until
pause_path_resume_e
_remainingr}   r  r  r  current_timeretraining_resultsmodels
all_prices_current_regime_rt_prev_regime_rt_bull_regimes	_was_bull_is_bearish_now_regime_degraded_btc_mom_rt_btc_stress_last_rt_action_trigger_sold_rt_tightened_rt_sym_rt_pos_rt
_cur_px_rt_ep_rt_pnl_rt	_tight_sl_old_sl_e_rt_bm_erk  _ts_rawr*  r  r  _pattern_posmin_age_minutes_market_stress_btc_mom_reg_qer  rS  r  r  r  market_safetyis_safesafety_reasonai_buy_candidatesr  r  r  r1  _now_hot
_fresh_hot_existing_syms
_added_hot_hot_sigfresh_watchlistDANGEROUS_PATTERNS_min_score_regimeMIN_SCORE_ABSOLUTEwlr  sigr  r  rq  r  r  r  _pre_rsir  
signal_ageMAX_SIGNAL_AGE_sig_features_sig_ema_slope_sig_cross_age_sig_rsi_f1_bot_regime_f1_slope_fort_slope_post	_rsi_post	_ema_fort_post_creux_rej_reason_sig_ema21_slope_bot_regime_ema21_threshold
fresh_datafresh_scorefresh_patternfresh_featuresfresh_data_tsfresh_data_agefresh_pattern_check	klines_1hc1hh1hl1hema9_1hema21_1hmom_3h_coinmom_6h_coinprice_3h_max_highfall_from_3h_highlow_4hnear_4h_bottom_1h_range_4h_near_squeeze_breakout_MAJOR_COINS_SPY_range_24h_totalcoin_1h_bearish_fres_feats_1h_fresh_mom3_btc_fresh_rsi_btc_btc_at_genuine_bottom_altcoin_at_genuine_bottom_sig_score_1h_is_bull_strong_override_bull_high_score_overrideklines_5m_pph5mpeak_5mdrop_5mprior_low_5mpump_amp_5mmom5_5m	bottom_5mis_at_bottom_5mrecovery_from_bottom_5mis_recovering_from_bottom_is_bull_strong_now_vol_ratio_info_buy_4c_sell_4c_sig_rsi_antipump_pump_exception_extreme_rsi_bull_pump_threshold_e5mcache_scorecache_patternpm_fresh_was_hot_achat_pattern_still_valid_allow_hot_overrider?  r  	fresh_rsir  r  ema_trend_bearish_featis_end_of_cycleis_dip_exemptpattern_cacheis_baisse_active_sig_is_achatis_creux_exempt
_btc_direcDIP_PATTERNSBREAKOUT_PATTERNSEXCEPTIONAL_PATTERNSBLOCKED_PATTERNSis_dip_conditionsis_dip_patternmomentum_stabilizing_fresh_smart_ok
is_dip_buyis_breakout_pattern_base_score_breakoutis_high_confidencehas_momentumis_breakout_buyr  is_exceptional_scoreis_neutral_high_score_base_score_smartis_smart_validatedr  strategies_used_prices_rsi_ema9_ema21_mom3_mom5	_ema_diffr  r  r  should_blockoutlier_analysisr  r  lot_size_blacklistblacklist_timeregime_min_scorer  REBOUND_PATTERNSr  r  r  r%  r  r\  is_bearish_signalrc  r  r  _candles_cross_dt_bull_override_reg_dt_ema_fall_regime_ema_fall_threshold_bb_posbearish_strrO  rk  candr0  _stoploss_cluster_pause_sl_count_60m_json_cb_dt_cb_td_cb
_cutoff_cb
_tlog_path_f_cb	_lines_cb_line_cb_t_cb
_ts_str_cb_ts_cb_e_cbmax_buys_per_cycle	buys_donebest_air  r  ai_signals_count_now_cleanupr.  r  _stale_cutoffattrdvstaler  	_now_dispr  r  r  s(                                                                                                                                                                                                                                                                                                       @@@r   trading_loopzTradingBot.trading_loop  sK     mmAA$,,PQ"#!" !	llNIA~;I;FVW[WcWcVdef t./D4H4H IIK	#% .. 2)-)=)=kAQUUS`bcMdAdgjAjakFk+1D(2 c$"7"7"A"ABTEcEcEee!%J009<%*
!!"3"5C'*'7'7'9HE1#(-2
 "$* }D'+xx'9H'0488M13M'MH)-'1)=J  ("}r1A %(:8*DVW_`cVddmnxmyyz&{ |} "Q&!$*%%\.-1-?-?-R-R-T*"&"4"4"F"F"H ;?:L:L:Z:Zhl:Z:m7"&"4"4"F"F"H +o=GAS$($6$6$B$B$F$F~WX$YE!$B?BSSUV]U^^hixhyy{  }D  |E  ES  TY  SZ  Z[  #\  ]  /2HH_  aH  NH %(XYhXi  j_  '`  !a.243H3H3R3R3W3W3Y.Z !ZF*.*?*?*I*I&*QC'2c'9ms>R-0-?)859[[5J5J65R5XVXF 5;RK13D2K+2S=5;e^F;RSZ[_R``b9cJ 68%ZF;NwW[n\^9_J+1C4D+DRX585EF7={b6HC5OF?EC,<,1JvheFSV<W\]cdg\hhjkqrvjw  xK  LV  KW  WX  3Y  -Z/!Z0!)$($9$9$I$I$K ),D,A,A,K,K(L04		gdLgij>k0kos/s#(196:4;P;P;Z;Z;_;_;a6bO2E3B4A/ARRWXgWh2i5=\\^5M5M5O	3&K 57GGLLMc4dM%c-1-w-W )Q[],0IIk2a,P)QIM(F7;yy{T7I57WW\\*Nb5c
-1*cG-T )3XZ,0II@L<FFW:X=E\\^=U=U=W7. 02	-3)3 EQ(A2:2H2H2V2_2_`j2k(-0STYSZZijyiz.{(|(-?P.Q(R(-0`ah`i.j(k &+QY|14TTYY[4KiKi=i5j1kJ$),RS]R^^i*j$k %)$6$6$B$B$F$F~WX$YE!$B?BSSUV]U^^lmrlsst"uv )*% #a'"%+"&"4"4Sb"9 c!%!7!7@PRT!U!27f8Uqt8U^a2bDKK/	c *+& ""#yy{ 4#9#99dBNVW-1-@-@-O-O-Q*-!&M!"DE!&M!O4F4J4J8UZ4[3\"]^!O4F4J4J:WX4YZ]3^^_"`a%7%;%;<NPR%SF% %(9$))F:K9L&M N!&M!"HI .:D* A!%!;!;!=J"&"4"4 K!Z/ KK/66z&7IJK !!==?6(,(:(:(M(M(O%"A")$0DFX"Y !=+}<	"48Y"Y#,#@  &k?AF)D0$T=R=R=\=\9]`a9a&-d4RTU&VOyy{_4r9:J#6RbcnorbssuPv @
"_L]]`as`ttuvw#$()04T5J5J5T5T5Z5Z5\0] %,GW%-1-B-B-I-I-S-ST[-\
'1$,)0]J)O,6,?1+D*K $+S=$),EgYfU\]aTbbu*v$w$($9$9$H$HTdelmqdrrtRu$v$,MH 1;U0BI.5kk+q.IG'07':?H(<(5(:(-0H	QST[\_S``cdmnqcr  sJ  /K  )L)%0 $a<=1+< 11AAC!OH:ZVd"ef<@IIK9*<'
 4!56*+'##q(#&&!+))CCE +,' t44>>CCEF C>T[[(SV1D-E-K  $44>>BB6JH
 #+,,{D"A%gx8)0):):)<J'59-5-C-CG-L-V-V-X
 *.J04		j0HB/N,W^_cetWu););)N)N)PQR)S  |E (0||Ir'B'?:.0O)]:.0O.1O */!'.{OQ'OH)-););)N)N)PJGQ.6o.bLbAbN *./O//A!Kx7J>JZZk  mA  BE  lF  FL  M\  L]  ]a  #b  c$/3/D/D/Y/YZ`bfbmbmntbu/v,K"	&K=AB--<<V\R26))+/GC>L $q(#&",%%'*+' 		d999dBNO11t1<.2iik+
 ((499;6 9 9DIIK GH	#r/#b.CG9BwiWXYZVX'')mmA&&&
 ./M%2%?%?%A"G]0	M?!LM1-ABde'')mmA&&&cd
 !# #D$9$9$C$C D ::<MEFWEXXYZgYhhwx|  yR  yR  Z^  y^  x_  `  a=d>W>W_c>c=dds  uF  IV  uV  tW  X  Y((->-N[* $ 9 9 Q Q SI$-MM/2$FM t%67D<P<P#'99;!66 e595I5I *W-5mQ8O-ORU-U +, *WJ *W3=D0GT-U!aeeHo-UN-U)*J,6 4#+<<#9#O$1$8$8H$E$2$6$6x7I$J$.!OJ	4
  *A~ %<b&c de ?M@R?SS^_` ')O *i& )2%,0,=,=,P,P,R) 0AM/QWY&t^49J9Jb!%!2!2!@!@!BBKM.NaquuX/A.NO.N  - f!$!2 !$ 3"%'')Y"?  ''5I*I&/G 0KE7R[\c[ddefg	!#*41I#J J>L>N ;!%!<!<B#%#8#8#A %
7)Kj&k l ( $B!\/7/@/E/E,16FJc6c ,/77:r+B+F+Fub+Q#*o#=(b.$)GF8;YZbcfYg  hJ  K[  J\  \b  +c  %d$)HVH<MN^M__u*v$w$, '*ggmQ&?%)YY[;%>
 *-"o5%2+-0N"b[-0NvhfZ<LFSaRbbcde%6!GF83HTWHXX\]k\llx"yz$ ),
B(?)6):):;)M)6):):;XZ^)_ #o5.:T*7*;*;E2*FK\484F4F4Y4Y4[ 1
  .>.2.2.0	!/;!>.2.2.0	.2.2.0	)7;)FI+9[+H+d[[dMdK(K (1 '10DB{mSmn|m}}~$&00DB{mSZ[fgjZkklmvlw  xN  O]  N^  ^_  %` !,
 !&8TU`Ta&b c ( *5!n:Pq:P!HVH4QR`Qa  bU  #V  W$ ,9+<+<]D+Q("o5:J:VY151C1C1V1V1XQ 8CF\7\tbf,/2BB %8`aqru`vvz  |L  {M  Mk  lw  kx  xy  'z  !{ ( &5%8%8%D
&0nnWa&@(2y)(L)3
B)G	&$z:J9K8T_S``jkxjyz{
 )3{JNNS`bcDd(eHU})D[\(^c-A!GF83TUcdgTh  iQ  #R  S$ /9nnY.P+"&CCGZ^{G{lx,0KK,M,MfVZ\^jl,M,m	#,Y21E@I*J151;*JC*J@I*J151;*JC*J@I*J151;*JC*J.1#yjk2B.Ci.OG/23Hc#h8O7O7P3Q/RUXYacfgjckUl/lHY\]`YaefYf3r7SW3DB2ORU2UlmKY\]`YaefYf3r7SW3DB2ORU2UlmK
 JMSUVCH\_`b\c$59<RCT9TXi8ilo8o$5
 ?B#h!mSRS]QTUWQXF69"g6F#fV[J\5\_b5beh5hN
 58BCMCBCM4QUXY\]`acad]eYfhmUn3nqt3tL
 >JC=O  >DT_bfTf  >Dk|  @D  lD$: 8_$48;C3s88KsSVWZS[]bOc7cfi7i$4'7#'=F\agoa(-VHD^_ops^t  uO  /P  )Q(0)08);)Rd@R )U)4t);)U)4t);)U *;T)A *TJ`F` *T-;);*T*1H*<*Rd@R %4 (7
 :D
TWT[T[\fhjTk9l:H:L:L\[\:]9G9K9KESU9V,2i,? -@,:-@,7$,>-@ -<d,B-@ -;R,? )? -3i,? -?,:-?,:R,?-? -<d,B-? -8$,> )C 9<8KCH(@)RGKGXGXGkGkGmq~G~,D -E -p,9R,?-p,7$,>-p -8$,>-p ->,D	-p
 .<-nGhDVDm[fim[m?n )B ,B,1KxG|  ~I  JN  }O  OX  Yh  im  Xn  nu  vD  EH  uI  IJ  3K  -L-G,1Kx  HB  CQ  RU  BV  Va  bq  rv  aw  w  3@  -A-F,1KxGefset  u\  ]h  im  \n  n|  }N  OS  |T  TV  3W  -X,1LH{  }D  EM  }M  |N  NV  Wb  cg  Vh  hq  r}  ~B  qC  CQ  Rc  dh  Qi  it  uC  tD  DN  Oe  Nf  fg  ht  ux  gy  y|  3}  -~,14r,t,4(-F8Cfgrswfx  yB  CN  OS  BT  Tb  ct  uy  bz  zE  FT  EU  U_  `v  _w  wx  yE  FI  xJ  JM  /N  )O #&CC?j/3{{/P/PQWY]_amo/P/p#/C4E4K@L*M151;*MC@L*M151;*MC*M.1#cd)nGU\_`U`s2w/@G.Kc.QfgGGJ3xSU~3s3r{3C[^knorksvwkw_bcfdf_g  ~A  \BLcorscs7\3I\2Y\_2_yzKUXY\U]abUbs2wR/@CG.Kc.QhiG
 14CII7:2w7JcR[]bNc6cfi6ilo6oO
 @C2w?RVYZcejVk>knq>q$;@WZ]@]$= ;@$7%->B>O>O>b>b>d  iE  ?E(; 7:O%-FR0Sqt0SFR0Sqt0S255p5p5QR85p2p366p6pERSH6p3p:BSRS_:T %*Jvh>ST[\`Saaijuvzi{  |D  EL  MQ  DR  R^  _n  ^o  oz  {R  SW  zX  Xd  et  ux  dy  yz  +{  %| 9<
B8O8S8STY[]8^$5CTXZCZCp_jmp_p$?
 CV3[^$8'./'A/b{  AL  Oc  Ac+F,1GF8Cij{|  jA  AW  Xc  dh  Wi  iL  3M  -N,1HVHDop{  }A  pB  BK  L`  ad  Ke  eB  CZ  [_  B`  `E  3F  -G,4 &*-'''1*=K,/GGIy,IM $1MEY4Y09  -0BB %Vl&m n (  +-?? %{mS_`r_ss~&  !A (  #;#<=C %x7QR]Q^^fgrfss~&  !A ,7CL  -)1K!)$N/=/?H+3+F+F}+U(-@PQ^P__~.  )A(0 ,V
 2?I*7 $+i#7$)Jvh>OPWy  YV  +W  %X*31:I.<C
O /2ggn.E.P.uUXU\U\]motUuN4A4`mW`F`03A3ZFZ/-;DW6@6PN 3/:=FY8BCS8T$4 5
 +9*<*<]C*PK'5'9'9*a'HH(6(:(:5"(EI)7););L!)LJ)7););L!)LJ 6D5G5G 3%-%5162  )B3IQ3N#-#4$)L@XYbcfXg  hI  +J  %K$),?
3?O  PH  +I  %J$,$)GF86)CPy  {E  FI  zJ  JY  +Z  %[  )2~2HA2MR\_bRb %VH<WXabeWffx  zD  EH  yI  IV  'W  !X %(~  !A (  (%/ING]abGbgqtwgw %8_`hil_mmst}  B  tC  CO  'P  !Q %(e g ( !+T 1 !- *T 1!- (1 , .58U-U-kZdgkZkM.}03	90M %8lmwx{l|  }D  EO  PS  DT  TV  'W  !X %(:=/T\]`Saat&u v ( !)5 0 !2 *T 1 - .1WW^-D-O-tTWT[T[\lnsTtM '+H H !. *T 1!. *U 2!. !*B!. !*B	!.
 !7! ;!. !)4!. !./ !') 3 !. '+H H!. *T 1!. !+U 2!. !*B	!.
 !*B!. !)4!. !.) ,.  0 %8ST\]`Saahistwhx  yL  'M  !N (!1o %x7`aijm`nntu~  @C  uD  Dj  'k  !l  '*GGFV_L_-4[/ST-U
#-#4$)Kx?ablmqarrt*u$v$, -<Z+HL 2D0D- 5J3J0 1C/C, 2:D1jYQS^1jXcfjXj-.5.EN4>4E0
 03ww~/F'/Q/vVYV]V]^npuVvO
 !0 !F +/A A!F 4!F "3!Dn	 ' 4;>O3O/3A3E3ElT_3`02F"2L2bQ\`bQb.,6,<L
 "5!Jd9J !F!3!D , *8););L+)VJ !7! ; !"&1R&7&LJ"<L%`R\_`R` %Y%,0D%D%WVW4 !') 3 !/ +r 1!/6@B6F!/ *T 1!/ !)4!/ !*B 12 !7! ; !2 '9 4!2 +r 1!2 !+T 15 !') 3 !0 '9 4!0 +r 1!0 !+T 1!0 !)4 2( 1?0B0B<Q\0]- # 77 B !2 #(8% @!2 +r 1!2 !2R 7!2 !+T 1 / %//EY]r  wI*,#+t#3	R$+NN^HS>QWXabeWffg3h$i':CU$+NN5J7)SZ[fZggh3i$j#.#3$+NN5L[MYZ3[$\ $.#5$+NNU:c:J)3T$U#.#5$+NNW[<MZ3X$Y %8WX]XbXbcjXkWl&m n ( /1O) / 6 6HT?RXYbcfXggh7i j. / 6 6G9A7N O3 / 6 69Mk]Z[7\ ]4 / 6 69Mk]Z[7\ ]1 / 6 69PQ\P]]^7_ `!GF83QRWR\R\]lRmQn"op %0E&3G
 %(GGGQ$7E&)ggi&CG!Jvh6mnsmtt~  @G  H  HI  #J  K  %'99 %ugSQcPd  e]  '^  !_ (  &4T[[=P9QUW9W*.t{{6/B*CCD*I':'>'>w'K(;(?(?(S)<)@)@()SUXY`UaefUfwr{)Bgbk(QlmUXY`UaefUfwr{)Bgbk(Qlm#(V
1660II (17':uv~CGT#JS(-@cdmnqcrrxy~  @C  yD  DI  JQ  IR  R^  /_  )`(0 (-v~%&.YYZ](-@^_deh_hil^mmtuz{~u~  @C  uD  DQ  /R  )S(0  .._#)T[[#8SVAT=UY[=[26t{{67J2KCD2QK3677:r3J3N3NyZ\3]L+7GDKKQ^<_)X59[[5K5KFTdfh5iF\bQW;XAE!A$K;XhjL
 FJEXEXEnEn/5/:@LSZR[^abm^nRnT^N,>,>ui,PdhfpN4F4F}Va4bvz9= Fo F&$BL2B (48H(-
6(+N^NeNeMffhiy  jE  jE  FI  iJ  JY  Z_  Y`  `k  /l  )m
 !2:#00!)$($5$5$@$@5=\\^287<493:8;PW8X:=''BRTX:Y47GGJ4K8;PR8S49>MeWTZ<[4@	I`2aB& %'  % "T%:%:%D%DD#00!)$($5$5$@$@5=\\^287<493:8;PW8X:=''BRTX:Y47GGJ4K8;PR8S49<Q4B7)Kh2iB& %'  %
 *-1A5)I'*ww~v'F-1H#00!)$($5$5$@$@5=\\^287<493:8D:H47GGJ4K8;PR8S49>VWeVffop|o}}~<4@	Ii2jB& %'  "HVH4UVdUeeno{n||}"~$ .m*"&88!HVH4QRYQZZ["\]$ .5T5J5JLace-f*!%77-?-G-K-KK-XN-8<<>N3R2a2a2cfj2j ( %7v$> ,.(&/--%>B>P>P>c>c>e ;^3A3E3EkSU3V 0
 !#33#00!)$($5$5$@$@5=\\^287<493:8;PW8X:=''BRTX:Y47GGJ4K8;PR8S49>VW\V]]deudvv  AL  @M  MN  =O4B5'Icdocppw  yI  xJ  JK  3LB& %'  "KxxwcJZI[[efqerr}"~$,( ')3GW8W "Kxz'  KA  #B  C$&*@@WTdEd!Kxz'J^_j^k  lG  #H  I$&*@@WP`E`ejmoeo!KxxwF[\g[hhr"st$
 !$666I^I^IhIh;h-4T5J5JLace-fN%7DIIK.Y_J`<`,/v0F0T,U	 %8PQZP[[q&r s (  &8*.))+8O*O#*T-@-@#@'+'8'8)1,0,=,=,H,H=E\\^:@?D<A;B@CX_@`BE''JZ\`Ba<?GGJPR<S@CXZ@[<AFPQTUYUhUhkrUrQsPt  uA  EB<H	Qd:eJ. -/  %- (+wwz2'>H"*,,ub"9C08=PRS0T-(0[!(DI)1lA)FJ)1lA)FJ 16-.0O  '.848 1 / 6 69KJWZK[[bcmnqbrrt7u v  #RxJ,=48 1 / 6 69KCPS9TYZdehYiik7l m  )4/C"H48 1 / 6 69MiX[_\]7^ _  114
UV48 1 / 6 69KE7RXYcdgYghkXlln7o p
  114r48 1 / 6 69McRUYVc7d e  '*>>2:,,?PRS2T4<LLATVW4X 1#2a#7<MQR<R8<$5$3$:$:=XYhXiiu  wH  vI  IJ  <K  %L$)GF8  <C  +D  %E .1>[]^1_-`N 16-%*.*;*;*N*N*P#1R#7)0M)A)Qerk )Q)0K)?)OERK %6 &4r%9)0M)A)Qerk %6 !2A 5.2:M(/3P(P,=48 1 / 6 6&;N;KKf$g!" !&8STbSc  dP  'Q  !R!/"!49J %F8;^_f^ggpqvpwwy  {I  zJ  JS  'T  !U 09,%373D3D3W3W3Y 0 <L};\%k{  @K  lKbg  QV/014EX9X]`ce]e48 1 / 6 6&A)CPQReQfflmpqtluu~  @P  Q  QR  %S!" '/ll=#&FG 1A 5'D.(/3P(P48 1 / 6 6&>wsmKl$m!" !&8ST[\_S``x&y z  1S5IQ5N %8`aeajajkza{`||}&~ #'#4#4%-6:ii6P(,(9(9(D(D9A6<;@8=7><?GGNT[<\>AggFVX\>]8@<?GGNTV<W8=BRS^R__`@a8DWIM^6_F* )+  !)  #RxJN %x7PQTUXPYYnoyz}n~~  'A  !B%(WWXgY7G%HF-44*0*/;@Y`.a,<WIXeWTZ[^_bZccd*e,1'*,138RsUWx]^,_37	6 	{"fZ# ((->--O $ 9 9 Q Q SI$-MM/2$FM, %,,% $ 1 1 < <19.1ggh.?38030C/2wwy)/L47GGNG4T69gg>NPT6U03
B0G47GGNB4O05:IJ[I\\]^k]llm8n0;CGGI<N;OOj.k>" !#%. !!&&+BD&Q237H3I2J"MN():2A)>? UGAt%&!V6!q&eDCvQtH~&6htJ?O>PPYZ^_kZlZpZpqzZ{Y|  }B  CG  HM  CN  OR  BS  T  UU +0' !+PP!'6"3E!EJ!#bggooh.GWi!jJww~~j1!*cGD A(-(9$%(@IA(1 	%H%(0x~~7G(H#(99Xr#:#E#Ek#RW\]b]f]fglno]pWqtuWu14UYY{B5O1PQTRT1UJ-3__ZI\-]F'-
':(5(:	% %)26/ >}oM~  A &'"	0 EG.7<3H3L3LY3W[j3j):(;;hivhw  xB  C  D (=8YI[=["8,D4I4I4S4SS!$5gh6G5H	RYZdReQffg"hi //0A5'R^J_ahiqars%NI-2-*m;	L^@^"8,D4I4I4S4SS<@<W<W<Y9NM-'*2EXYHY2Y %(I.IYYabopsattz  |C  DL  |M  {N  NV  W^  _i  Wj  kn  Vo  op  'q  !r $ 5 5 D D^Uo pBF))+ ? 1Q 6 1&-mmC&8 8 8 %(HQYIZH[[delmwexdyyz&{ | $ 3 3GH4EugVbNcelmuev w )Q	 1Q 6 1 !&0A/BBTUfTgghivhwwx&y z $ 4 4 ; ;G D=Ev !$D$9$9$C$C D ::<M9Js#45PQ+,<+==VWhViijkxjyz{  99;L4!45)*&d444;)5&t{{O<151O1O1U1U1W #> #>A&2Q&6&< $% #> #>!( HA KK5599!TB KK::>>q$GH 400>>?#E>B>S>S>a>abfbg>h--;$05$8M T )#D$5%a.3q6C<34779 %[ %[41a(21sEl(CMHY &' %[E %[%* )$%aD)) JJL 		I--3##%%."--$$$G7 ll 	2 l2 2  ) ! !X 09 )857F)8( (1 !)$(!)()Q )Q)3 )3 ,5 %c(-0\]_\`.a(b(b%c % . NqcRS(!++--. 9V  6 % N HLMMN ! A;A3?@@Ap $- % $%   ! 8 $- 9-1YY[
9J  ) ! !P '" '2*W .V	e e< %  /O( b!$\]^\_"`aab6  ) ! !&  + ! !T $- \18?OQZ1[\T $- Y.5d<Li.XYD +K*J*J` 09 )RHOPTVfHg  IQlpll  DQ  mQ,D)R, $- x %
6(:TUVTWWu&v w wx +N*M0 ,5 %-(,%-
 1T0S ,5 %-(,%-0 $- j %
6(:`ae`ffg&h i ijX (1 !)$(!)^ <Y)X<C9s;GW;WL $- _ %
6(:YZ[Y\&] ^ ^_* (1 !)$(!), (1 !)$(!)6 (1 !)$(!)P $- % $%* (1 !)$(!)F 09 )1,0)1d $- % $%, $- % $%V ,5 %-(,%-( ! *RSTRUVW$''))*6 $- % $%  ,A A $- % $%
 ! : !9j#>%[ !  %s*  Cq3C^?BCq36C_C_#C_'	C_0ACq3 !C_ !ACq3&Cq3,0Cq3D"Ca  Ca Ca C_$*1Ca Ca "5Ca C_6 2CCa >C`  C`%A*C`  >C`A C`  -B Ca -Cq3:5Cb 0	Cb 9Ca>
Cb &5Cq3CCb *Cq38-Cb? &#Cb? 	Cq3%C7Cc4 'Cc$Cc4 BCc$ACc4 67Cq3.Cd ACq3Cq3+A+Cq3#Cd":B Cq3;9Ce4ACq3E!Cq3)Ce*A8Cq3"Ce#BCq39A$Cn< Ce&,!CeCe&Ce!2Ce&ACe&@(Cn< @9Ce3 A!Cn< A5Cf BCfB,Cf B.ACn< DACf-ECn< EBCf=GCCn< JCgJ9B&Cn< M Cg*M=DCn< R5CiR7ChSCiSChS'CiS-ChTF-CiZ/Cn< Z1CCi^Ch^!CCia1Cn< a3-Cib Cn< b&6Cj#cCi/c1Cj#c9Ci4dC5Cj#hCi9h Cj#h$Cjh(Cj	h=CjiCjiACjj3B.Cj#m!BCn< p1Ckp2`Cn< QBCk;S'Ck#S<CkTCk#TBCk;V,Cn< V>BCl%Y
&Cn< Y1BCl5[8=Cn< \6A,Cm^"B%Cn< a0Cma8Cn< b
BCm,d$BCn< f4Cn< gB=Cn< jB"Cm<l.F8Cn< s'ACnt4A#Cn< vCnv2CCn< zBCn,|A?Cn< ~Cq3~3=Cp 2CCo6B>Cp C B*Cq3E+B#Cp3 HCpH&Cp3 H6B*Cp#K Cp3 K=A,Cq3M*ACq3N<Cq3OCq3O!B,Cq3RCqRD&Cq3V5?Cq  W4CqXCCq  [%Cq  [6Cq  \+Cq\6*Cq  ] A
Cq3^*Cq0^+Cq3^=Cq3_C__C__Cq3_	C_!_Cq3_ C_!_!Cq3_$C_3_/Ca _2C_3_3Ca _6	C`_?Ca `C``Ca `C``C`  `C``C`  ` 	Ca`)C`=`7Ca `=CaaCa a	Ca;a"Ca6a0Cq3a6Ca;a;Cq3a>Cb b	CbbCq3bCbbCq3b	Cb<b#Cb7b1Cq3b7Cb<b<Cq3b?	Cc!cCccCq3cCc!c!Cq3c$	Cc1c-Cc4 c0Cc1c1Cc4 c4	Cdc=Cq3dCddCq3d	CddCq3dCddCq3d"Ced?Cq3eCeeCq3e	CeeCq3eCeeCq3eCq3e
Ce&e&Ce0e+Cn< e3	Cf e<Cn< e?Cf f Cn< fCf f	Cf*fCf%fCn< f%Cf*f*Cn< f-	Cf:f6Cn< f9Cf:f:Cn< f=	Cg
gCn< g	Cg
g
Cn< gCg'g#Cn< g&Cg'g'Cn< g*Chh Cn< hChhCn< hCih&Ci h<Cih?Ci i Cii	Ci,iCi'i!Cn< i'Ci,i,Cn< i/
Cj#i9	CjjCj#jCjjCj#j	
Cjj	Cj jCj#jCj j Cj#j#	Ckj,Ckk Cn< kCkkCn< k	CkkCn< kCkkCn< kCk#k#Ck8k5Ck;k;	Cl"lCllCn< lCl"l"Cn< l%	Cl2l.Cn< l1Cl2l2Cn< l5	Cml>Cn< mCmmCn< m	CmmCn< mCmmCn< m	Cm)mCn< m$Cm)m)Cn< m,	Cm9m5Cn< m8Cm9m9Cn< m<	Cn	nCn< nCn	n	Cn< n	CnnCn< nCnnCn< n	Cn)n%Cn< n(Cn)n)Cn< n,	Cn9n5Cn< n8Cn9n9Cn< n<	Co3o#Co.o(Cq3o.Co3o3Cq3o6	Cpo?Cp pCppCp p	CppCq3pCppCq3pCp pCp3 p#	Cp0p,Cp3 p/Cp0p0Cp3 p3
Cqp=Cq3qCqqCq3qCq  q 	Cq-q)Cq3q,Cq-q-Cq3c           	      p   K   	 t        d        j                  r~	 	 t        j                  j	                  t
        d      }t        j                  j                  |      rt        |d      5 }t        j                  |      }ddd       j                  dd      }t        |t        t        f      rS| j                  kD  rD| _        t        |t        j                         z
        }|dkD  rt        d|dz   d	|dz   d
       t        j                  j	                  t
        d      }t        j                  j                  |      rt        d       	 t        |dd      5 }t        j                  |      }ddd       j                  d      }|j                  d      }	|j                  dd      }
|rO|	rL|
rI j                  t        j                         kD  r^t         j                  t        j                         z
        }|dz  }|dz  }t        d| d| d
       	 t        j"                  |       /t        d       t        d|        t        d|	        | j$                  j&                  v r|||	dddddgdgd}t(        r]t+               } fd}|j-                  ||      }|j                  d      rt        d       n:t        d|j                  d d!              nt        d"       nt        d#| d$       t        j"                  |       t        d%       	 t        j                  j	                  t
        d'      }t        j                  j                  |      r+t        |d      5 }t        j                  |      }ddd       ni }t/         j$                  j&                        }t/              }t        j                  j	                  t
        d(      }d}t        j                  j                  |      rd}t        d)       ||k  s|rb j$                  j&                  D cg c]	  }||vs| }}|r4|s2|dkD  r-t1         j$                  j&                  j3                               }|rt        d*| d+| d,       t        d-|        |D ]U  }| j$                  j&                  v r j$                  j&                  |= t        j                         d.z    j4                  |<   W  j$                  j7                          t        d/t/         j$                  j&                         d0       |r@t        j                  j                  |      r!	 t        j"                  |       t        d1       t        j                  j	                  t
        d(      }t        j                  j                  |      r-	 t        |d      5 }t        j                  |      }|j                  d2d3      }|d4v rt        d5| d6       |j                  d7g       }|s-t1         j$                  j&                  j3                               }|st        d8       	  j8                  j;                         }|d9   D ]]  }|d:   } | d;v rt        |d<         }!t        |d=         }"|!|"z   dkD  s2|  d>}#|j=                  |#       t        d?|# d@|!|"z   dAd6       _ 	 |rt        dCt/        |       dD|        |D ]  }#	  j$                  j?                  |#dE      }|r}t        dF|# dG       t        j                         d.z    j4                  |#<   |# j$                  j&                  v r j$                  j&                  |#=  j$                  j7                          ngt        dH|# dI       |# j$                  j&                  v r@ j$                  j&                  |#=  j$                  j7                          t        dJ|# dK       	  j$                  j7                          t/         j$                  j&                        }$|$dk(  rMt         j$                  j@                  dN      5 }t        jB                  i |dOP       ddd       t        dQ       nt        dR|$ dS       nt        dT       t        j                         d.z    _        t        j                  j	                  t
        d      }%	 t        |%dN      5 }t        jB                   j                  dUtE        jF                         jI                         dV|       ddd       tE        jJ                   j                        jM                  dX      }&t        dY|& dZ       t        d[       t        d\       tO        d]      D ]C  }'	 t        j                  j                  |      r t        j"                  |       t        d^        n ddd       t        j                         }(tW         dd      sde _,        |( jX                  z
  dfk\  rD|( _,        	  jZ                  r/t/         j$                  j&                        dkD  r jZ                  j]                         \  })}*|)dgv rg }+t1         j$                  j&                  j_                               D ]^  \  },}-	  j8                  ja                  |,      }.|.r;|-j                  dhd      dkD  r&|.|-dh   z  dbz
  dz  }/|/dik  r|+j=                  |,|/f       ` |+rYt        dj|) dkt/        |+       dl       |+D ]9  \  },}0t        dm|, dn|0dodp       	  j$                  j?                  |,dq|) d6       ; tS        jT                  dO       d{     j                  r}yy# 1 sw Y   xY w# t         $ r Y 
w xY w# 1 sw Y   
@xY w#  Y 	xY w# t         $ r7}t        d&|        	 t        j"                  |       n#  Y nxY wY d}~d}~ww xY w# 1 sw Y   xY wc c}w #  Y xY w# t         $ r}Y d}~d}~ww xY w# t         $ r}t        dB|        Y d}~d}~ww xY w# t         $ rt}t        dH|# dL|        |# j$                  j&                  v r@ j$                  j&                  |#=  j$                  j7                          t        dJ|# dM       Y d}~d}~ww xY w# 1 sw Y   mxY w# 1 sw Y   xY w# t         $ r}t        dW|        Y d}~d}~ww xY w# tP        $ r3 |'dOk  rtS        jT                  d_       d{  7   nt        d`       Y w xY w# 1 sw Y   ~xY w# t         $ r}t        da|        tO        dO      D ]b  }'	 t        j                  j                  |      rt        j"                  |        n+#  |'dbk  rtS        jT                  dc       d{  7   Y axY w Y d}~d}~ww xY w# t         $ r Y `w xY w# t         $ r}1t        dr|, ds|1        Y d}1~1d}1~1ww xY w# t         $ r}2Y d}2~2d}2~2ww xY w# t         $ r}t        dt|        Y d}~d}~ww xY w7 # t         $ r,}3t        du|3        ddl1}4|4je                          Y d}3~3yd}3~3ww xY ww)vuV   Boucle dédiée pour vérifier les triggers (rotation, sell_all) toutes les 2 secondesu+      🔍 Vérificateur de triggers démarrér  r  Nr  r   u+      ⏸️ PAUSE DÉTECTÉE depuis fichier: r  r  r  zrotation_trigger.jsonu#      🔔 Trigger rotation détecté!r   r  sell_symbol
buy_symbolr  Fu.   
⏸️ ROTATION BLOQUÉE - Trading en pause: r  u,   
🔄 ROTATION MANUELLE reçue du Dashboard!u      📤 Vendre: u      📥 Acheter: r  TzRotation manuelle Dashboard)r  r  r  	buy_score	advantager  r  r  c                    |dk(  r/j                   j                  | |      }|rt        d|  d       |S |dk(  rj                  j	                         }|syt        |d   j                     d         }j                         }|dkD  r||z  nd}j                   j                  | d|d	
      }|rt        d|  d       |S y)Nr   u         ✅ Vente u    exécutéer   Fr   r   r   MANUAL_ROTATION)r  u         ✅ Achat u
    exécuté)	r  rt  rp   r  r   r\   usdt_idxr'  rR  )	rP   r  rO  r   r   	free_usdtr  r  r   s	           r   execute_orderz5TradingBot.check_triggers_loop.<locals>.execute_order  s    /5/?9=9N9N9]9]^dfl9m3949<LVHT_:`4a7=175:>++:Q:Q:S7>;@<A'*BUVZVcVcBdekBl<m	@D@^@^@`\ilm\my=?Xst :>9N9N9\9\]cejlxev :] :x3949<LVHT^:_4`7=38r   rG  u"      ✅ ROTATION MANUELLE RÉUSSIE!u      ❌ Rotation échouée: rO  zErreur inconnueu-      ⚠️ Module SmartRotation non disponibler  z n'est pas en position!u0      🗑️ Trigger rotation traité et suppriméu.      ⚠️ Erreur traitement rotation trigger: r  r  uN      🚨 SELL_ALL_SIGNAL détecté dans check_triggers → force clear mémoireu      🔄 SYNC DISK: u    positions en mémoire, z sur disqueu+      🔄 Positions supprimées externement: rH   u      ✅ Mémoire synchronisée: r   uA      🗑️ sell_all_signal.json supprimé (traité par disk sync)r  r  )SELL_ALLr}  u5   
🚨 SIGNAL VENDRE TOUT reçu du Dashboard! (action=r  r   uN      ⚠️ Aucune position dans signal/positions.json, vérification Binance...r   r   )r  r  r  r  r   r   r  u         Détecté sur Binance: rb  r   u%      ❌ Erreur vérification Binance: u      📋 Vente de z positions: manual_sell_allr  z vendur  u    échec de venter  u&    retiré du dictionnaire des positionsz	 erreur: u!    retiré du dictionnaire (erreur)r  r'  r  u;      📊 Vente terminée! positions.json vidé complètementu      📊 Vente terminée! (z) positions restantes dans positions.json)u+      ℹ️ Aucune position ouverte à vendrer  r  u+      ⚠️ Impossible de sauvegarder pause: r  u$      ⏸️ TRADING EN PAUSE jusqu'à z (5 minutes)u<      🔒 Aucun achat ne sera effectué pendant cette périodeu=      💾 Pause sauvegardée (active même après redémarrage)rh   u&      🗑️ Signal traité et supprimér  uA      ⚠️ Impossible de supprimer le fichier signal (verrouillé)u&      ⚠️ Erreur traitement sell_all: r   rP  _last_bear_reduction_checkrg  rc  r   r  rg  u   
🐻 RÉDUCTION PROACTIVE (r  z position(s) en perteu      ↩️  z: PnL=r   u   % → clôture immédiatezbear-proactive (u      ⚠️ Erreur clôture rT  u+      ⚠️ Erreur dans check_triggers_loop: u/      ❌ ERREUR FATALE dans check_triggers_loop: )3rp   r  r!   r"   r  r  r#   r   r[   r  rZ   r   rv   r\   r  rY   rz   r%   r  r  r?   r>   execute_rotationr   r   r  r  r  r  r   rf  rt  r  r$  r   r   r   r  r,  re  PermissionErrorrs  rt  r   r  r  r"  r  r   r  r%  )5r   pause_file_pathrd   r  
disk_pauser  rotation_trigger_filetriggerr  r  	is_manualr  r  manual_rotationrotation_mgrr  r   r}   disk_positions_filedisk_positions	mem_count
disk_countr&  force_clearr'  removed_symbolssell_all_filer  r  positions_to_sellr   r   r   r   r   rP   positions_leftr  pause_until_strattempt_now_br_regime_nowr   _bear_closures_sym_pos
_price_now_pnl_pct_pnl_e_close_e_brfatal_errorr  s5   `                                                    r   check_triggers_loopzTradingBot.check_triggers_loop  s    X	"?@,,LM*,'',,zCW*X77>>/:!%os!; :q-1YYq\
:)3)JJ)*sElC
UYUnUnHn<F 9,/
TYY[0H,I	#,q=$),WXaceXeWffjktuwkwjx  yC  +D  %E -/GGLLE\,])ww~~&;< CEY%!%&;S7!S 7WX*.))A,7 +2++m*DK)0\)BJ(/He(DI*zi#'#<#<tyy{#J03D4M4MPTPYPYP[4[0\I.72oG.7"nG$),[\c[ddfgnfooy*z${%-(*		2G(H %- %(U W %(8&F G %(9*&F G $/$2G2G2Q2Q#Q 8C6@695858269V8W8U7V	7&O (@7I7K)92 2>1N1N`m1n+1::i+@,14V,X,14OPVPZPZ[cevPwOx2y,z(-0](_$)J{mCZ*[$\ II&;<!$TV,.0ggll:GW.X+77>>*=>!%&93!? >1151> > .0N$'(=(=(G(G$H	%(%8
 ,.77<<
DZ+[(&+77>>*:; +/K!$rt &	1[:>:O:O:Y:Y.uQ]^ft]tq.uO.u*?yST}26t7L7L7V7V7[7[7]2^. %(;I;F^_i^jju&v w %(STcSd&e f)8 !KA'(D,A,A,K,K'K,0,A,A,K,KA,N9=s9JDOOA$6!K
 !% 5 5 E E G %(GDLaLaLkLkHlGmmw&x y*rww~~>N/O!)$&II.>$?$),m$o %'GGLL=S$TMww~~m4yA!%mS!9 l|Q)-1)/Hb)A#)-N#N$),bcibjjk*l$m 9?

9b8Q$5 ,=<@AVAVA`A`AeAeAg<h(9 ,=(-.~()_6:kk6M6M6OG;B:;N 	-x8?8H38<[3[4<7<WV_7M9>wx?P9Q37&=13D@Ewd^F4E4L4LV4T49<YZ`Yaacdhiodopscttu:v4w	-x (9(-0A#FWBXAYYefwex.y(z6G )sF-s9=9N9N9]9]^dfw9x3949GF86:R4SNRiik\_N_DOOF4K7=AVAVA`A`7`<@<Q<Q<[<[\b<c8<8M8M8]8]8_49GF8K[:\4] 8>AVAVA`A`7`<@<Q<Q<[<[\b<c8<8M8M8]8]8_8=F8Sy>z8{%)s: )-(=(=(M(M(O9<T=R=R=\=\9] ,:Q+>15d6K6K6Z6Z\_1` -Kde04		"a0J-K,14o,q,14N~N^  _H  3I  -J(-0[(] AE		c@QD$= 24jJ^1_J%a-1*c-B )ca,0IItG`G`@JCK<<>C[C[C]7_`a-c)c 7?6L6LTMfMf6g6p6pq{6|O$),PQ`Paam*n$o$),h$j$),i$k 498 
%|	)|/1ww~~m/L02		-0H058^0`,1
%|El|@ #iikG"4)EF:=7!@!@@BF:A7!#11c$:O:O:Y:Y6Z]^6^151C1C1V1V1XQ#.2H#H57N6:4;P;P;Z;Z;`;`;b6c %1
d)19=9N9Nt9TJ/9dhh}VW>X[\>\=G$}J]=]ab<bfi;i3;d?4B4I4I4QYJZ4[%1 (6(-0Mk]Z]^abp^q]r  sH  /I  )J:H )gJD$,1KvVDQT:Un2o,p-g040E0E0T0TUY]mnymzz{[|0})g mmA&&&a
 ,,: : % 7 7"%-(,B  ) %!$RSTRU"VW% "		*? @% $%> >& /v&!)$($ N 09 )_,14YZ[Y\2],^,^)_2 4= -s05xyQRPS6T0U39T=R=R=\=\3\8<8M8M8W8WX^8_484I4I4Y4Y4[49KxOp:q4r-s -K -K)c )c ,5 %a(-0[\][^._(`(`%a 0? )|/6{6=mmC6H0H0H058y0{	)|Ql| l|\  ) 
A!$J1#"NO+08 A!A')ww~~m'D(*		-(@$)!A'.{.5mmC.@(@(@A
AF 09 )1,0)1 4= -g058RSWRXXZ[cZd6e0f0f-g( ! ! ! MGsKLLM ' 	"CK=QR!!	"s5  z6y> An) .nBn) Ay o %n9;B,o (o =y> ?C*o *Ap+ 9pB'p+ 6	p pDp+   p#  Ay u2 B
u%Aq-.q$u% Dq'A!u%#s'<A/u%,t8As4=tA!u%'?t&&u%)u2 1Ay 3Bx? :Ax:x?  x-x? /y> y;y> z6n&!n) )	n62y 5n66y 9o>o oo 	pp	&o<;p	<p >p	y 	py pp+ #p(%p+ +	p?4y :p??y 	q$qu%q$$u%'	s$0A)su%s$$u%'s1	,u%4s>	9t	t#
tu%t##u%&&u"u
u"u%!u""u%%u/*u2 2	x;w?4ww?w5-w0
.w53w?9y ?xy 	xx? xx? 	x< x71x? 7x<<x? ?	yy yy 	y8y3-y> 3y88y> >	z3"z.)z6.z33z6c                 J  K   t        d       t        d| j                  rdnd        t        rt        s"t        d       t        d       t        d       yd}d	}t	        d
      D ]Z  }| j
                  j                         }|r n<d|dz   z  }t        d|dz    d| d       t        j                  |       d{    \ |st        d       t        d       d}nt        d       |s| j                          | j                          t        d| j                  du        | j                  rlt        | j                  d      rt        | j                  j                        nd}t        d| d       | j                  j                          t        d       nt        d       d| _        t"        rt        d       t        d       t        d| j                           t        d       t        j$                  | j'                               }t        d       t        j$                  | j)                               }||g}t        d t        |              n| j*                  D 	cg c]&  }	t        j$                  | j-                  |	            ( }}	|j/                  t        j$                  | j'                                      |j/                  t        j$                  | j)                                      	 t        d!t        |       d"       t        j0                  |  d{    d	| _        y7 yc c}	w 7 # t        j2                  $ r t        d#       Y 2t4        $ r,}
t        d$|
        ddl}|j9                          Y d}
~
ad}
~
ww xY w# d	| _        w xY ww)%zLance le botu%   
🚀 Démarrage du Bot de Trading...u      🔍 Trade Logger status: u	   ✅ Actifu   ❌ Non disponibleu(   
❌ ERREUR: Clés API non configurées!u/      Édite config.py et ajoute tes clés Binancez3   Pour le testnet: https://testnet.binance.vision/NFrS   r   r   u1      ⚠️ Connexion Binance échouée (tentative z/5), retry dans zs...uJ      ⚠️ Impossible de se connecter au compte Binance après 5 tentativesuR      🔄 Démarrage en MODE DÉGRADÉ (surveillance IA active, trading désactivé)Tu      ✅ Connexion réussie!u,      🔍 Vérification surveillance: service=r   r   u%      🔍 Démarrage surveillance avec r  u!      ✅ Surveillance IA démarréeu4      ⚠️ Pas de service de surveillance disponible!u=      ⚡ Mode TESTNET optimisé (API REST au lieu de WebSocket)uB      📋 Création de 2 tâches: trading_loop + check_triggers_loopu      🔍 DEBUG: self.running = u1      🔍 DEBUG: Création task 1 (trading_loop)...u8      🔍 DEBUG: Création task 2 (check_triggers_loop)...u      ✅ Tâches créées: u      ▶️ Lancement de u    tâche(s) asynchrone(s)...u      ⚠️ Tâches annuléesu)      ❌ Erreur dans la boucle principale: )rp   r  r  r  re  r  r   rs  rt  r  r*  r  r   r   r   startr  r  create_taskr  r  r  ry  rf  gatherCancelledErrorrz   r  r%  )r   r   _degraded_mode_retrywait_secsymbols_counttask1task2tasksr'  r}   r  s               r   runzTradingBot.run-  s=    67-T=N=NkTh-ijk &8=>CDGH Ah 	*Fkk--/GVaZ(HEfQhZO_`h_iimno--)))	* ^_fg!N./--/ 	!!# 	<T=V=V^b=b<cde$$FMdNgNgirFsC 9 9 A AByzM9-UV%%++-56HI QRVW24<<.ABEF''(9(9(;<ELM''(@(@(BCEENE-c%j\:; EIDVDV?@##D$6$6q$9:E  LL,,T->->-@ABLL,,T-E-E-GHI	!+CJ<7RST..%((( !DLs *P )%% 	/0 	"=aSAB!!	"
 !DLsz   B;N#=L6>F,N#*+L9A&N#<-M  )L>*M  .	N#9N#>M   NN  N("N
N NN 	N  N#)F)Nr  )$r.   r/   r0   r1   r!   r"   r  r  r  r  r   r   rv   r  r  r  r  r  r  r  r  r  r'  r*  r/  rE  r  rP  r  r&  r;  r.  ry  r  r  r  r2   r   r   r  r  
  s    $GGLL-@AMWW\\*.>?Nh+TJ3 J# Jc JC (:S<ObBH.@</bNn
`&1P=dU2nW"rg"R/>p%d7Z"x
N!r   r  c                  |   t        d       t        s5t        d       t        d      } | j                         dk7  rt        d       y t	        j
                         }t        j                  j                  t        d      }	 dd l	}dd l
}d}|j                  g d	      D ]  }	 |j                  |k(  rd
j                  |j                  j                  d      xs g       }d|v rWd|j                  j                  dd      j                         v r+|j                          t        d|j                   d       d} |r|j%                  d       	 t)        |d      5 }	|	j+                  t-        |             d d d        t        d|        t        d       	 t/               }
t        d       t        d       	 t5        j6                  |
j7                                	 t        j                  j;                  |      r!t	        j<                  |       t        d       y y # |j                   |j"                  f$ r Y w xY w# t&        $ r}t        d|        Y d }~d }~ww xY w# 1 sw Y   xY w# t&        $ r}t        d|        Y d }~d }~ww xY w# t&        $ r,}t        d|        dd l}|j3                          Y d }~y d }~ww xY w# t8        $ r t        d       Y 	w xY w#  Y y xY w# 	 t        j                  j;                  |      r!t	        j<                  |       t        d       w w #  Y w xY wxY w)Nu  
╔══════════════════════════════════════════════════════════════════════╗
║           🤖 CRYPTO TRADING BOT - ORDRES AUTOMATIQUES 🤖             ║
╠══════════════════════════════════════════════════════════════════════╣
║  ⚠️  Ce bot peut passer des ordres RÉELS !                          ║
║  🧪 Mode TESTNET activé par défaut (argent fictif)                  ║
║  📊 Stratégie: RSI + EMA + Bollinger Bands                          ║
╚══════════════════════════════════════════════════════════════════════╝
    u+   ⚠️  ATTENTION: Mode PRODUCTION activé!z   Confirmer ? (oui/non): ouiu      Annulé.zbot.pidr   F)pidnamecmdlinerU  r  ztrading_bot.pypythonr  r  u-      🛑 Instance précédente terminée (PID r  Tr'  u-      ⚠️ Nettoyage instances précédentes: r  u      📝 PID sauvegardé: u-      ⚠️  Impossible de sauvegarder le PID: u)   🔧 [DEBUG] Création de TradingBot()...u*   ✅ [DEBUG] TradingBot créé avec succèsu)   ❌ [DEBUG] Erreur création TradingBot: u'   🔧 [DEBUG] Lancement asyncio.run()...u   

👋 Bot arrêté.u      🗑️  PID nettoyé)rp   r  inputr  r!   getpidr"   r  r  psutilrY   process_iterr  r   rZ   	terminateNoSuchProcessAccessDeniedrt  rz   r   r   r   r  r  r%  rs  r  KeyboardInterruptr#   r%   )confirmr  pid_file_psutil_t
killed_anyprocr  r}   rd   botr  s               r   mainr  }  s    
  	 ;<45==?e#-  ))+Cww||J	2HC 
(()CD 
	D	88s?((499==#;#ArB#w.8tyy}}VUW?X?^?^?`3`NN$I$((STUV!%J
	 HHQK
C(C  	AGGCH	)#/0 

56l:; 

34CGGI
	ww~~h'		(#01 (C ))7+?+?@   C=aSABBC
	 	  C=aSABBC  9!=>	  (&'(		ww~~h'		(#01 (	s     I !H0I 1B	H:I I2 I&7I2 J :#K ?K* H>:I =H>>I 	I#
II#&I/+I2 2	J;JJ	K "KKK'#K1 &K''K1 *K.1L;3?L42L;4L86L;__main__)Dr1   r!   r  rs  r[   rY   r   r   r   collectionsr   urllib.parser   r  r  r  r  r   r  r   r"   r  abspathr  r  r  LOG_FILEr	   stdoutstderrr6   r7   r  
subprocess
_pip_flagsplatform
check_call
executabler  r  r:   r  rp   r  r;   r<   r=   r>   r?   r  r  r@   rA   r  r  rB   r  freqai_integrationrC   r  rE   rK  rj   r  r  r  r  r.   r2   r   r   <module>r     s{   
 
        "   , 0
 WW__RWW__X67
77<<
$56$ $N !
ZZ
 7-!7 C  C!<E"&82"=5(9 (9V YO YO~
{$ {$D
 WW__RWW__X67
lg lgf9iG! iG!VOJX zF sc  
J
||w
J	uizJ  
$  7"	
567  7"$	
567  <"'	
:;<  8#	
678  =	
;<=sm   >F  G G% &
G= 1H :H)  AGGG"!G"%G:9G:=HHH&%H&)H<;H<