
    iRX                        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mZm	Z	m
Z
mZ ddlZddlmZ  ej                   ej"                          ej$                  e      Z G d d	      Zed
k(  rq ed      Z ed       ej1                         Z ee       ej5                         ZdZ eedd      5 Z ej>                  eedd       ddd        ede        yy# 1 sw Y   xY w)u  
🧠 AI SELF-OPTIMIZER - Analyse automatique et optimisation du bot

Fonctionnalités:
1. Analyse qualité des signaux IA sur historique
2. Détection des fins de cycle manquées
3. Analyse des ventes tardives/manquées
4. Calcul des seuils optimaux (EMA, BB, KC, RSI, momentum)
5. Comparaison avec standards financiers
6. Recommandations d'optimisation automatiques

Auteur: Trading Bot AI System
Date: 2026-01-15
    N)datetime	timedelta)defaultdict)DictListTupleOptional)Path)levelc                   *   e Zd ZdZddefdZdefdZdee   fdZ	dee   fdZ
dee   defd	Zdee   d
ee   defdZdee   defdZdee   defdZdee   defdZdee   defdZdee   defdZdee   defdZdedee   fdZdefdZy)AISelfOptimizeru3   Système d'auto-analyse et auto-optimisation du botlookback_hoursc                     || _         t        d      | _        t        d      | _        ddddddd	d
ddddddddd| _        y )Nztrade_logs/trades_log.jsonlztrade_logs/signals_log.jsonl)g        皙?)r   333333?)r         ?)buy_zonecaution_zone
avoid_zone   )r   -   )r   7   )r   F   r   )oversoldr   neutral	sell_zone
overboughtg{Gzt?gMb`?gMbP?)strong_bullishmoderate_bullishweak      ?g      ?)bb_positionrsimomentumwin_rate_targetprofit_factor_target)r   r
   trades_log_pathsignals_log_pathfinancial_standards)selfr   s     ./ai_self_optimizer.py__init__zAISelfOptimizer.__init__   sn    ,#$AB $%C D
 ' *( $#%  #($)
  $$''$
     returnc           	         t         j                  d| j                   d       | j                         }| j	                         }t        j                         j                         | j                  | j                  |      | j                  ||      | j                  |      | j                  |      | j                  |      g d}| j                  |      |d<   |S )u,   Analyse complète des performances récentesu"   🔍 Analyse des performances sur zh...)	timestampperiod_hoursglobal_metricssignal_qualitycycle_detectionexit_timingoptimal_thresholdsrecommendationsr7   )loggerinfor   _load_recent_trades_load_recent_signalsr   now	isoformat_calculate_global_metrics_analyze_signal_quality_analyze_cycle_detection_analyze_exit_timing_calculate_optimal_thresholds_generate_recommendations)r*   tradessignalsresultss       r+   analyze_performancez#AISelfOptimizer.analyze_performance;   s    89L9L8MTRS))+++- "113 //"<<VD"::67K#<<VD44V<"&"D"DV"L!	
 &*%C%CG%L!"r-   c                    | j                   j                         sg S t        j                         t	        | j
                        z
  }g }t        | j                   dd      5 }|D ]T  }	 t        j                  |j                               }t        j                  |d         }||k\  r|j                  |       V 	 ddd       |S #  Y fxY w# 1 sw Y   |S xY w)u   Charge les trades récentshoursrutf-8encodingr0   N)r'   existsr   r<   r   r   openjsonloadsstripfromisoformatappend)r*   cutoff_timerD   flinetrade
trade_times          r+   r:   z#AISelfOptimizer._load_recent_tradesR   s    ##**,Illnyt7J7J'KK$&&g> 	!  JJtzz|4E!)!7!7k8J!KJ![0e,	 	 %   "C)AC:CC	CCc                    | j                   j                         sg S t        j                         t	        | j
                        z
  }g }t        | j                   dd      5 }|D ]T  }	 t        j                  |j                               }t        j                  |d         }||k\  r|j                  |       V 	 ddd       |S #  Y fxY w# 1 sw Y   |S xY w)u   Charge les signaux récentsrI   rK   rL   rM   r0   N)r(   rO   r   r<   r   r   rP   rQ   rR   rS   rT   rU   )r*   rV   rE   rW   rX   signalsignal_times          r+   r;   z$AISelfOptimizer._load_recent_signalsf   s    $$++-Illnyt7J7J'KK$''w? 	1 !ZZ

5F"*"8"89L"MK"k1v.	 	 r[   rD   c                    |D cg c]  }|j                  d      dk(  s| }}|sddddddS |D cg c]  }|j                  dd      dkD  s| }}|D cg c]  }|j                  dd      dk  s| }}t        d |D              }t        t        d |D                    }t        |      t        |      t        |      |rt        |      t        |      z  ndt	        j
                  |D cg c]  }|j                  dd       c}      |r3t	        j
                  |D cg c]  }|j                  dd       c}      nd|r3t	        j
                  |D cg c]  }|j                  dd       c}      nd|dkD  r||z  nd|r)t        |D cg c]  }|j                  dd       c}      nd|r+t        |D cg c]  }|j                  dd       c}      d
S dd
S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )	u   Calcule les métriques globalestypeTRADE_CLOSEr   )total_tradeswin_rateavg_pnlprofit_factormax_drawdownpnl_pctc              3   @   K   | ]  }|j                  d d        ywrg   r   Nget.0ts     r+   	<genexpr>z<AISelfOptimizer._calculate_global_metrics.<locals>.<genexpr>   s     ;y!,;   c              3   @   K   | ]  }|j                  d d        ywri   rj   rl   s     r+   ro   z<AISelfOptimizer._calculate_global_metrics.<locals>.<genexpr>   s     CqquuY2Crp   )
rb   winslossesrc   rd   avg_winavg_lossre   rf   
best_trade)rk   sumabslennpmeanminmax)r*   rD   rn   closesrr   rs   
total_winstotal_lossess           r+   r>   z)AISelfOptimizer._calculate_global_metricsz   s   #FquuV}'E!FF !!" !  "=aQUU9a%81%<==#@quuY':a'?!@@;d;;
3CFCCD  KI&k39D	CK/qwwVDi 3DEGKrwwTBi 3BCQRJPf Ey!!4 EFVW:F:JZ,6PQJPCf Ey!!4 EFVWHN#FCqquuY2CD
 	
 UV
 	
# G >@  EB E ECs?   G$G$G)G)G.3G.1G3%G8G=H>HrE   c                 ^   |D cg c]-  }|j                  d      dk(  sd|j                  dd      v s,|/ }}t        d       }|D cg c]  }|j                  d      dk(  s| }}|D ]  }|j                  d	      }	|D cg c]  }|j                  d	      |	k(  s| }
}|
s;|
d
   j                  dd      }d|v rd}nd|v rd}nd|v rd}nd|v rd}n	d|v rd}nd}|j                  dd      }||   dxx   dz  cc<   ||   dxx   |z  cc<   |dkD  s||   dxx   dz  cc<    i }|j                         D ]7  \  }}|d   |d   dkD  r|d   |d   z  nd|d   dkD  r|d   |d   z  ndd||<   9 t        |      ||rt        |      t        |      z  dS ddS c c}w c c}w c c}w )u"   Analyse la qualité des signaux IAactionBUYz	IA SIGNALreason c                      ddddS Nr   )countrr   	total_pnl r   r-   r+   <lambda>z9AISelfOptimizer._analyze_signal_quality.<locals>.<lambda>   s    1aVW1X r-   r`   ra   symbolUNKNOWNPOSSIBLEHIGH_SCORE_OVERRIDECROSSOVER_IMMINENTSQUEEZE_WAITINGCREUX_WAITINGOTHERrg   r   r      r   rr   )r   rc   rd   )total_signalspattern_performancesignal_to_trade_ratiork   r   itemsry   )r*   rD   rE   sbuy_signalssignal_performancern   r~   rY   r   matching_signalsr   patternpnlpattern_statsstatss                   r+   r?   z'AISelfOptimizer._analyze_signal_quality   s#   ")lQQUU8_-EXYX]X]^fhjXkIkqll ))XY#FquuV}'E!FF 	=EYYx(F+6Ta!%%/V:STT)"-11(IF'(G*f43G)V32G&&0/G$.-G%Gii	1-"7+G494"7+K8C?87&w/71<73	=8 0668 	NGUw>CGnq>PE&ME'N:VWBG.STBT5-g>Z[&M'"	 !-#0GRS[3{3C%C
 	
 YZ
 	
W m
 G
  Us"   -F F 	F%#F%F*F*c           
         |D cg c]  }|j                  d      dk(  s| }}g }|D ]m  }|j                  dd      }|j                  dd      }|dkD  s-||z
  dkD  s6|j                  |j                  d      ||||z
  |j                  d	      d
       o t        |      |r&t        j                  |D cg c]  }|d   	 c}      nd|dd dS c c}w c c}w )u#   Analyse les fins de cycle manquéesr`   ra   max_profit_pctr   rg   r   r!   r   r   )r   
max_profit	final_pnlloss_from_peakexit_reasonr   N
   )total_missed_peaksavg_loss_from_peakdetails)rk   rU   ry   rz   r{   )	r*   rD   rn   r~   missed_peaksrY   r   r   ms	            r+   r@   z(AISelfOptimizer._analyze_cycle_detection   s    #FquuV}'E!FF  	E#3Q7J		)Q/I CZ)%;s$B###ii1",!*&09&<#(99X#6% 	 #&l"3Zf"''*U11-=+>*U"Vlm#CR(
 	
' G* +Vs   CC8C
c                    |D cg c]  }|j                  d      dk(  s| }}t        d       }|D ]\  }|j                  dd      }|j                  dd      }||   dxx   d	z  cc<   ||   d
xx   |z  cc<   |dkD  sM||   dxx   d	z  cc<   ^ i }|j                         D ]N  \  }}	|	d   |r|	d   t        |      z  dz  nd|	d   dkD  r|	d   |	d   z  nd|	d   dkD  r|	d
   |	d   z  ndd||<   P |S c c}w )zAnalyse le timing des sortiesr`   ra   c                      ddddS r   r   r   r-   r+   r   z6AISelfOptimizer._analyze_exit_timing.<locals>.<lambda>   s    1aa)P r-   r   unknownrg   r   r   r   r   rr   d   )r   
percentagerc   rd   r   )
r*   rD   rn   r~   
exit_statsrY   r   r   exit_analysisr   s
             r+   rA   z$AISelfOptimizer._analyze_exit_timing   s@   #FquuV}'E!FF !PQ
 	0EYYx3F))Iq)Cvw'1,'v{+s2+Qw6"6*a/*	0 '--/ 	MFEwDJeGns6{:S@PQ>CGnq>PE&ME'N:VWBG.STBT5-g>Z[	%M&!	 - Gs
   C7C7c                    |D cg c]  }|j                  d      dk(  s| }}|D cg c]  }|j                  d      dk(  s| }}g }|D ]?  }|j                  d      t        fd|D        d      }|s,|j                  ||d       A |sdd	iS | j                  |      }| j	                  |      }	| j                  |      }
||	|
d
S c c}w c c}w )u3   Calcule les seuils optimaux basés sur l'historiquer`   
TRADE_OPENra   trade_idc              3   L   K   | ]  }|j                  d       k(  s|  yw)r   Nrj   )rm   rn   r   s     r+   ro   z@AISelfOptimizer._calculate_optimal_thresholds.<locals>.<genexpr>  s!     QQ1553D3PqQs   $$N)rP   closeerror   Pas assez de données)r"   r#   r$   )rk   nextrU   _analyze_bb_position_optimal_analyze_rsi_optimal_analyze_momentum_optimal)r*   rD   rn   opensr~   trade_pairsclose_trade
open_tradebb_analysisrsi_analysismomentum_analysisr   s              @r+   rB   z-AISelfOptimizer._calculate_optimal_thresholds  s    "DqaeeFm|&CDD#FquuV}'E!FF ! 	K"z2HQ%QSWXJ""&($ 		 455 77D 00= !::;G ')
 	
5 EFs   CCCCr   c                     g }g }|D ]V  }|d   j                  d      }|d   j                  dd      }|/|dkD  r|j                  |       F|j                  |       X | j                  d   }|rt        j                  |      nd|rt        j                  |      nd|rt        j
                  |      nd|rt        j
                  |      ndd|d   t        |      dkD  rt        j                  |d	      nd
d|dS )zAnalyse bb_position optimalrP   r"   r   rg   r   avg_wins
avg_lossesmedian_winsmedian_lossesr   r   K   g?r   max_thresholdcurrent_usagerecommendedexpert_standardsrk   rU   r)   rz   r{   medianry   
percentile)r*   r   rr   rs   pairbb_posr   current_stds           r+   r   z,AISelfOptimizer._analyze_bb_position_optimal$  s     	*D&\%%m4Fw-##Iq1C!7KK'MM&)	* ..}= .2BGGDMq17bggfoQ26ryyA6<6!2!	 (
3<?INtR!8PT !,
 	
r-   c                     g }g }|D ]V  }|d   j                  d      }|d   j                  dd      }|/|dkD  r|j                  |       F|j                  |       X | j                  d   }|rt        j                  |      nd|rt        j                  |      nd|rt        j
                  |      nd|rt        j
                  |      ndd|d   t        |      dkD  rt        j                  |d	      nd
d|dS )zAnalyse RSI optimalrP   r#   r   rg   r   r   r   r   r   <   r   r   r   )r*   r   rr   rs   r   r#   r   r   s           r+   r   z$AISelfOptimizer._analyze_rsi_optimalC  s     	'Dv,""5)Cw-##Iq1C7KK$MM#&	' ..u5 .2BGGDMq17bggfoQ26ryyA6<6!2!	 (
3<?INtR!8PR !,
 	
r-   c                     g }g }|D ]V  }|d   j                  d      }|d   j                  dd      }|/|dkD  r|j                  |       F|j                  |       X | j                  d   }|rt        j                  |      nd|rt        j                  |      nd|rt        j
                  |      nd|rt        j
                  |      ndd|d   t        |      d	kD  rt        j                  |d
      ndd|dS )zAnalyse momentum optimalrP   
momentum_3r   rg   r   r$   r   r   r      g{Gzd?)r   minimum_thresholdr   r   )r*   r   rr   rs   r   momr   r   s           r+   r   z)AISelfOptimizer._analyze_momentum_optimalb  s     	'Dv,""<0Cw-##Iq1C7KK$MM#&	' ..z: .2BGGDMq17bggfoQ26ryyA6<6!2!	 #..>"?@CD	BR]]4%<TZ !,
 	
r-   rF   c           	          g }|d   }|d   | j                   d   k  rN| j                   d   |d   z
  dz  }|j                  ddd|d   dd	| j                   d   d
d|ddg dd       |j                  di       }|j                  di       j                  dd      }|dkD  r|j                  ddd|dddg dd       |j                  di       }|j                  dd      dkD  r6|j                  dd      }|j                  dd |d    d!d"|d#d$g d%d       |d&   | j                   d'   k  r1|j                  dd(d)|d&   d#d	| j                   d'   dd*g d+d       |j                  d,i       j                  d-i       }	|	rY|	d.d/ik7  rR|	j                  d0i       }
|
j                  d1d      }|d2kD  r)|j                  dd3d4|d#d5d6d7|	d8   d9   d#d:d;gd       d<d=dd>|j                  fd?@       |S )Au4   Génère recommandations d'optimisation automatiquesr2   rc   r%   r   HIGHWIN_RATEz	Win rate .1%z < objectif .0%zGap de z.1fz points)u&   Augmenter score minimum IA de 65 à 70u-   Renforcer filtres bb_position (0.65 → 0.60)z,Exiger momentum > 0.25% pour tous les achats)prioritycategoryissueimpactactionsr5   z
quick-exitr   r   2   QUICK_EXITSzQuick-exits: z.0fz% des trades (objectif < 40%)u(   Achats mal timés, sorties prématurées)u7   Implémenter score minimum progressif selon bb_positionu-   Augmenter seuils quick-exit de 8 à 10 pointsu-   Ajouter délai minimum 15min avant quick-exitr4   r      r   MEDIUMCYCLE_DETECTIONu    fins de cycle manquéeszPerte moyenne de .2fz% depuis le pic)zActiver trailing stop dynamiqueu9   Ajouter détection fin de cycle (RSI > 70 + momentum < 0)u'   Implémenter take-profit partiel à +2%re   r&   PROFIT_FACTORzProfit factor zRatio gains/pertes insuffisant)u#   Augmenter take-profit de 3% à 3.5%u    Réduire stop-loss de 2% à 1.8%z#Filtrer cryptos avec win rate < 40%r6   r"   r   r   r   r   g?BB_POSITIONz#Achats en perte: bb_position moyen u    (zone médiane-haute)z.Achats trop hauts dans les bandes de Bollingeru*   Réduire seuil bb_position max de 0.65 à r   r   z'Appliquer score minimum 75 si bb > 0.55z1Bloquer achats si bb > 0.60 sans momentum > 0.30%r      )r   r   LOWc                 .    j                  | d   d      S )Nr   r   rj   )xpriority_orders    r+   r   z;AISelfOptimizer._generate_recommendations.<locals>.<lambda>  s    >+=+=a
mQ+O r-   )key)r)   rU   rk   sort)r*   rF   r7   metricsgapr5   quick_exit_rate
cycle_dataru   bb_datar   avg_losses_bbr   s               @r+   rC   z)AISelfOptimizer._generate_recommendations  s   *+ :!9!9:K!LL++,=>ATTX[[C"""&$WZ%8$=\$JbJbctJuvyIz{#C9G4
$ 
 kk-4%//,;??aPR""")((==Z[D
$ 
 [[!2B7
>>.2Q6!~~&:A>H""$-&';<==UV-hs^?K
$ 
 ?#d&>&>?U&VV""$+)'/*B3)G|TXTlTl  nD  UE  FI  TJ  K:
$ 
 ++2B7;;M2Nw7,C"DD#KK<M)--lA>Mt#&& & -B=QTBUUklNDW]E[\kElmpDqrAK 
( 
 #$q;!OPr-   c                    | j                         }g }|j                  d       |j                  d       |j                  d       |j                  d| j                   d       |j                  dt        j                         j                  d       d       |d   }|j                  d	       |j                  d
|d           |j                  d|d   dd|d    d|d    d       |j                  d|d   dd       |j                  d|d   d       |j                  d|d   dd       |j                  d|d   dd       |d   }|j                  d       |j                  d |d!           |j                  d"|d#   d       |j                  d$       |d%   j                         D ].  \  }}|j                  d&| d'|d(    d)|d   d*d+|d   dd	       0 |d,   }|d-   d.kD  rA|j                  d/       |j                  d0|d-           |j                  d1|d2   dd       |j                  d3t        |d4          d5       t        |d4   d6      D ]  \  }}	|j                  d7| d8|	d9    d:|	d;           |j                  d<|	d=           |j                  d>|	d?           |j                  d@       |	dA   D ]  }
|j                  dB|
          |j                  dC       dj                  |      S )Du$   Génère un rapport complet en textezP================================================================================u*   🧠 AI SELF-OPTIMIZER - RAPPORT D'ANALYSEu   
📅 Période: hu   🕐 Généré: z%Y-%m-%d %H:%M:%S
r2   u   
📊 MÉTRIQUES GLOBALES:u      Trades fermés: rb   z   Win Rate: rc   r   z (rr   zW / rs   zL)z   P&L Moyen: rd   r   %z   Profit Factor: re   z   Meilleur trade: rv   z   Pire trade: rf   r3   u   
🎯 QUALITÉ DES SIGNAUX:u      Signaux générés: r   u      Ratio signal→trade: r   z
   Performance par pattern:r   u
         • z: r   z trades, WR=r   z, Avg=r4   r   r   u    
⚠️ FINS DE CYCLE MANQUÉES:z
   Total: z   Perte moyenne depuis pic: r   u   
💡 RECOMMANDATIONS (r7   z):r   z
   z. [r   z] r   z      Issue: r   z      Impact: r   z      Actions:r   z         - zQ
================================================================================)
rG   rU   r   r   r<   strftimer   ry   	enumeratejoin)r*   rF   reportr   r3   r   r   cycleirecr   s              r+   generate_reportzAISelfOptimizer.generate_report  s   **,hBCh)$*=*=)>a@A()@)@AT)U(VVXYZ *+34+GN,C+DEFgj&9#%>b@QQUV]^fVgUhhjklwy'9#&>a@A*7?+CC*HIJ+GL,A#+FaHI(?'DAFG !!1246/0O/PQR1.AX2YZ]1^_`56,-BCIIK 	DNGUMMJwir%.1AeT^N_`cMddjkpqzk{|  kA  AB  C  D	D )*%&*MM=?MMJu-A'B&CDEMM9%@T:UVY9ZZ[\] 	0W=N5O1P0QQSTU(9 :A> 	6FAsMME!CJ'83z?:KLMMMM#g,89MMN3x=/:;MM*+i. 6F8456	6 	o&yy  r-   N)   )__name__
__module____qualname____doc__intr,   r   rG   r   r:   r;   r>   r?   r@   rA   rB   r   r   r   rC   strr  r   r-   r+   r   r      s+   =
s 
8T .T$Z (d4j (
T
 
t 
@1
d4j 1
4: 1
RV 1
f
tDz 
d 
64: $ 4 
DJ  
4  
D
T
 
t 
>
T
 
t 
>
T$Z 
D 
>X X$t* Xt1! 1!r-   r   __main__r  )r   u    
🧠 Test AI Self-Optimizer...
zai_self_optimizer_results.jsonwrL   rM   r   F)indentensure_asciiu   
✅ Résultats sauvegardés: ) r  rQ   loggingr   r   collectionsr   typingr   r   r   r	   numpyrz   pathlibr
   basicConfigINFO	getLoggerr  r8   r   	optimizerprintr  r  rG   rF   output_filerP   rW   dumpr   r-   r+   <module>r$     s      ( # . .     ',, '			8	$p! p!f zr2I	
./ &&(F	&M ++-G2K	k3	1 <Q		'1QU;< 
+K=
9:! < <s   3CC(