
    ia              	       $   d Z ddlZddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlZ ej                  d      Z G d de      Z G d	 d
e      Ze	 G d d             Z G d d      Zd0dedee   dee   defdZdadefdZedk(  rddlZdgZ ed      D ]/  Z ej:                  dd      Zej?                  ed   dez   z         1 ejA                  de      Z! e"dd         e"de!jF                           e"d         e"de!jH                  jJ                           e"d e!jL                   d!        e"d"e!jN                  jJ                           e"d#e!jP                  rd$nd%         e"d&        e"d'e!jR                  rd(nd)         e"d*e!jT                  rd(nd)         e"d+e!jV                  rd(nd)         e"d,        e"d-e!jX                  rd)nd(         e"d.e!jZ                  rd)nd(         e"d/e!j\                          yy)1u  
Smart Entry Criteria - Critères d'entrée simplifiés et efficaces
================================================================
Module principal pour les décisions d'achat/vente basé sur 4 règles claires:

RÈGLES D'ACHAT (Zone d'intérêt idéale):
1. BB Squeeze - Courbes Bollinger qui se resserrent (stabilité)
2. EMA9 < EMA21 - EMA9 passe en dessous de EMA21 = point d'entrée
3. Confirmation hausse - Vérifier si hausse AVANT d'acheter
4. Vente immédiate si baisse confirmée

RÈGLES D'EXCLUSION (À éviter - NO BUY):
1. EMA en baisse permanente
2. BB et EMA en baisse permanente
3. Peu de variations (volumes et prix stables)

Créé le: 23/12/2024
    N)ListDictTupleOptional)	dataclass)EnumSmartEntryCriteriac                   (    e Zd ZdZdZdZdZdZdZdZ	y)	
SignalTypezTypes de signaux possiblesACHATPOSSIBLEHOLDVENTENO_BUY
ABANDONNEEN)
__name__
__module____qualname____doc__r   r   r   r   r   r        ./smart_entry_criteria.pyr   r      s#    $EHDEFJr   r   c                       e Zd ZdZdZdZdZy)TendanceTypezTypes de tendanceHaussierBaissierNeutreN)r   r   r   r   HAUSSIERBAISSIERNEUTREr   r   r   r   r   '   s    HHFr   r   c                       e Zd ZU dZeed<   eed<   eed<   eed<   e	ed<   e	ed<   e	ed<   e	ed	<   e	ed
<   e	ed<   e
ed<   e
ed<   e
ed<   e
ed<   eed<   e	ed<   y)SmartAnalysisu"   Résultat de l'analyse simplifiéesymbolsignalscoretendance
bb_squeezeema9_under_ema21hausse_confirmeebaisse_confirmeeema_baisse_permanentepeu_variationsema9ema21bb_bandwidthrsiraisoneligibleN)r   r   r   r   str__annotations__r   intr   boolfloatr   r   r   r"   r"   .   sf    ,KJ    KL	J KNr   r"   c                      e Zd ZdZdZdZdZdZdZe	de
j                  ded	efd
       Ze	dde
j                  deded	eeeef   fd       Ze	dde
j                  ded	efd       Ze	dde
j                  deded	efd       Ze	ddeee      ded	efd       Ze	 ddedee   deee      d	efd       Zedee   d	ee   fd       Zeddee   ded	ee   fd       Zy) r	   ut   
    Système de critères d'entrée simplifié
    Basé sur les règles visuelles définies par l'utilisateur
    g      @g333333ӿ      ?g333333?      pricesperiodreturnc                     t        |       |k  rt        |       dkD  rt        | d         S dS d|dz   z  }t        t        j                  | d|             }| |d D ]  }t        |      |z  |d|z
  z  z   } |S )zCalcule l'EMAr                 N)lenr7   npmean)r;   r<   multemaprices        r   _emazSmartEntryCriteria._emaX   s     v;(+Fa5$@S@FQJBGGF7FO,-FG_ 	=E<$&3!d(+;<C	=
r   std_devc                    t        |       |k  r#t        |       dkD  rt        | d         nd}|||fS t        t        j                  | | d             }t        t        j                  | | d             }|||z  z   ||||z  z
  fS )z3Calcule les bandes de Bollinger (upper, mid, lower)r   r?   r@   N)rC   r7   rD   rE   std)r;   r<   rJ   valsmarL   s         r   
_bollingerzSmartEntryCriteria._bollingerc   s     v;'*6{Q%r
#CCS= BGGFF78,-.BFF66'(+,-Ws]"Cw})<<<r   c                 n   t        |       |dz   k  ryt        j                  |       }t        j                  |dkD  |d      }t        j                  |dk  | d      }t	        t        j
                  || d             }t	        t        j
                  || d             }|dk(  ry||z  }ddd|z   z  z
  S )zCalcule le RSIrB         I@r   N      Y@      ?)rC   rD   diffwherer7   rE   )r;   r<   deltasgainslossesavg_gainavg_lossrss           r   _rsizSmartEntryCriteria._rsim   s     v;!#!VQ/&1*vgq1wx12!123q= r*++r   lookbackc                     t        |       ||z   k  ryt        j                  | |      }t        j                  | d|  |      }|dk(  ry||z
  |z  dz  S )u4   Calcule la pente de l'EMA sur les dernières bougiesr@   Nr   d   )rC   r	   rI   )r;   r<   r]   ema_nowema_prevs        r   _calculate_ema_slopez'SmartEntryCriteria._calculate_ema_slope|   sd     v;(**$))&&9%**6*H9+=vFq=8#x/366r   volumes	thresholdc                     | rt        |       dk  ryt        j                  | dd       }t        j                  |      }|dk(  ryt        j                  |      t        j
                  |      z
  |z  }||kD  S )u<   Vérifie si les volumes sont suffisamment actifs (variation)
   TNr   F)rC   rD   arrayrE   maxmin)rc   rd   	vol_arrayavg_vol	vol_ranges        r   _is_volume_activez$SmartEntryCriteria._is_volume_active   so     #g,+HHWST]+	'')$a< VVI&	)::gE	9$$r   Nr#   c                    t        dIi d|dt        j                  dddt        j                  ddddd	dd
ddddddddddddddddd}t        |      dk  r|S t        j                  |t              }| j                  |d      }| j                  |d      }| j                  |      \  }}	}
| j                  |      }|	dkD  r||
z
  |	z  dz  nd}| j                  |d      }| j                  |d      }|| j                  k  }||k  }t        |      dk\  r|d   |d   z
  |d   z  dz  nd}t        |      dk\  r|d   |d   z
  |d   z  dz  nd}|dkD  xr || j                  kD  }|| j                  k  xr |dk  }|| j                   k  xr || j                   k  xr |d k  }| j#                  || j$                         }t        |      d!k\  rDt        t        j&                  |d"d#       t        j(                  |d"d#       z  dz        }|d$k  rd%}|dk7  r||z
  |z  dz  nd}||k  xr |d&kD  xr |dkD  }||k  xr | xr |dk  xs |dk  xr |dk  }|rt        j*                  }nJ||kD  r|dkD  r|st        j*                  }n-||k  r|dk  s|rt        j,                  }nt        j                  }d}g }|r|d'z  }|j/                  d(       |r|d!z  }|j/                  d)       n|dz  }|j/                  d*       |r|d+z  }|j/                  d,       |r|d-z  }|j/                  d.       |r|d/z  }|j/                  d0       |r|d'z  }|j/                  d1       d-|cxk  rd/k  rn n|d2z  }|j/                  d3|d4d5       n |d6kD  r|d2z  }|j/                  d7|d4d5       t1        dt3        d|            }d%}|r5t        j4                  }t3        d|d!z         }|j7                  dd8       d%}n|r&t        j8                  }|j7                  dd9       d}n|sl||z  d:z
  dz  }|d;k  r6|r4|r2|d<k  r-|s+t        j4                  }|j7                  dd=|d>d?       d%}n>t        j:                  }|j7                  dd@       d}n|r%t        j8                  }|j7                  ddA       d}n|r'|s%t        j8                  }|j7                  ddB       d}n|r%t        j<                  }|j7                  ddC       d}n|r)|r'|r%t        j4                  }|j7                  ddD       d%}nv|r'|r%t        j>                  }|j7                  ddE       d%}nM|r'|r%t        j>                  }|j7                  ddF       d%}n$t        j                  }|j7                  ddG       d}t        dIi d|d|d|d|d|d|d	|d
|d|d|d|d|d|d|ddHjA                  |      d|S )JuB  
        Analyse une valeur selon les critères simplifiés
        
        Args:
            symbol: Symbole de la crypto
            prices: Liste des prix (au moins 50 valeurs)
            volumes: Liste des volumes (optionnel)
            
        Returns:
            SmartAnalysis avec le résultat complet
        r#   r$   r%   r   r&   r'   Fr(   r)   r*   r+   r,   r-   r@   r.   r/   r0   rQ   r1   u   Données insuffisantesr2   2   )dtype	      r_      r?   rA   r:      rg   Ng333333?Tg   u   BB Squeeze ✓u   EMA9 < EMA21 ✓u!   EMA9 >= EMA21 ✗ (pas d'entrée)   u   Hausse confirmée ✓   u   Baisse confirmée ✗(   u   EMA baisse permanente ✗u   Peu de variations ✗rf   zRSI favorable (z.0f)F   zRSI surachat (u!   🔥 CROISEMENT IMMINENT - Achat!u'   📉 TENDANCE BAISSIÈRE - Pas d'achat!rB   rS   A   u/   ✅ Continuation haussière prudente (EMA diff=z.2fz%)u*   ❌ EMA9 >= EMA21 (pas de point d'entrée)u   ❌ EMA en baisse permanenteu   ❌ Peu de variationsu   🔴 Vente immédiateu   ✅ Signal d'ACHATu%   🟡 En surveillance (attente hausse)u   🟡 Possible (pas de squeeze)u   ⚪ En attentez | r   )!r"   r   r   r   r    rC   rD   rh   r7   rI   rO   r\   rb   BB_SQUEEZE_THRESHOLDHAUSSE_CONFIRMATIONBAISSE_CONFIRMATIONEMA_SLOPE_THRESHOLDrn   MIN_VOLUME_VARIATIONrL   rE   r   r   appendri   rj   r   insertr   r   r   r   join) clsr#   r;   rc   default_result
prices_arrr-   r.   bb_upperbb_midbb_lowerr0   r/   
ema9_slopeema21_sloper'   r(   price_change_3price_change_1r)   r*   r+   r,   price_volatilityema_diff_pctis_crossover_imminenttendance_bearish_globaler&   r%   raisonsr2   r$   s                                    r   analyzezSmartEntryCriteria.analyze   sJ   $ ' 

??
 
 "((	

 
 #
 #
 #
 #(
 !
 
 
 
 
 ,
  !
& v;!!XXfE2
 xx
A&R(%(^^J%?"&(hhz" BH!H,6<QR --j!<
..z2>
 "C$<$<<

  %< LOv;Z[K[6":r
2fRj@CGabKNv;Z[K[6":r
2fRj@CGab Q 5S444 	 S444 N 	 000 "#111"T! 	 !227C<T<TUU v;"$RVVF34L%9BGGF34L<Q%QTW%WX$&!% :?!.#55L 4N 	 5L %%!^.{Q Q	 	! !#,,HE\j1n5M#,,HE\zA~1F#,,H#**H
  RKENN+,RKENN-. RKENN>?RKENN23 RKENN23 RKENN67RKENN23 ??RKENN_SIQ782XRKENN^C9A67As3'  !%%FURZ(ENN1ABH
 &&&FNN1GHH "!E\Q.#5L s" b)#))q$ST`adSeeg"hi#..q"NO  #&&FNN1<=H$4&&FNN156H%%FNN156H ,1A%%FNN123H,((FNN1EFH"2((FNN1>?H  __FNN1./H 


 
 	

 "
 .
 .
 .
 #8
 *
 
 
 &
 
 ::g&
  !
 	
r   analysesc                 b    |D cg c]  }|j                   s| }}t        |d d      S c c}w )ur   
        Filtre les analyses pour ne garder que les valeurs éligibles
        Tri par score décroissant
        c                     | j                   S N)r%   )xs    r   <lambda>z4SmartEntryCriteria.filter_eligible.<locals>.<lambda>  s
    agg r   T)keyreverse)r2   sorted)r   r   ar2   s       r   filter_eligiblez"SmartEntryCriteria.filter_eligible  s2      (6!1::A66h$5tDD 7s   ,,limitc                 :    dt         fd}t        ||      }|d| S )u_   
        Retourne les meilleures opportunités d'achat
        Tri par score et signal
        r   c                    t         j                  dt         j                  dt         j                  dt         j                  dt         j
                  dt         j                  di}|j                  | j                  d      | j                   fS )Nr   rB   rA   rt         )
r   r   r   r   r   r   r   getr$   r%   )r   signal_prioritys     r   priority_keyz>SmartEntryCriteria.get_top_opportunities.<locals>.priority_key  sm      !##Q  !!!1%%qO $''!4qwwh??r   )r   N)r"   r   )r   r   r   r   sorted_analysess        r   get_top_opportunitiesz(SmartEntryCriteria.get_top_opportunities  s+    		@M 		@ !|<v&&r   )rw   rA   )   )r   )r9   r   )rf   )r   r   r   r   r   r   r   r   r   staticmethodrD   ndarrayr5   r7   rI   r   rO   r\   rb   r   r   r6   rn   classmethodr3   r"   r   r   r   r   r   r   r	   r	   K   s    RZZ     =2:: =s =# =eTY[`bgTgNh = = ,RZZ , ,e , , 7RZZ 7 7 7TY 7 7 %8DK#8 %U %UY % %  26a
a
Ua
 "$u+.a
 ;Ha
 a
F	 EtM': EtM?R E E 'T--@ ' 'VZ[hVi ' 'r   r#   r;   rc   r=   c                    t         j                  | ||      }|j                  |j                  j                  |j
                  |j                  j                  |j                  |j                  |j                  |j                  |j                  |j                  d|j                  |j                  d|j                  |j                   |j"                  |j$                  dd	S )uk   
    Analyse rapide retournant un dictionnaire simple
    Pour intégration facile dans le trading bot
    )r'   r(   r)   r*   )r+   r,   )r-   r.   r/   r0   )	r#   r$   r%   r&   r2   r1   criteria
exclusions
indicators)r	   r   r#   r$   valuer%   r&   r2   r1   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   )r#   r;   rc   results       r   quick_analyzer     s    
  ''@F ----%%OO))OO-- ++ & 7 7 & 7 7 & 7 7	
 &,%A%A$33

 KK\\"//::	
# r   c                  .    t         
t               a t         S )u)   Retourne l'instance globale des critères)_smart_criteria_instancer	   r   r   r   get_smart_criteriar     s      '#5#7 ##r   __main__rR   c   g{Gzg?r?   rB   z	TEST/USDT
z<============================================================z	ANALYSE: zSignal: zScore: z/100z
Tendance: u   Éligible: OuiNonu   
Critères:z  - BB Squeeze: u   ✓u   ✗z  - EMA9 < EMA21: u     - Hausse confirmée: z
Exclusions:z  - EMA baisse permanente: z  - Peu de variations: z	
Raison: r   )/r   numpyrD   typingr   r   r   r   dataclassesr   enumr   logging	getLoggerloggerr   r   r"   r	   r3   r7   r   r   r   r   randomtest_pricesrange_uniformchanger   r   r   printr#   r$   r   r%   r&   r2   r'   r(   r)   r+   r,   r1   r   r   r   <module>r      sU  &  . . !  			/	0 4    8K' K'd# tE{ T%[ TX D   $. $ z 'K2Y ;u-;r?a&j9:;  ''[AF	Bvh-	Ifmm_
%&	VH	HV]](()
*+	GFLL>
&'	Jv,,-
./	Ke<
=>	L	f&7&7UUC
DE	(?(?uUK
LM	#V-D-DE%#P
QR	M	'1M1MSX'Y
Z[	#V-B-BE#N
OP	Jv}}o
&'5 r   