
    #}iY                     $   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	m
Z
 ddlmZ ej                  dk(  rddlZej                  j                   dk7  r2  ej"                  d      ej                  j$                  d      e_        ej&                  j                   dk7  r2  ej"                  d      ej&                  j$                  d      e_         G d	 d
      Z G d d      ZdadefdZedk(  r e       Z eej7                                yy)u  
Pattern Manager - Gestion centralisée des patterns de trading
=================================================================

Ce module centralise toute la logique des patterns pour :
- Activer/désactiver des patterns individuellement
- Gérer les statistiques par pattern
- Optimiser les seuils de détection
- Filtrer les patterns non performants
- Faciliter la maintenance et l'optimisation

Author: Trading Bot Team
Date: 2026-01-23
    N)datetime	timedelta)DictListOptionalTuple)defaultdictwin32utf-8strictc                       e Zd ZdZ	 	 ddededededef
dZe	defd	       Z
e	defd
       Ze	defd       Ze	defd       ZdefdZedefd       Zy)PatternConfigz%Configuration d'un pattern de tradingnameenabled	min_scorewin_rate_thresholddescriptionc                     || _         || _        || _        || _        || _        d| _        d| _        d| _        d| _        d| _	        d | _
        y )Nr           )r   r   r   r   r   total_signalstotal_tradeswinslosses	total_pnl	last_used)selfr   r   r   r   r   s         2/home/ubuntu/crypto_trading_bot/pattern_manager.py__init__zPatternConfig.__init__$   sS    	""4&	    returnc                 Z    | j                   dk(  ry| j                  | j                   z  dz  S )zCalcule le win rate du patternr   r   d   )r   r   r   s    r   win_ratezPatternConfig.win_rate2   s/     !		D---44r   c                 T    | j                   dk(  ry| j                  | j                   z  S )zCalcule le P&L moyenr   r   )r   r   r#   s    r   avg_pnlzPatternConfig.avg_pnl9   s*     !~~ 1 111r   c                 V    | j                   | j                  k\  xr | j                  dk\  S )u%   Vérifie si le pattern est profitable   )r$   r   r   r#   s    r   is_profitablezPatternConfig.is_profitable@   s*     }} 7 77RD<M<MQR<RRr   c                 V    | j                   dk\  xr | j                  | j                  k  S )u.   Indique si le pattern nécessite une révision
   )r   r$   r   r#   s    r   needs_reviewzPatternConfig.needs_reviewE   s)       B&R4==4;R;R+RRr   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  t        | j                  d      t        | j                  d      | j                  r| j                  j                         ndddS )z)Convertit en dictionnaire pour sauvegarde      N)r   r   r   r   r   r$   r&   r   )r   r   r   r   r   stats)r   r   r   r   r   r   r   r   r   r   roundr$   r&   r   	isoformatr#   s    r   to_dictzPatternConfig.to_dictJ   s     II||"&"9"9++!%!3!3 $ 1 1		++!^^!$--3 q1;?>>T^^557t	
 	
r   datac           
          | |d   |j                  dd      |j                  dd      |j                  dd      |j                  dd	      
      }|j                  di       }|j                  dd      |_        |j                  dd      |_        |j                  dd      |_        |j                  dd      |_        |j                  dd      |_        |j                  d      rt        j                  |d         |_        |S )u   Crée depuis un dictionnairer   r   Tr   #   r         >@r    )r   r   r   r   r   r0   r   r   r   r   r   r   r   r   )	getr   r   r   r   r   r   fromisoformatr   )clsr4   configr0   s       r   	from_dictzPatternConfig.from_dict^   s     fHHY-hh{B/#xx(<dC3
 "%$yy!<#ii:ii*		(A. 99[#699[!'55eK6HIFr   N)Tr6   r7   r8   )__name__
__module____qualname____doc__strboolintfloatr   propertyr$   r&   r)   r,   dictr3   classmethodr=    r   r   r   r   !   s    /IKFHS 4 3 %*@C 5% 5 5 2 2 2 St S S Sd S S
 
( T  r   r   c                      e Zd ZdZi d eddddd      d edd	d
dd      d edd	ddd      d edd	ddd      d edd	ddd      d edd	ddd      d edd	ddd      d edd	ddd       d! ed!ddd"d#      d$ ed$dd%d"d&      d' ed'dd%d"d(      d) ed)dd
dd*      d+ ed+dddd,      d- ed-dddd.      d/ ed/dddd0      d1 ed1dddd2      d3 ed3d	ddd4       ed5dd%dd6       ed7dddd8       ed9dddd:       ed;dddd<       ed=d	ddd>       ed?d	ddd@       edAddddB       edCddd"dD      dEZd]dFefdGZdH ZdI Z	dJ Z
d^dKedLedMeeef   fdNZdKefdOZdKedPefdQZdMee   fdRZdKedMee   fdSZdMefdTZdKedMefdUZdKedMefdVZdKedMefdWZdKedXedMefdYZdMefdZZdMefd[Zy\)_PatternManagerui  
    Gestionnaire centralisé des patterns de trading
    
    Responsabilités:
    - Enregistrer et gérer tous les patterns disponibles
    - Filtrer les patterns actifs/inactifs
    - Valider si un pattern doit être utilisé pour un achat
    - Mettre à jour les statistiques par pattern
    - Désactiver automatiquement les patterns non performants
    UNKNOWNT(   g     A@u.   Pattern non identifié - Requiert surveillance)r   r   r   r   DEAD_CAT_BOUNCEF2   g      D@u6   Rebond temporaire dans tendance baissière - DANGEREUXPROLONGED_DOWNTREND<   g     F@u.   Tendance baissière prolongée - TRÈS RISQUÉEND_OF_CYCLEr"   g      I@z&Fin de cycle haussier - BLOCAGE ABSOLURSI_TRAP7   u+   Piège RSI en tendance baissière - RISQUÉSTRONG_DOWNTRENDA   u#   Tendance baissière forte - ÉVITERACTIVE_CRASHF   zCrash actif en cours - BLOCAGESTABLECOIN_REJECTED-   u$   Stablecoin rejeté - Peu d'intérêtHOLDr7   zSignal HOLD - NeutrePOSSIBLEr6   z$Achat possible - Conditions moyennesACHATu   Signal achat génériqueCREUX_REBOUNDz&Rebond depuis un creux - BON POTENTIELEARLY_BREAKOUTu   Cassure précoce - EXCELLENTCONSOLIDATION_BREAKOUTzSortie de consolidation - BONEMA_BULLISHu"   Configuration EMA haussière - BONCROSSOVER_IMMINENTzCroisement EMA imminent - BONSQUEEZE_BREAKOUTuE   Sortie de squeeze - DÉSACTIVÉ (18% WR rétro 582 trades, -24.55€)SQUEEZE_WAITINGzEn attente de squeeze - MOYENVOLUME_REVERSALzRetournement volume - BONRSI_REVERSALzRetournement RSI - BONSTRONG_UPTRENDu%   Tendance haussière forte - EXCELLENTTREND_CONTINUATIONuA   Continuation tendance - DÉSACTIVÉ (0% WR récent, 31% all-time)PULLBACKuU   Pullback dans tendance haussière - DÉSACTIVÉ (22% WR rétro 582 trades, -26.12€)HIGH_SCORE_OVERRIDEu-   Score IA très élevé - Override des règlesOTHERzAutre pattern)rd   re   rf   rg   rh   ri   rj   rk   config_filec                 ^    || _         i | _        t               | _        | j	                          y)z
        Initialise le gestionnaire de patterns
        
        Args:
            config_file: Fichier de configuration des patterns
        N)rl   patternssetblacklisted_patternsload_config)r   rl   s     r   r   zPatternManager.__init__   s)     '24),!r   c                    t         j                  j                  | j                        r	 t	        | j                  dd      5 }t        j                  |      }|j                  di       j                         D ]'  \  }}t        j                  |      | j                  |<   ) t        |j                  dg             | _        ddd       t        dt        | j                         d       y| j#                          | j%                          y# 1 sw Y   MxY w# t         $ r(}t        d	|        | j#                          Y d}~yd}~ww xY w)
uI   Charge la configuration depuis le fichier ou initialise avec les défautsrr   encodingrn   blacklistedNu   [OK] Pattern config chargée: z	 patternsz*[WARN] Erreur chargement config patterns: )ospathexistsrl   openjsonloadr9   itemsr   r=   rn   ro   rp   printlen	Exception_init_default_patternssave_config)r   fr4   pattern_namepattern_dataes         r   rq   zPatternManager.load_config   s   77>>$**+	.$**C'B Qa99Q<D6:hhz26N6T6T6V \2l6C6M6Ml6[l3\03DHH]B4O0PD-	Q
 6s4==7I6J)TU
 '')Q Q  .B1#FG++--.s0   D B D*D DD 	E$EEc                     | j                   j                         D ci c]  \  }}||
 c}}| _        h d| _        t	        dt        | j                         dt        | j                         d       yc c}}w )u(   Initialise avec les patterns par défaut>   rW   rR   rN   rU   rP   u   [OK] Patterns initialisés: z patterns, u    blacklistésN)AVAILABLE_PATTERNSr}   rn   rp   r~   r   r   r   r<   s      r   r   z%PatternManager._init_default_patterns   sm    :>:Q:Q:W:W:YZ,$vZ%
! 	,S-?,@CPTPiPiLjKkkxyz [s   A6c                    	 | j                   j                         D ci c]  \  }}||j                          c}}t        | j                        t        j                         j                         d}t        | j                  dd      5 }t        j                  ||dd       ddd       yc c}}w # 1 sw Y   yxY w# t        $ r}t        d	|        Y d}~yd}~ww xY w)
zSauvegarde la configuration)rn   rv   last_updatedwr   rt      F)indentensure_asciiNz*[WARN] Erreur sauvegarde config patterns: )rn   r}   r3   listrp   r   nowr2   rz   rl   r{   dumpr   r~   )r   r   r<   r4   r   r   s         r   r   zPatternManager.save_config   s    		DHLH[H[H]^fT6>>#33^#D$=$=> ( 8 8 :D
 d&&g> A!		$!%@A A	 _A A 	D>qcBCC	DsF   C B0AC B6'C 0C 6B?;C ?C 	C#CC#r   ai_scorer    c                    	 t         j                  j                  | j                        rVt	        | j                  dd      5 }t        j                  |      }t        |j                  dg             | _	        ddd       || j                  vrdd| dfS | j                  |   }|| j                  v rdd| d	fS |j                  sdd| d
fS ||j                  k  rdd| d|j                   d| dfS dh}|j                  r'||vr#dd| d|j                  dd|j                   dfS |j                  r||v r	 dd| d|j                  dd|j                   dfS # 1 sw Y   xY w#  Y xY w)u  
        Vérifie si un pattern est autorisé pour un achat
        
        Args:
            pattern_name: Nom du pattern
            ai_score: Score IA du signal
            
        Returns:
            (allowed, reason): True si autorisé, False sinon + raison
        rs   r   rt   rv   NFz	Pattern 'z	' inconnuu(   ' blacklisté (performance insuffisante)   ' désactivéz	Score IA z < minimum requis (z) pour ''r^   u   ' nécessite révision (WR=.1fz% < z%)Tu   ' validé (WR=u   %, AI≥))rw   rx   ry   rl   rz   r{   r|   ro   r9   rp   rn   r   r   r,   r$   r   )r   r   r   r   r4   r<   PROTECTED_PATTERNSs          r   is_pattern_allowedz!PatternManager.is_pattern_allowed   s   	ww~~d../$**C'B Qa99Q<D03DHH]B4O0PD-Q t}},Il^9===|, 4444Il^3[\\\ ~~Il^=AAA f&&&IhZ/B6CSCSBTT\]i\jjklll
 ..<7I#IIl^3Nv_bNccghn  iB  iB  hC  CE  F  F  F  \5G%GynV__S<QQYZ`ZjZjYkklmmmEQ Q	s$   AE- 6E!9E- !E*&E- -E1c                     || j                   v rI| j                   |   xj                  dz  c_        t        j                         | j                   |   _        yy)u9   Enregistre qu'un signal a été généré pour ce patternr.   N)rn   r   r   r   r   r   r   s     r   record_signalzPatternManager.record_signal%  sD    4==(MM,'55:54<LLNDMM,'1 )r   pnl_pctc           	         || j                   vr)t        d| d       t        |d      | j                   |<   | j                   |   }|xj                  dz  c_        |xj                  |z  c_        |dkD  r|xj
                  dz  c_        n|xj                  dz  c_        dh}|j                  dk\  rY|j                  d	k  rJ||vrF| j                  j                  |       t        d
| d|j                  dd|j                   d       n?|j                  dk\  r0|j                  d	k  r!||v rt        d| d|j                  dd       | j                          y)u   
        Enregistre le résultat d'un trade pour ce pattern
        
        Args:
            pattern_name: Nom du pattern
            pnl_pct: P&L en pourcentage
        z[WARN] Pattern 'u!   ' inconnu - Création automatiqueT)r   r.   r   r^            9@[BLACKLIST] Pattern 'u   ' AUTO-BLACKLISTÉ (WR=r   z% sur z trades)z' WR=u#   % mais PROTÉGÉ (pattern critique)N)rn   r~   r   r   r   r   r   r$   rp   addr   )r   r   r   r<   r   s        r   record_tradezPatternManager.record_trade+  sU    t}},$\N2STU*7d*SDMM,'|,q G#Q;KK1KMMQM
 .."$4)?LXjDj%%)),7),7Nv_bNccijpj}j}i~  G  H  I  B&6??T+AlVhFh$\N%7LLopq 	r   c                     | j                   j                         D cg c]!  \  }}|j                  r|| j                  vr|# c}}S c c}}w )z%Retourne la liste des patterns actifs)rn   r}   r   rp   r   s      r   get_enabled_patternsz#PatternManager.get_enabled_patternsM  sJ    )-)<)<)> Mv>>d$2K2K&K  M 	M Ms   &Ac                 Z    || j                   v r| j                   |   j                         S y)z&Retourne les statistiques d'un patternN)rn   r3   r   s     r   get_pattern_statsz PatternManager.get_pattern_statsR  s)    4==(==.6688r   c           
         i t        | j                        t        | j                               t        | j                        t        | j                  j	                         D cg c]  }|j
                  s| c}      dd}| j                  j                         D ]  \  }}|j                         |d   |<    |S c c}w )z.Retourne les statistiques de tous les patterns)total_patternsr   rv   r,   )rn   summaryrn   )r   rn   r   rp   valuesr,   r}   r3   )r   pr0   r   r<   s        r   get_all_statszPatternManager.get_all_statsX  s     "%dmm"4t88:;"4#<#<= #0D0D0F$Y1!..Q$Y Z	
 !MM//1 	7LD&&,nn&6E*d#	7  %Zs   #B>5B>c                     || j                   v r]d| j                   |   _        || j                  v r| j                  j                  |       | j	                          t        d| d       yy)zActive un patternT[OK] Pattern 'u	   ' activéF)rn   r   rp   remover   r~   r   s     r   enable_patternzPatternManager.enable_patterni  sd    4==(26DMM,'/t888))00>N<.	:;r   c                     || j                   v r4d| j                   |   _        | j                          t        d| d       yy)u   Désactive un patternFz[OFF] Pattern 'r   T)rn   r   r   r~   r   s     r   disable_patternzPatternManager.disable_patternt  sB    4==(27DMM,'/OL>?@r   c                     || j                   v r;| j                  j                  |       | j                          t	        d| d       yy)zBlackliste un patternr   u   ' blacklistéTF)rn   rp   r   r   r~   r   s     r   blacklist_patternz PatternManager.blacklist_pattern}  sF    4==(%%)),7),}EFr   	new_scorec                     || j                   v r6|| j                   |   _        | j                          t        d| d|        yy)u)   Met à jour le score minimum d'un patternr   u   ' - Score min mis à jour: TF)rn   r   r   r~   )r   r   r   s      r   update_min_scorezPatternManager.update_min_score  sG    4==(4=DMM,'1N<.0KI;WXr   c                    g g g g d}| j                   j                         D ]z  \  }}|j                  dk  r|j                  dk  r6|j                  dk\  r'|j                  rd|_        |d   j                  |       |j                  dk  rL|j                  dk\  r=|| j                  vr/| j                  j                  |       |d	   j                  |       |j                  d
kD  rP|j                  dk\  rA|j                  dk  r2t        |j                  dz   d      |_        |d   j                  |       |j                  dkD  s'|j                  dk\  s8|j                  dkD  sIt        |j                  dz
  d      |_        |d   j                  |       } t        |j                               r=| j                          t        dt        d |j                         D               d       |S )u   
        Optimise automatiquement les patterns selon leurs performances
        
        Returns:
            dict: Résumé des optimisations effectuées
        )disabledrv   score_increasedscore_decreasedr(   r   r+   Fr   g      4@r   rv   g      N@   rM   r   g     Q@   z$[OPTIM] Optimisations automatiques: c              3   2   K   | ]  }t        |        y w)N)r   ).0vs     r   	<genexpr>z3PatternManager.optimize_patterns.<locals>.<genexpr>  s     <dSV<ds   u    patterns modifiés)rn   r}   r   r$   r   appendrp   r   r   minmaxanyr   r   r~   sum)r   optimizationsr   r<   s       r   optimize_patternsz PatternManager.optimize_patterns  s    !!	
 !MM//1 	BLD&""Q& %&*=*=*C>>%*FN!*-44T: %&*=*=*Ct888--11$7!-077= %&*=*=*C##b('*6+;+;a+?'DF$!"34;;DA %&*=*=*C##b('*6+;+;a+?'DF$!"34;;DA5	B8 }##%&8<d]MaMaMc<d9d8eexyzr   c                 *   g d}t        | j                  j                         D cg c]  \  }}|j                  dkD  s||f c}}d d      }|D ]  \  }}|j                  rdn|j
                  rdnd}|j                  r|| j                  vrd	nd
}|j                  | d|dd|dd|j                  dd|j                  dd|j                  dd        |j                  ddt        | j                         dt        | j                                dt        | j                         dt        | j                  j                         D cg c]  }|j
                  s| c}       dg       dj                  |      S c c}}w c c}w )u/   Génère un rapport de performance des patterns)zG
======================================================================z$ RAPPORT DE PERFORMANCE DES PATTERNSF======================================================================r8   r   c                      | d   j                   S )Nr.   )r$   )xs    r   <lambda>z7PatternManager.get_performance_report.<locals>.<lambda>  s    !A$-- r   T)keyreversez[OK]z[WARN]z[OFF]ONOFF 25sz [3sz] WR=z5.1fz	% Trades=3dz	 PNL avg=z+.3f%r8   zTotal patterns: zActifs: u   Blacklistés: u   À réviser: r   
)sortedrn   r}   r   r)   r,   r   rp   r   r$   r&   extendr   r   r   join)r   reportr   r<   sorted_patternsstatusr   r   s           r   get_performance_reportz%PatternManager.get_performance_report  s   
 !040C0C0EafI\I\_`I`dF^a'
 , 	LD&%33VVEXEX^eF$nnT=V=V1Vd\aGMM(!D:R|58N O --b16>>$:OqR		 	s4==123s4446789S!:!:;<=CDMM,@,@,B Uqann UVWX
 	 yy  / b& !Vs   F

F

F&FN)zpattern_config.json)r   )r>   r?   r@   rA   r   r   rB   r   rq   r   r   rD   r   rC   r   r   rE   r   r   r   r   rG   r   r   r   r   r   r   r   r   rI   r   r   rK   rK   s   s   	<=DB[_-]_< 	=):EUWlp5mo	< 	}-BE]_tx9i k< 	nesgk2Z\< 	M*er^b-Z\< 	M*<eWYnr6[]< 	nerfj2RT<$ 	}-BE]_tx9_ a%<( 	fdbUY)?A)<, 	M*db]a-SU-<0 	wW[*DF1<8 	PRgk3[]9<< 	-(8$RTim4RT=<@ 	!-0HRVbdy}<[#]A<D 	}]DBcg0TVE<H 	m,@$Z\qu8WYI<L 	M*<eWYnr6}M<P )):DTVko5TV():DTVko5PR%ndbei2JL'(8$RTim4[] ,,@%[]rv8{}!*er^b /FG  --BD\^sw9h jwW[*9;u<|
C 
"{D1ns 1nc 1n%PTVYPYJZ 1nfC# C   u  DMd3i M
c htn t "	3 	4 	C D c d S S T .4 .`"! "!r   rK   r    c                  .    t         
t               a t         S )z7Retourne l'instance globale du gestionnaire de patterns)_pattern_manager_instancerK   rI   r   r   get_pattern_managerr     s     !($2$4!$$r   __main__)rA   r{   rw   sysr   r   typingr   r   r   r   collectionsr	   platformcodecsstdoutru   	getwriterbufferstderrr   rK   r   r   r>   pmr~   r   rI   r   r   <module>r      s     	 
 ( . . # <<7
zzg%.%V%%g.szz/@/@(K

zzg%.%V%%g.szz/@/@(K
O Odn! n!d ! %^ % z		B	"
#
#
%& r   