
    =i'                     v   d Z ddlZddlZddlmZmZ ddlmZ ddlZ ej                  e	      Z
dZdZdZdZd	Z G d
 d      Zdad Ze	dk(  rm ej&                  ej(                          e       Z ed       ej/                         Zer. ed eed          d       ed   dd D ]  Z ede         yyy)u   
Analyseur de Performance Automatique
Analyse les trades historiques et génère dynamiquement les whitelist de performance
S'actualise automatiquement toutes les 50 trades ou 24h
    N)datetime	timedelta)defaultdict
   g?g?   2   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	PerformanceAnalyzerc                 X    d| _         d| _        d| _        d | _        d | _        d| _        y )Nztrade_history.jsonzperformance_whitelist.jsonzperformance_stats.jsoni,  )trade_history_filewhitelist_file
stats_file_whitelist_cache_cache_loaded_at
_cache_ttl)selfs    7/home/ubuntu/crypto_trading_bot/performance_analyzer.py__init__zPerformanceAnalyzer.__init__   s2    "6:2 !% $    c                    t         j                  j                  | j                        sg S 	 t	        | j                  dd      5 }t        j                  |      cddd       S # 1 sw Y   yxY w# t        $ r{}t        | d      r2t        j                         | j                  z
  j                         dkD  r1t        j                  d|        t        j                         | _        g cY d}~S d}~ww xY w)zCharger l'historique des tradesrz	utf-8-sigencodingN_last_error_log<   z!Erreur chargement trade_history: )ospathexistsr   openjsonload	Exceptionhasattrr   nowr   total_secondsloggererror)r   fes      r   load_trade_historyz&PerformanceAnalyzer.load_trade_history!   s    ww~~d556I	d--s[I $Qyy|$ $ $ 	4!23I]I]8]7l7l7nqs7s@DE'/||~$I	s<   A0 A$	A0 $A-)A0 -A0 0	C49A0C/)C4/C4c           	      >   t        d       }|D ]  }|j                  d      }|j                  dd      }|s)||   }|dxx   dz  cc<   |dxx   |z  cc<   |dkD  r|dxx   dz  cc<   n|d	xx   dz  cc<   |d
   j                  ||j                  dd      |j                  dd      d       t        |d
         dkD  s|d
   j	                  d        |j                         D ]*  \  }}|d   dkD  s|d   |d   z  |d<   |d   |d   z  |d<   , t        |      S )z*Analyser les performances de chaque cryptoc                      ddddddg dS )Nr   g        )tradeswinslosses	total_pnlwin_rateavg_pnllast_trades r4   r   r   <lambda>z@PerformanceAnalyzer.analyze_crypto_performance.<locals>.<lambda>2   s    ,
 r   symbolpnlr   r-      r0   r.   r/   r3   	timestamp reason)r7   r9   r;   r   r1   r2   )r   getappendlenpopitemsdict)r   r-   crypto_statstrader6   r7   statss          r   analyze_crypto_performancez.PerformanceAnalyzer.analyze_crypto_performance0   sY   " $
   	,EYYx(F))E1%C (E(Oq O+#%Qwf"h1$ - ''"YY{B7))Hb1) 
 5'(2-m$((+/	,4 *//1 	HMFEX"$)&ME(O$Cj!#(#5h#Gi 	H
 L!!r   c                    g }i }|j                         D ]  \  }}|d   t        k  rd}d}|d   t        k\  r%|d   t        k\  rd}d}|d   dk\  rd	}|d   d
k\  rd}n|d   dk\  r|d   dk\  rd}d}|d   dd }t	        |      dk\  r#t        d |D              }	|	dk\  r|sd}d}n|dz  }|s|j                  |       ||d   dz  dd|d   dd|d   |d   ddd||<    ||fS )u2   Générer la whitelist basée sur les performancesr-   Fr   r1   r0   T   g?   g?   g?g      ?   r3   N   c              3   2   K   | ]  }|d    dkD  sd  yw)r7   r   r8   Nr4   ).0ts     r   	<genexpr>z9PerformanceAnalyzer.generate_whitelist.<locals>.<genexpr>~   s     !Kahl!!Ks      r   d   z.1f%z.2fu   €r2   )bonus_scorer1   r0   r-   r2   )r@   MIN_TRADES_FOR_STATSWHITELIST_WIN_RATE_THRESHOLDMIN_PNL_FOR_WHITELISTr>   sumr=   )
r   rB   	whitelistscoresr6   rD   should_whitelistrT   recent_tradesrecent_winss
             r   generate_whitelistz&PerformanceAnalyzer.generate_whitelist]   sy   	)//1 ,	MFEX!55  %K Z $@@U;EW[pEp#'   $,"$K$,"$K z"d*u[/AT/I#'   "-05M=!Q&!!K]!KK!#++/(&(#q(  (#.#(#4S#8"=Q ?$)+$6s#;3!?#Ho"'	"23!7s;"vM,	\ &  r   c                    t         j                  j                  | j                        r	 t	        | j                  d      5 }t        j                  |      }t        j                  |j                  dd            }|j                  dd      }t        j                         |z
  j                         dz  }|t        k\  rt        j                  d       	 ddd       y	t        | j!                               }||z
  }|t"        k\  r#t        j                  d
| d       	 ddd       y		 ddd       yy	# 1 sw Y   y	xY w#  Y y	xY w)u-   Vérifier si une mise à jour est nécessairer   last_updatez
2000-01-01trades_countr   i  u.   📊 Mise à jour performance (24h écoulées)NTu   📊 Mise à jour performance (z nouveaux trades)F)r   r   r   r   r   r    r!   r   fromisoformatr<   r$   r%   UPDATE_INTERVAL_HOURSr&   infor>   r*   UPDATE_INTERVAL_TRADES)r   r(   rD   r`   trades_at_updatehours_since_updatecurrent_tradestrades_diffs           r   should_updatez!PerformanceAnalyzer.should_update   s+    77>>$//*$//3/ !1 IIaLE"*"8"8=R^9_"`K',yy'C$ +3,,.;*F)U)U)WZ^)^&)-BB&TV#! ! &))@)@)B%CN"03C"CK"&<<&Ek]Rc$de#!! !$ !%! !. /!. 	 sC   E  BD4E  AD4 E  )D4*E  4D=9E  =E   Ec           	         t         j                  d       d| _        d| _        | j	                         }t        |      dk  rt         j                  d       y| j                  |      }| j                  |      \  }}t         j                  dt        |       d       t        | j                  dd	      5 }t        j                  ||t        j                         j                         t        |      d
|dd       ddd       t        | j                  dd	      5 }t        j                  t        j                         j                         t        |      t        |      d|d       ddd       t         j                  |rddj!                  |dd        dnd       ||dS # 1 sw Y   xY w# 1 sw Y   IxY w)u(   Mettre à jour les listes de performanceu%   📊 Début analyse de performance...NrG   u+   📊 Pas assez de trades pour analyse (<20)u   📊 Whitelist générée: z cryptoswutf-8r   )rY   rZ   updatedtrades_analyzed   F)indentensure_ascii)r`   ra   whitelist_count)rq   u   ✅ Whitelist: z, rL   z...u   ✅ Whitelist: vide)rY   rD   )r&   rd   r   _cache_timer*   r>   rE   r^   r   r   r    dumpr   r$   	isoformatr   join)r   r-   rB   rY   whitelist_scoresr(   s         r   updatezPerformanceAnalyzer.update   s   ;< !% ((*v;KKEF 66v> '+&=&=l&K#	#1#i.1AJK $%%sW= 	0II&*#<<>335#&v;	
 0	0 $//39 	QII'||~779 #F#&y> 		 	yodii	"1&>%?sCVkl #!
 	
%	0 	0	 	s   7AF*AF6*F36F?c                    | j                   rT| j                  rHt        j                         | j                  z
  j	                         | j
                  k  r| j                   S t        j                  j                  | j                        r~	 t        | j                  dd      5 }t        j                  |      }|j                  dg       |j                  di       f}|| _         t        j                         | _        |cddd       S g i f}|| _         t        j                         | _        |S # 1 sw Y   nxY w3#  Y 7xY w)u.   Récupérer la whitelist actuelle (avec cache)r   rm   r   rY   rZ   N)r   rt   r   r$   r%   r   r   r   r   r   r   r    r!   r<   )r   r(   dataresults       r   get_whitelistz!PerformanceAnalyzer.get_whitelist   s      T%5%5!1!11@@BT__T,,, 77>>$--.$--sWE "99Q<D"hh{B7(B9OPF,2D)'/||~D$!" " b &#<<>" " "s%   D; #AD.>	D; .D73D; ;D?N)
__name__
__module____qualname__r   r*   rE   r^   rj   ry   r}   r4   r   r   r
   r
      s(    +"Z3!j<+
Zr   r
   c                  .    t         
t               a t         S )u%   Récupérer l'instance de l'analyseur)	_analyzerr
   r4   r   r   get_performance_analyzerr      s     ')	r   __main__)levelu   📊 Analyse de performance...u   
✅ Whitelist (rY   z
 cryptos):u      ⭐ )__doc__r    r   r   r   collectionsr   logging	getLoggerr~   r&   rU   rV   rW   rc   re   r
   r   r   basicConfigINFOanalyzerprintry   r|   r>   symr4   r   r   <module>r      s     	 ( # 			8	$  #    \ \~ 	 zGgll+"$H	
*+__F!#f[&9":!;:FG+&s+ 	#CGC5/"	#  r   