
    iT                         d Z ddlZddlZddlZddlmZmZ ddlmZmZm	Z	 ddl
mZ ddlZ G d d      Zd Zed	k(  r e        yy)
u  
ANALYSEUR DE LOGS DE TRADING
============================
Analyse les logs structurés pour optimiser les paramètres dynamiques

Usage:
    python analyze_trade_logs.py
    python analyze_trade_logs.py --period 24h
    python analyze_trade_logs.py --export report.json
    N)datetime	timedelta)DictListAny)defaultdictc                       e Zd ZdZddefdZddedeeef   fdZ	dedefdZ
dedefd	Zdedefd
ZdedefdZdefdZdee   defdZddedefdZdefdZy)TradeAnalyzerz5Analyse les performances des trades pour optimisationlog_dirc                     || _         t        j                  j                  |d      | _        t        j                  j                  |d      | _        y )Nzsignals_log.jsonlztrades_log.jsonl)r   ospathjoinsignals_filetrades_file)selfr   s     ./analyze_trade_logs.py__init__zTradeAnalyzer.__init__   s9    GGLL2EF77<<1CD    
hours_backreturnc                    t        j                         t        |      z
  }g }g }g }t        j                  j                  | j                        r{t        | j                  dd      5 }|D ]T  }	 t        j                  |j                               }t        j                  |d         }	|	|k\  r|j                  |       V 	 ddd       t        t              }
t        j                  j                  | j                        rt        | j                  dd      5 }|D ]o  }	 t        j                  |j                               }|d   dk(  rA|j!                  d	d
      }t        j                  |d         |d<   |
|   j                  |       q 	 ddd       |
D ]  }|
|   j#                  d         t        | j                  dd      5 }|D ]&  }	 t        j                  |j                               }t        j                  |d         }	|d   dk(  r|	|k\  r|j                  |       n|d   dk(  r|	|k\  r|j!                  d	d
      }d}||
v r;t%        |
|         D ]*  }|d   |	k  s|	|d   z
  j'                         }|dk  s(|} n |r@|j!                  dd
      |d<   |j!                  dd      |d<   |j!                  dd      |d<   n|j!                  dd
      |d<   |j                  |       ) 	 ddd       |||dS #  Y xY w# 1 sw Y   RxY w#  Y xY w# 1 sw Y   xY w#  Y hxY w# 1 sw Y   AxY w)u   Charge les logs récents)hoursrutf-8encoding	timestampNtype
TRADE_OPENsymbolUNKNOWN_ts_objc                     | d   S )Nr#    xs    r   <lambda>z)TradeAnalyzer.load_logs.<locals>.<lambda>C   s
    ) r   keyTRADE_CLOSEiQ patternai_scorer   is_dynamic_sltpFwas_dynamic_sltp)signalstrades_opentrades_close)r   nowr   r   r   existsr   openjsonloadsstripfromisoformatappendr   listr   getsortreversedtotal_seconds)r   r   cutoff_timer0   r1   r2   flineentrytstrade_open_by_symbolr!   matched_open
open_entry	time_diffs                  r   	load_logszTradeAnalyzer.load_logs   sT   llnyz'BB 77>>$++,d''w? 1 D $

4::< 8%33E+4FG,#NN51  +4077>>$**+d&&g> 	! D $

4::< 8 =L8%*YYx%CF/7/E/EeKFX/YE),08??F	 / N$V,116L1MN d&&g> "! !D  $

4::< 8%33E+4FG =L8R;=N'..u5"6]m;k@Q%*YYx%CF+/L%)==2:;OPV;W2X !2J'1)'<r'A57*Y:O5O4^4^4`	+4u+<;EL,1!2  ,3?3C3CIy3Yi 04@4D4DZQR4Sj 1<H<L<LM^`e<f&8 9 4999Y	3Ri 0(//6?!"J &(
 	
{ 0	 	bE" "s|   )L0ALLL)$A,L!L)L>BL61L6A-L6:L>LLL!L&#L))L36L;8L>>Mdatac                 F   |d   }|D cg c]  }|j                  d      s| }}|D cg c]  }|j                  d      r| }}d } ||      } ||      }d}	|d   dk7  r|d   |d   z
  t        |d         z  dz  }	|||	| j                  ||      dS c c}w c c}w )z-Analyse performance SL/TP dynamiques vs fixesr2   r/   c                    | sdddddddddd	S | D cg c]  }|d   dkD  s| }}| D cg c]  }|d   dk  s| }}|rt        d |D              nd}|rt        t        d |D                    nd}t        |       t        |      t        |       z  dz  t        d | D              t        |       z  t        d	 | D              t        |       z  t        d
 | D              t	        d | D              |dkD  r||z  ndt        d | D              t        |       z  t        d | D              t        |       z  d	S c c}w c c}w )Nr   )	countwin_rate
avg_profitavg_duration_minbest_profit
worst_lossprofit_factoravg_slavg_tppnl_pctc              3   &   K   | ]	  }|d      ywrV   Nr%   .0ts     r   	<genexpr>zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>   s     =q|=   c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>         >!9 >r]      d   c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>        !?1!I,!?r]   c              3   F   K   | ]  }|j                  d d      dz    ywduration_secondsr   <   Nr<   rY   s     r   r\   zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>   s!     'Za.@!(Dr(I'Z   !c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>   s     "@A1Y<"@r]   c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>   rc   r]   c              3   @   K   | ]  }|j                  d d        yw)sl_pctr   Nrh   rY   s     r   r\   zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>        AQaeeHa0A   c              3   @   K   | ]  }|j                  d d        yw)tp_pctr   Nrh   rY   s     r   r\   zMTradeAnalyzer.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>   rn   ro   )sumabslenmaxmin)tradesr[   winninglosingtotal_profit
total_losss         r   
calc_statsz:TradeAnalyzer.analyze_sltp_performance.<locals>.calc_statsw   sR    !"#()#$"#%&
 
 #)=QAiL1,<q=G=!'<A1Y<!+;a<F<AH3=W==aLCIS >v >>?qJ VL3v;6<!!?!??#f+M$''ZSY'Z$Z]`ag]h$h""@"@@!!?!??>H1n
!:RSA&AACKOA&AACKO
 
 ><s   D;D;E E r   rO   ra   )dynamicfixedimprovement_pctrecommendation)r<   rs   _generate_sltp_recommendation)
r   rJ   closed_tradesr[   dynamic_tradesfixed_tradesr|   dynamic_statsfixed_statsimprovements
             r   analyze_sltp_performancez&TradeAnalyzer.analyze_sltp_performancep   s    ^,%2Paee<N6O!PP#0Ra>P8QRR	@ #>2 . |$)),7+l:SSWZ[fgs[tWuuy||K % *"@@P[\	
 	
W QRs   BBBBc           	         |d   }t        t              }|D ](  }|j                  dd      }||   j                  |       * i }|j	                         D ]|  \  }}|D cg c]  }|d   dkD  s| }	}t        |      |rt        |	      t        |      z  dz  nd|rt        d |D              t        |      z  ndt        d |D              d	||<   ~ t        |j	                         d
 d      }
g }|
D ](  \  }}|j                  ||d   |d   |d   |d   d       * t        |
      |
r|
d   ndi f|
r|
d   |dS di f|dS c c}w )zAnalyse performance par patternr2   r,   r"   rV   r   ra   c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   z1TradeAnalyzer.analyze_patterns.<locals>.<genexpr>   rc   r]   c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   z1TradeAnalyzer.analyze_patterns.<locals>.<genexpr>   r_   r]   rM   rN   rO   	total_pnlc                     | d   d   S )Nr`   rO   r%   r&   s    r   r(   z0TradeAnalyzer.analyze_patterns.<locals>.<lambda>   s    ad<FX r   Tr*   reverserM   rN   rO   r   )r,   rM   rN   avg_profit_pcttotal_pnl_pctNONE)
by_patternbest_patternworst_patterntop_patterns)	r   r;   r<   r:   itemsrt   rr   sorteddict)r   rJ   r   r   trader,   pattern_statsrw   r[   rx   sorted_patternsr   pattern_namestatss                 r   analyze_patternszTradeAnalyzer.analyze_patterns   s   ^, &
" 	.Eii	95Gw&&u-	. )//1 	OGV"(=QAiL1,<q=G=V@FCL3v;6<AQWc!?!??#f+M]^  >v >>	&M'"	 !!4!4!6<Xbfg #2 	L%'w!*-"'"5!&{!3! 	 /2AOA.PR|4C_R0(	
 	
 KQRT(	
 	
- >s   E,Ec                 |   |d   }|d   }t        |      }t        |D cg c]  }|j                  d      s| c}      }|D cg c]  }|j                  d      r| }}t        t              }|D ]!  }	|	j                  dd      }
||
xx   dz  cc<   # |||dkD  r||z  dz  ndt	        |      d	S c c}w c c}w )
u%   Analyse taux d'exécution des signauxr0   r1   executedexecution_reasonr"   r`   r   ra   )total_signalsr   execution_ratenot_executed_reasons)rt   r<   r   intr   )r   rJ   r0   r1   r   sexecuted_signalsnot_executedreasonssigreasons              r   analyze_execution_ratez$TradeAnalyzer.analyze_execution_rate   s    y/=)G7HaaeeJ6GHI $+Da!%%
2CDDc" 	!CWW/;FFOq O	!
 +(HUXYHY.>D_`$(M	
 	
  I Es   B4B4B9B9c                    |d   }t        t              }|D ](  }|j                  dd      }||   j                  |       * g }|j	                         D ]  \  }}|D cg c]  }|d   dkD  s| }	}|j                  |t        |      |rt        |	      t        |      z  dz  nd|rt        d |D              t        |      z  ndt        d |D              d	        t        |d
 d      }
i }|
dd D ]  }|d   |d   |d   |d   d||d   <    |
||
r|
d   d   |
d   fndi f|
r|
d   d   |
d   fdS di fdS c c}w )zAnalyse performance par cryptor2   r!   r"   rV   r   ra   c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   z;TradeAnalyzer.analyze_crypto_performance.<locals>.<genexpr>   rc   r]   c              3   &   K   | ]	  }|d      ywrX   r%   rY   s     r   r\   z;TradeAnalyzer.analyze_crypto_performance.<locals>.<genexpr>   s     $BaQy\$Br]   )r!   rM   rN   rO   r   c                     | d   S )Nr   r%   r&   s    r   r(   z:TradeAnalyzer.analyze_crypto_performance.<locals>.<lambda>   s    Ao<N r   Tr   N
   rM   rN   rO   r   r   r   r   )top_performers	by_cryptobest_cryptoworst_crypto)r   r;   r<   r:   r   rt   rr   r   )r   rJ   r   r   r   r!   crypto_statsrw   r[   rx   sorted_cryptosby_crypto_dictcryptos                r   analyze_crypto_performancez(TradeAnalyzer.analyze_crypto_performance   s   ^,%	" 	,EYYx3Ff$$U+	, 'oo/ 	NFF"(=QAiL1,<q=G= V@FCL3v;6<AQWc!?!??#f+M]^!$$B6$B!B! 	  2NX\] $Sb) 	F":.$\2#O4	0N6(+,	 -'O]N1-h79JKdjlncoR`^B/9>";MN	
 	
 hnoqfr	
 	
- >s   D?,D?c                     |d   dk  ry|d   |d   kD  r$|d   |d   z
  t        |d         z  dz  }d|ddS |d   |d   z
  t        |d         z  dz  }|d	kD  rd
|ddS y)u(   Génère recommandation basée sur statsrM   r   u)   ⏳ Pas assez de données (min 10 trades)rO   ra   u   ✅ DYNAMIQUE MEILLEUR (+.1fz%) - Continuer   u   ❌ FIXE MEILLEUR (+u"   %) - Revoir paramètres dynamiquesu4   ⚠️ Performance similaire - Continuer observation)rs   )r   r   r   r   declines        r   r   z+TradeAnalyzer._generate_sltp_recommendation  s    !B&>&\)BB),7+l:SSWZ[fgs[tWuuy||K.{3.?~NN#L1M,4OOSVWbcoWpSqquxxG|-gc]:\]]Nr   rejected_signalsc                 J   |sdi g ddS t        t              }t        t              }|D ]>  }|j                  dd      }||xx   dz  cc<   ||j                  dd      xx   dz  cc<   @ t        |j	                         d d	
      dd }t        |      }|rt        |j	                         d       d   nd}||   }	|dkD  r|	|z  dz  nd}
d}d|v r|
dkD  rd|
dd}n5d|v r|
dkD  rd|
dd}n$d|v r|
dkD  rd|
dd}nd|v r|
dkD  rd|
dd }nd!}|t        |      ||dS )"z(Analyse les raisons de rejet des signauxr   u   Aucun signal rejeté)total	by_reasontop_rejected_cryptosr   rejection_reasonr"   r`   r!   c                     | d   S Nr`   r%   r&   s    r   r(   z2TradeAnalyzer.analyze_rejections.<locals>.<lambda>/  s
    qt r   Tr   N   c                     | d   S r   r%   r&   s    r   r(   z2TradeAnalyzer.analyze_rejections.<locals>.<lambda>3  s
    1Q4 r   r)   ra    MAX_POSITIONS2   u   ⚠️ .0fuZ   % rejetés car limite atteinte - Considérer augmenter max_positions ou améliorer scoringBEARISH_TREND   u   📉 u@   % rejetés car baissiers - Filtres anti-baisse fonctionnent bienCOOLDOWN(   u   🕒 u@   % rejetés car cooldown - Réduire cooldown ou améliorer timingSCORE_TOO_LOWu   📊 u=   % rejetés car score faible - Scoring fonctionne correctementu&   ℹ️ Distribution variée des rejets)r   r   r<   r   r   rt   ru   r   )r   r   r   r   signalr   top_rejectedr   main_reason
main_countmain_pctr   s               r   analyze_rejectionsz TradeAnalyzer.analyze_rejections  s   (*"8	   $	$	& 	<FZZ 2I>Ff"fjj956!;6	< ioo/^TRSUTUV $%GPc)//+@CV_{+
16J&,k)hm&xn  5O  PN+2$XcN2rsN;&8b=$XcN2rsN+2$XcN2opNEN i$0,	
 	
r   c                    | j                  |      }|d   D cg c]  }|j                  dd      s| }}|d   D cg c]  }|j                  dd      r| }}|d   }|D cg c]  }|j                  dd      dkD  s| }}|D cg c]  }|j                  dd      dk  s| }	}|rt        |      t        |      z  dz  nd}
|rt        d |D              t        |      z  nd}|rt        d	 |D              t        |      z  nd}d
| dt	        j
                         j                         t        |d         t        |d         t        |      t        |      t        |      |d   rt        |      t        |d         z  dz  ndt        |d         t        |d         t        |d         t        |d         z
  t        |      t        |	      |
||d| j                  |      | j                  |      | j                  |      | j                  |      | j                  |      d}|S c c}w c c}w c c}w c c}w )u   Génère rapport completr0   r   Tr2   rV   r   ra   c              3   @   K   | ]  }|j                  d d        yw)rV   r   Nrh   rY   s     r   r\   z0TradeAnalyzer.generate_report.<locals>.<genexpr>X  s     HQQUU9a0Hro   c              3   F   K   | ]  }|j                  d d      dz    ywre   rh   rY   s     r   r\   z0TradeAnalyzer.generate_report.<locals>.<genexpr>Y  s!     XQquu%7;b@Xri   u   Dernières hr1   )r   signals_detectedr   signals_executedr   r   trades_openedtrades_closedcurrently_openwinslossesrN   r   rP   )periodgenerated_atoverviewrejection_analysissltp_performancepattern_analysisexecution_analysiscrypto_performance)rI   r<   rt   rr   r   r3   	isoformatr   r   r   r   r   )r   r   rJ   r   r   r   r   r[   winning_tradeslosing_tradesrN   r   rP   reports                 r   generate_reportzTradeAnalyzer.generate_reportJ  sO   ~~j) (,IR!!%%
D:QARR'+IV!aeeJPT>UAVV ^,%2NaeeIq6IA6M!NN$1MqQUU9a5H15LMMGTC'#m*<<sBZ[anH-HH3}K]]tuq~3X-XX[^_l[mm  EF $J<q1$LLN446!$T)_!5$'Y$8$'(8$9$'(8$9$'(8$9X\]fXg#&6"7#d9o:N"NQT"Tmn!$T-%8!9!$T.%9!:"%d=&9":SnAU=V"VN+m,$"0$4  #'"9"9:J"K $ = =d C $ 5 5d ;"&"="=d"C"&"A"A$"G/
4 M SV OMs-   H2H2H7H7%H< H<
I%Ir   c                    t        d       t        d|d           t        d|d           t        d       t                |d   }t        d       t        d|d	           t        d
|d    d|d   dd       t        d|d           t        d|d           t        d|d           t        d|d           t                |d   dkD  r|d   }t        d       t        d|d           t        d       t        |d   j                         d d !      D ]0  \  }}|d   dkD  r||d   z  d"z  nd}t        d#| d$| d|d%d       2 |d&   r*t        d'       |d&   D ]  \  }}t        d#| d$| d(        t        d)|d*           t                |d+   }t        d,       t        d-|d.   d/    d0|d.   d1   dd2|d.   d3   d4d5       t        d6|d.   d7   d4d8|d.   d9   d4d5       t        d:|d;   d/    d0|d;   d1   dd2|d;   d3   d4d5       t        d6|d;   d7   d4d8|d;   d9   d4d5       t        d<|d=   d>d5       t        d?|d*           t                |d@   }	t        dA       t        t	        |	dB   j                               dCdD       D ]1  \  }
\  }}t        dE|
dFz    dG| d$|d/    dH|d1   d%dI|d3   dJd5       3 t                |dK   }t        dL       t        t	        |dM   j                               dCdD       D ]1  \  }
\  }}t        dE|
dFz    dG| d$|d/    dH|d1   d%dN|dO   dJd5       3 t                |dP   }t        dQ       t        dR|d	    dS|dT    d|d   dd       |dU   r7t        dV       |dU   j                         D ]  \  }}t        dW| d$|         t                t        d       yC)Xu   Affiche rapport formatézP================================================================================u   📊 RAPPORT D'ANALYSE - r   u   🕐 Généré: r   r   u   📈 VUE D'ENSEMBLE:u     Signaux détectés: r   u     Signaux exécutés: r   z (r   r   z%)u     Signaux rejetés: r   z  Trades ouverts: r   u     Trades fermés: r   z  Positions ouvertes: r   r   r   u   🚫 ANALYSE DES REJETS:u     Total rejetés: r   z
  Raisons:r   c                     | d   S r   r%   r&   s    r   r(   z,TradeAnalyzer.print_report.<locals>.<lambda>  s    PQRSPT r   Tr   ra   u       • z: r   r   u     Top cryptos rejetés:z rejetsu     💡 r   r   u   🎯 PERFORMANCE SL/TP:z  DYNAMIQUE: r}   rM   z trades | Win rate: rN   z% | Profit moyen: rO   z.2f%z             SL moyen: rT   z% | TP moyen: rU   z  FIXE:      r~   u     AMÉLIORATION: r   z+.1fu     📌 r   u   🔍 MEILLEURS PATTERNS:r   Nr   z  r`   z. z trades | Win: z	% | Avg: z+.2fr   u   💰 TOP CRYPTOS:r   z% | Total: r   r   u   ⚡ TAUX D'EXÉCUTION:z  Signaux: u    | Exécutés: r   r   u     Raisons de non-exécution:z    - )printr   r   	enumerater;   )r   r   ovrejr   rM   pctr!   sltppatternsir,   r   cryptos
exec_statss                  r   print_reportzTradeAnalyzer.print_reportw  s   h)&*:);<= !7 89:h J$%&r/':&;<=&r*<'=&>bDTAUVY@ZZ\]^$R(:%;$<=>"2o#6"789"2o#6"789&r*:';&<=>  !A%-.C,-&s7|n56,!'K(8(>(>(@n^b!c A69'lQ6Fus7|+c1A5'C9B?@A )*/0%()?%@ ?MFEHVHBugW=>?GC 01234G ()'(d9og677KDQZO\fLghkKll~  @D  EN  @O  P\  @]  ^a  b  bc  d  	e'Y(A#'FnUYZcUdemUnorTsstuvd7mG455I$w-XbJcdgIhhz{  AH  |I  JV  |W  X[  {\  \]  ^  	_'Wh(?'DNSWX_S`aiSjknRoopqr!$'8"9$!?qAB-./01 ,-()#,T(<2H2N2N2P-QRTST-U#V 	EABqse2gYbw(8jHYZ]G^^ghmnzh{  }A  hB  BC  D  E	E -.!""+D1E1K1K1M,NrPQ,R"S 	EABqse2fXRg'7uZGXY\F]]hinozi{  }A  iB  BC  D  E	E 01
&'J78
S]H^G__ablm}b~  @C  bD  DF  G  	H,-01!+,B!C!I!I!K 2vhb012hr   N)
trade_logs)   )__name__
__module____qualname____doc__strr   r   r   r   rI   r   r   r   r   r   r   r   r   r%   r   r   r
   r
      s    ?E E
R
C R
c4i R
h4
T 4
d 4
l&
T &
d &
P
4 
D 
,&
t &
 &
PO3 O-
4: -
$ -
^+# +t +ZE4 Er   r
   c                     t        j                  d      } | j                  ddd       | j                  dd	       | j                         }t	        |j
                  j                  d
            }t               }|j                  |      }|j                  |       |j                  rSt        |j                  dd      5 }t        j                  ||dd       d d d        t        d|j                          y y # 1 sw Y   #xY w)NzAnalyse des logs de trading)descriptionz--period24hu*   Période d'analyse (ex: 24h, 168h pour 7j))defaulthelpz--exportzExporter en JSON vers fichier)r  r   wr   r      F)indentensure_asciiu   ✅ Rapport exporté: )argparseArgumentParseradd_argument
parse_argsr   r   rstripr
   r   r   exportr5   r6   dumpr   )parserargsr   analyzerr   rA   s         r   mainr    s    $$1NOF

E8ef

)HID ""3'(EH%%e,F &! {{$++sW5 	?IIfa>	?&t{{m45 	? 	?s   C>>D__main__)r  r6   r   r  r   r   typingr   r   r   collectionsr   
statisticsr
   r  r  r%   r   r   <module>r      sJ   	  	  ( " " # h hV6. zF r   