
    bai<                        d 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
Z
ddlZddlZddlmZmZ ddlmZ  ej$                  ej&                          ej(                  d      Zd	Zd
ZdZdZdZdZ	 ddlZddlmZ ddlmc mZ  ej>                  d       	  ej@                  d       ejD                  jG                         rdZejD                  jI                  d      ZejD                  jK                  d      jL                  dz  Z'ejQ                  de        ejQ                  de'dd       ejQ                  dejR                  jD                          dZndZe G d d             Z+ G d d      Z, G d d      Z- G d d      Z.da/de.fdZ0e1d k(  rddl2Z2 e3d!        e3d"        e3d!        e0       Z4ejd                  jk                  d#       d$Z6e6gZ7 e8d%      D ];  Z9ejd                  ju                  dd&      Z;e7jy                  e7d'   de;d$z  z   z         =  e8d(      D ]  Z=e7jy                  e7d'   d)z           e8d*      D ]  Z=e7jy                  e7d'   d+z           e8 e>e7            D  cg c]  }  e2j~                  d,d-       c} Z@e4j                  d.e7e@      ZB e3d/eBj                   d0        e3d1eBj                  dd2        e3d3eBj                   d4eBj                  d5d6        e3d7eBj                  dd8        e3d9eBj                  d5d2        e3d:        e3d;eBj                  d5        e3d<eBj                  d5        e3d=eBj                  d5        e3d>eBj                  d5        e3d?eBj                           e3d@eBj                          yy# e!$ r Y w xY w# e*$ r ejQ                  d       d	ZY ~w xY wc c} w )Au   
AI Advanced Scorer - Analyse GPU avancée pour scoring des cryptomonnaies
Utilise PyTorch avec CUDA (RTX) pour une analyse multi-dimensionnelle approfondie
    N)datetime	timedelta)DictListTupleOptional)	dataclassfield)deque)levelAIAdvancedScorerFcpuCPU      cudai   @u   ✅ GPU RTX activé: u      - Mémoire: .1fz GBz   - CUDA: Tu1   ℹ️  PyTorch non installé - Mode CPU utiliséc                   `   e Zd ZU dZeed<    eej                        Z	eed<   dZ
eed<   dZeed<   dZeed<   dZeed	<   dZeed
<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<    ee      Zee   ed<    ee      Zee   ed<   defdZy)CryptoProfileu3   Profil complet d'une crypto pour le scoring avancésymbol)default_factory	timestamp        technical_scoremomentum_scorevolatility_scorevolume_scorepattern_scoretrend_scorereversal_score
risk_scoreprofit_potentialentry_qualityfinal_scoreHOLDsignal
confidencer   priorityreasonswarningsreturnc                    | j                   | j                  j                         t        | j                  d      t        | j
                  d      t        | j                  d      t        | j                  d      t        | j                  d      t        | j                  d      t        | j                  d      t        | j                  d      dt        | j                  d      t        | j                  d      t        | j                  d      | j                  t        | j                   d      | j"                  | j$                  | j&                  dS )Nr   	technicalmomentum
volatilityvolumepatterntrendreversalriskr   )r   r   scoresr"   r#   r$   r&   r'   r(   r)   r*   )r   r   	isoformatroundr   r   r   r   r   r   r    r!   r"   r#   r$   r&   r'   r(   r)   r*   selfs    5/home/ubuntu/crypto_trading_bot/ai_advanced_scorer.pyto_dictzCryptoProfile.to_dictV   s   kk113"4#7#7;!$"5"5q9#D$9$91= 1 115 !3!3Q7t//3!$"5"5q9dooq1	 !&d&;&;Q ?"4#5#5q9 !1!115kk3||)
 	
    N) __name__
__module____qualname____doc__str__annotations__r
   r   nowr   r   floatr   r   r   r   r   r    r!   r"   r#   r$   r&   r'   r(   intlistr)   r   r*   r   r<    r=   r;   r   r   8   s    =K=Ix= !OU NE!e!L%M5KNEJ "e!M5K FCJHc t4GT#Y45Hd3i5
 
r=   r   c                   l   e Zd ZdZedej                  dedej                  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e	e	e	f   fd       Zedej                  dee	e	e	f   fd	       Zedd
ej                  dej                  dej                  dede	f
d       Zy)TechnicalAnalyzeru#   Analyse technique avancée avec GPUpricesperiodr+   c                     d|dz   z  }t        j                  |       }| d   |d<   t        dt        |             D ]  }|| |   z  d|z
  ||dz
     z  z   ||<    |S )u!   Calcule EMA avec numpy vectorisér   r   r   )np
zeros_likerangelen)rK   rL   alphaemais        r;   calculate_emazTechnicalAnalyzer.calculate_emar   sv     VaZ mmF#Aq#f+& 	@AVAY&!e)s1Q3x)??CF	@
r=   c                 J   t        |       |dz   k  ryt        j                  |       }t        j                  |dkD  |d      }t        j                  |dk  | d      }t        j                  || d       }t        j                  || d       }|dk(  ry||z  }ddd|z   z  z
  S )zCalcule RSIr   g      I@r   Ng      Y@d   )rQ   rN   diffwheremean)rK   rL   deltasgainslossesavg_gainavg_lossrss           r;   calculate_rsizTechnicalAnalyzer.calculate_rsi|   s     v;!#!VQ/&1*vgq1775&?+7766'(+,q= cQVn%%r=   std_devc                     t        |       |k  r| d   | d   | d   fS t        j                  | | d       }t        j                  | | d       }|||z  z   }|||z  z
  }|||fS )zCalcule Bollinger BandsN)rQ   rN   rZ   std)rK   rL   rb   smare   upperlowers          r;   calculate_bollingerz%TechnicalAnalyzer.calculate_bollinger   s     v;":vbz6":55ggffWX&'ffVVGH%&gm#gm#c5  r=   c                     t        |       dk  ryt        j                  | d      }t        j                  | d      }|d   |d   z
  }|dd |dd z
  }t        j                  |      }||z
  }|||fS )zCalcule MACD   )r   r   r      rd   iN)rQ   rJ   rU   rN   rZ   )rK   ema12ema26	macd_linemacd_historysignal_line	histograms          r;   calculate_macdz TechnicalAnalyzer.calculate_macd   s     v; !//;!//;"Ib	)	 RSzE"#J.ggl++	+y00r=   highslowsclosesc           
         t        |       |dz   k  ryt        j                  | dd |dd z
  t        j                  | dd |dd z
        t        j                  |dd |dd z
              }t        j                  || d       S )zCalcule Average True Ranger   r   Nrd   )rQ   rN   maximumabsrZ   )rt   ru   rv   rL   trs        r;   calculate_atrzTechnicalAnalyzer.calculate_atr   s     u:
"ZZ!"IQR FF59vcr{*+FF48fSbk)*
 wwr6'(|$$r=   N)   )          @)r>   r?   r@   rA   staticmethodrN   ndarrayrF   rU   rE   ra   r   ri   rs   r{   rH   r=   r;   rJ   rJ   o   s   -bjj # "**   &bjj &# &u & &$ !BJJ ! !5 ![`afhmotat[u ! ! 1rzz 1eE5%4G.H 1 1$ %RZZ %rzz %2:: %WZ %di % %r=   rJ   c                       e Zd ZdZd Zddee   dee   defdZdde	j                  dee   defdZd	efd
ZdefdZdde	j                  dee   defdZdefdZy)GPUFeatureExtractoru.   Extraction de features avec accélération GPUc                 \    t         rt        j                  t              | _        y d | _        y N)TORCH_AVAILABLEtorchdeviceDEVICEr9   s    r;   __init__zGPUFeatureExtractor.__init__   s    .=ell6*4r=   NrK   volumesr+   c                 &   t        |      dk  r| j                         S t        j                  |t        j                        }t
        r7| j                  r+| j                  j                  dk(  r| j                  ||      S | j                  ||      S )z2Extrait toutes les features avec GPU si disponible2   )dtyper   )
rQ   _get_default_featuresrN   arrayfloat64r   r   type_extract_gpu_extract_cpu)r:   rK   r   	prices_nps       r;   extract_all_featuresz(GPUFeatureExtractor.extract_all_features   ss     v;--//HHV2::6	t{{t{{/?/?6/I$$Y88$$Y88r=   c                    	 t        j                  |t         j                  | j                        }i }dD ]  }t	        |      |k\  st        j
                  || j                        |z  }|j                  d      j                  d      }t        j                  ||dz
  dfd      }t        j                  ||j                  d      j                  d            j                         }	|	d   j                         |d	| <    d
D ]v  }t	        |      |k\  s| j                  ||      }
|
d   j                         |d| <   t	        |
      dk\  sL|
d   |
d   z
  |
d   z  dz  j                         }||d| d<   x dD ]=  }t	        |      |k\  s|d   ||    z
  ||    z  dz  j                         }||d| <   ? |dd |dd z
  |dd z  dz  }t	        |      dk\  r&t        j                  |dd       j                         nd|d<   t	        |      dk\  r&t        j                  |dd       j                         nd|d<   d}t	        |      |k\  r|| d }t        j                  |      j                         }t        j                  |      j                         }|d|z  z   }|d|z  z
  }||d<   ||d<   ||d<   |dkD  r||z
  |z  dz  nd|d<   ||z
  dkD  r|d   |z
  ||z
  z  nd|d<   t        j!                  |      |d <   t        j#                  |      \  }}}||d!<   ||d"<   ||d#<   |j%                  | j'                  |             |t	        |      dk\  rt        j                  |dd t         j                  | j                        }t        j                  |      j                         |d$<   |d$   dkD  r|d   |d$   z  nd|d%<   |d   dkD  r"|d   |d   z
  |d   z  dz  j                         nd|d&<   |S d|d$<   d|d%<   d|d&<   |S # t(        $ r4}t*        j-                  d'|        | j/                  ||      cY d}~S d}~ww xY w)(u   Extraction GPU optimiséer   r   )   	   rl      rk   r   )r   r   r   	replicate)moderd   sma_r   rl   r   rk   ema_   rW   _sloper   r   
   r}   	momentum_Nr   volatility_5r}   volatility_20r   bb_upperbb_midbb_lowerbb_bandwidth      ?bb_positionrsimacdmacd_signalmacd_histogram
volume_smavolume_ratiovolume_trendzErreur GPU, fallback CPU: )r   tensorfloat32r   rQ   ones	unsqueezeFpadconv1dsqueezeitem_gpu_emare   rZ   rJ   ra   rs   update_detect_patterns_gpu	Exceptionloggerwarningr   )r:   rK   r   prices_tensorfeaturesrL   kernel	prices_3dpaddedrf   rS   slopemomreturns	bb_period	bb_pricesr   bb_stdr   r   r   r&   hist
vol_tensores                            r;   r   z GPUFeatureExtractor._extract_gpu   s   Q	6!LLu}}T[[YMH 1 ?v;&("ZZt{{CfLF - 7 7 : D DQ GIUU9vaxm+NF((66+;+;A+>+H+H+KLTTVC03BHtF8_-? * @v;&(--v>C03BHtF8_- 3x1}"%b'CG"3s2w!>!D J J L:?4xv!67@ ) 9v;&()"-vg0FF-Y_X_J``cffllnC58Hy129 %QR(="+==sPRASSVYYGILWYZIZuyy'>'C'C'E`aH^$KNw<[]K]		'#$-(@(E(E(GcdH_% I6{i')9*+6	I.3359-224!AJ.!AJ.'/$%+"'/$SY\]S]Hx,?6+IC+Ocd(^fiq^quv]v6":+@XPXEX*Y|' 0==fEHUO "3!A!A&!ID&$#HV&,H]#)-H%& OOD55mDE "s7|r'9"\\'#$-u}}UYU`U`a
).J)?)D)D)F&S[\hSilmSm72;,9O+Ost(pz{}p~  BC  qCZ^jn-LPZ[]P^,^ad,d+j+j+l  IJ( O	 *+&+,(+,(O 	6NN7s;<$$VW55	6s?   AP CP 9P A P I0P P 	Q )Q	QQrL   c                     d|dz   z  }t        j                  |      }|d   |d<   t        dt        |            D ]  }|||   z  d|z
  ||dz
     z  z   ||<    |S )zCalcule EMA sur GPUr   r   r   )r   rO   rP   rQ   )r:   rK   rL   rR   rS   rT   s         r;   r   zGPUFeatureExtractor._gpu_ema'  sv    VaZ v&Aq#f+& 	@AVAY&!e)s1Q3x)??CF	@
r=   c                    i }t        |      dk  r|S |dd }t        j                  |      j                         |d<   t        j                  |      j                         |d<   |d   |d   z
  |d   z  dz  |d<   t        j
                  t        |      t        j                  | j                        }t        j                  |      }t        j                  |      }t        j                  ||z
  ||z
  z        t        j                  ||z
  d	z        z  }|j                         |d
<   t        |j                               dz  |d<   t        |      d	z  }t        j                  |d|       j                         }	t        j                  ||d       j                         }
t        |	|
z
        |	z  dk  |d<   t        j                  |d|       j                         }t        j                  ||d       j                         }t        ||z
        |z  dk  |d<   |j                  dd      }|dk  |d<   |d   j                         }|d   |z
  |z  dk  |d<   ||d   z
  |z  dk  |d<   |S )u   Détection de patterns sur GPUr}   r   N
local_high	local_lowrW   price_ranger   r   trend_slopetrend_strength{Gz?double_bottom
double_topr   r   r   squeeze_activerd   near_resistancenear_support)rQ   r   maxr   minaranger   r   rZ   sumry   get)r:   rK   patternsrecentxx_meany_meanr   midfirst_half_lowsecond_half_lowfirst_half_highsecond_half_highr   current_prices                  r;   r   z(GPUFeatureExtractor._detect_patterns_gpu0  s`   v;O !&6!2!7!7!9 %		& 1 6 6 8#+L#9H[<Q#QU]^iUj"jmp"p LLVEMM$++NAF#		1v:&6/:;eiiVXYHY>ZZ"'**,%(%6%<!" &kQ6$3<0557))F34L1668 %((H$IN$Z]a$a!))F4CL1668 99VCD\2779!$_7G%G!H?!Z]a!a  ||NA6%1A%5!" r
)'/'='MQ^&^ae&e"#$1H[4I$I]#Z]a#a r=   c                 H   i }dD ]\  }t        |      |k\  st        j                  ||      }|d   |d| <   t        |      dk\  sB|d   |d   z
  |d   z  dz  |d| d<   ^ dD ]-  }t        |      |k\  s|d   ||    z
  ||    z  dz  |d	| <   / t        j                  |      \  }}}||d
<   ||d<   ||d<   |dkD  r||z
  |z  dz  nd|d<   ||z
  dkD  r|d   |z
  ||z
  z  nd|d<   t        j	                  |      |d<   t        j                  |      \  }	}
}|	|d<   |
|d<   ||d<   t        j                  |      |dd z  dz  }t        |      dk\  rt        j                  |dd       nd|d<   t        |      dk\  rt        j                  |dd       nd|d<   |S )zExtraction CPU (fallback)r   rd   r   r   r   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Nr   r   r   r}   r   r   )	rQ   rJ   rU   ri   ra   rs   rN   rX   re   )r:   rK   r   r   rL   rS   r   r   r   r   r&   r   r   s                r;   r   z GPUFeatureExtractor._extract_cpu^  s#    & 	ZF6{f$'55ffE,/G4x)s8q=7:2wR7HCPRG6SVY6YHtF8623	Z % 	hF6{f$28*vvg2NRXZ`Y`Ra1adg1g9VH-.	h
 &7%J%J6%R"&('#'KQTU:Hx$76#AC#G[\ V^aiVimnUn6":#8X=P"Qtw ,99&A /==fEfd"(%)!" ''&/F3BK/#5;>w<1;L266'"#,#7RS =@\R=OBFF734=$9UV!r=   c           	          dddddddddS )u-   Features par défaut si pas assez de donnéesr   r   r   r   )ema_9ema_21
momentum_3
momentum_5r   r   r   r   rH   r9   s    r;   r   z)GPUFeatureExtractor._get_default_features  s"     !1q	
 	
r=   r   )r>   r?   r@   rA   r   r   rE   r   r   rN   r   r   rF   r   r   r   r   rH   r=   r;   r   r      s    8H94; 9e 9X\ 9S62:: S6U S6t S6js ,d ,\'2:: 'U 't 'R
t 
r=   r   c                   `   e Zd ZdZd Z	 	 ddedee   dee   dedef
d	Z	d
e
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
defdZd
e
defdZd
e
dee   defdZd
e
defdZdedefdZd
e
dedefdZd
e
dedefdZded
e
fdZddee   dedee   fdZde
ee
f   de
eef   fdZy) r   u4   Scoring IA avancé avec analyse multi-dimensionnellec           	          t         | _        t               | _        i | _        i | _        ddddddddd| _        t        j                  dt                 t         dk(  rt        j                  dt                y y )	N皙?333333?皙?g?r-   u,   🧠 AIAdvancedScorer initialisé - Device: r   z   GPU: )
r   r   r   feature_extractorprofiles_cachehistorical_performanceweightsr   infoGPU_NAMEr9   s    r;   r   zAIAdvancedScorer.__init__  s}    !4!68:>@# 	
 	B6(KLVKK(8*-. r=   Nr   rK   r   r   r+   c                    t        |      }t        |      dk  r|j                  j                  d       |S | j                  j                  ||      }||d   }| j                  ||      |_        | j                  |      |_	        | j                  |      |_        | j                  |      |_        | j                  |      |_        | j!                  |      |_        | j%                  ||      |_        | j)                  |      |_        | j-                  |      |_        | j1                  ||      |_        | j5                  ||      |_        | j9                  ||       || j:                  |<   |S )u5   Analyse complète d'une crypto et génère son profil)r   r   u$   Données insuffisantes (<50 bougies)rd   )r   rQ   r*   appendr   r   _calculate_technical_scorer   _calculate_momentum_scorer   _calculate_volatility_scorer   _calculate_volume_scorer   _calculate_pattern_scorer   _calculate_trend_scorer   _calculate_reversal_scorer    _calculate_risk_scorer!   _calculate_final_scorer$   _estimate_profit_potentialr"   _calculate_entry_qualityr#   _generate_signalr   )r:   r   rK   r   r   profiler   s          r;   analyze_cryptozAIAdvancedScorer.analyze_crypto  su   
  v.v;##$JKN ))>>vwO "2JM #'"A"A(M"Z "&!?!?!I $(#C#CH#M   $;;HE !% = =h G #99(C "&!?!?&!Q "77A #99'B $(#B#B8W#U  !% = =h P 	gx0 '.F#r=   r   pricec                    d}|j                  d|      }|j                  d|      }|dkD  r||z
  |z  dz  nd}|j                  d|j                  dd            }|j                  dd      }|d	k  r|dkD  r|dkD  r|d
z  }n|dz  }n|dk  r|dz  }n
|dkD  r|dz  }|dk  r|dkD  r|dkD  r
|dkD  r|dz  }|j                  dd      }	|	dk  r|dkD  r|dz  }n&|dz  }n |	dk  r|dkD  r|d
z  }n|dz  }n
|	dkD  r|dz  }|j                  dd      }
|
dk  r!|dkD  r|dkD  r|dz  }n<|dkD  r|dz  }n1|d
z  }n+|
dk  r|dkD  r|d
z  }n|dz  }n|
dkD  r|dz  }n
|
dkD  r|dz  }t        dt        d|            S )uV   Score basé sur EMA, BB, RSI — FIX 01/04: pénaliser le bearish, pas le récompenserr   r   r   r   rW   ema_9_slope	ema_sloper   皙r      r   r         r}   r   r   333333?r   皙?r      (   P   F   r   r   r   )r:   r   r  scoreema9ema21ema_diff
ema9_slopemom3bb_posr   s              r;   r  z+AIAdvancedScorer._calculate_technical_score  s    ||GU+Xu-3819D5LE)C/!\\-k11MN
||L!,
 d?A~$(\QJE^RKE a<HtO
Q4!8RKE mS1C<ax
c\ax
c\RKE ll5"%8axJN
2Xax
2XRKE2XRKE1c#uo&&r=   c                 T   d}|j                  dd      }|j                  dd      }|j                  dd      }|dkD  r|dk  r|dz  }n||cxkD  rdkD  r	n n|dz  }n
|dk  r|d	z  }|d
kD  r|dz  }n
|dkD  r|dz  }d|cxk  rdk  rn n
|dk  r|d	z  }t        dt        d|            S )u'   Score basé sur la vitesse de mouvementr   r   r   r   momentum_10   r  r  r}   r   r   r   r  r   333333ӿrW   r  )r:   r   r   r%  mom5mom10s         r;   r  z*AIAdvancedScorer._calculate_momentum_score(  s    ||L!,||L!,]A. !8qRKED_1_RKED[RKE #:RKEAXQJE $RKE1c#uo&&r=   c                    d}|j                  dd      }|j                  dd      }|j                  dd      }|dk  r|dz  }n |d	k  r|d
z  }n|dk  r|dz  }n
|dkD  r|dz  }||dz  kD  r|dz  }t        dt        d|            S )u-   Score basé sur la volatilité (opportunité)r   r   r   r   r   r   r   r  r   r}      r      r        ?rW   r  )r:   r   r   vol5vol20r   s         r;   r  z,AIAdvancedScorer._calculate_volatility_scoreD  s    ||NA._a0||NA6 !RKEARKEARKEARKE %#+RKE1c#uo&&r=   c                 v   d}|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|d	kD  r|d
z  }n |dkD  r|dz  }n|dkD  r|dz  }n
|dk  r|dz  }|dkD  r|dz  }n
|dkD  r|dz  }|dk  xr |dkD  xr |dkD  }|r|d
z  }t        dt        d|            S )u   Score basé sur le volumer   r   r   r   r   r   r   r   r   r)  r0  r  333333?r   r}   gffffff??rW   r  )r:   r   r   	vol_ratio	vol_trendr&  r%  is_volume_reversals           r;   r  z(AIAdvancedScorer._calculate_volume_score\  s    LL3	LL3	mS1||L!, q=RKE_RKE_RKE_RKE r>RKE^RKE TM O1H 	
 RKE1c#uo&&r=   c                    d}|j                  dd      r|dz  }|j                  dd      r|dz  }|j                  dd      r|dz  }|j                  dd      r|d	z  }|j                  d
d      r|dz  }t        dt        d|            S )u'   Score basé sur les patterns détectésr   r   Fr)  r   r}   r   r   r   r   r  r   rW   r  )r:   r   r   s      r;   r  z)AIAdvancedScorer._calculate_pattern_score  s     <</RKE <<e,RKE <<.RKE <<)51RKE <<(%0RKE1c#uo&&r=   c                     d}|j                  dd      }|j                  dd      }|j                  dd      }|dkD  r|dz  }n
|dk  r|d	z  }|d
kD  r|dz  }n|dkD  r|d	z  }n
|dk  r|dz  }|r
|dk\  r|d	z  }t        dt        d|            S )u   Score basé sur la tendancer   r   r   r  ema_21_sloper   r  g{Gzr   r   皙ɿrW   r  )r:   r   r   r   r$  ema21_slopes         r;   r	  z'AIAdvancedScorer._calculate_trend_score  s    ll=!4\\-3
ll>15 RKE5 RKE RKE!^RKE$RKE ;!+RKE1c#uo&&r=   c                    d}|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }||z
  }	|dkD  r|	|z  d	z  nd}
|j                  d
|j                  dd            }|j                  dd      }|dkD  }|dkD  }|xs |}|dk  r|r|dz  }n|dz  }n|dk  r|r|dz  }n|dz  }|
dk  r|r|r|dz  }n|r|dz  }n|
dk  r|r|dz  }|
dk  xr |
dkD  xr |dkD  xr |dkD  }|r|dz  }d|
cxk  rdk  rn n
|dkD  r|dz  }|dkD  r|dk  r|dz  }n(||kD  r|dkD  r|dz  }nd|cxk  rdk  rn n
|dk  r|dz  }|dk  rJ|rH|dz  }t        |      dk\  r5t        j                  t	        j
                  |dd             }||kD  r|dz  }|j                  dd      }|dkD  r|dz  }n
|dkD  r|dz  }t        dt        d	|            S ) uC   Score de retournement — FIX 01/04: exiger des PREUVES de reversalr   r   r   r   r   r   r   r   rW   r  r  r   r   r)  r         ?r  r   r  r}   r   r  r  r<  r   r*  #   Nrd   r   MbP)r   rQ   rJ   ra   rN   r   r   r   )r:   r   rK   r   r&  r%  r+  r!  r"  r#  ema_diff_pctr$  r   has_positive_momentumhas_ema_turninghas_reversal_evidenceis_crossover_imminentprev_rsi	macd_hists                      r;   r
  z*AIAdvancedScorer._calculate_reversal_score  sy   mS1||L!,||L!,||GQ'Xq)%<16x%'#-\\-k11MN
ll5"% !%q$q. 5 H D=$
d]$
 $#8 A 1 4N 1H	 	 !RKE ,""zA~RKE !8qRKED[TAXRKED34$;RKE 8$v;!#0>>rxxsPR?TUHX~ LL!115	q=RKERKE1c#uo&&r=   c                    d}|j                  dd      }|dkD  r|dz  }n|dkD  r|dz  }n
|dkD  r|d	z  }|j                  d
d      }|dkD  s|dk  r|dz  }n|dkD  s|dk  r|d	z  }|j                  dd      }|d	kD  r|dz  }n
|dkD  r|dz  }|j                  dd      }|dk  r|dz  }n|dk  r|dz  }n
|dk  r|d	z  }t        dt        d|            S )u6   Score de risque (100 = peu risqué, 0 = très risqué)rW   r   r   r   r  r   r}   r0  r   r   r   r  r  r   r   r)     r  r   rd   r  r  )r:   r   r   volr   bb_bwr+  s          r;   r  z&AIAdvancedScorer._calculate_risk_score  s    ll>1-7RKE1WRKE3YRKE ll5"%8sRxRKE2XrRKE ^Q/2:RKEQYRKE ||L!,"9RKEBYRKED[RKE1c#uo&&r=   r  c                    |j                   | j                  d   z  |j                  | j                  d   z  z   |j                  | j                  d   z  z   |j                  | j                  d   z  z   |j
                  | j                  d   z  z   |j                  | j                  d   z  z   |j                  | j                  d   z  z   |j                  | j                  d   z  z   }|S )	u    Calcule le score final pondérér.   r/   r0   r1   r2   r3   r4   r5   )	r   r   r   r   r   r   r   r    r!   )r:   r  r   s      r;   r  z'AIAdvancedScorer._calculate_final_score8  s     ##dll;&??""T\\*%==>$$t||L'AAB   4<<#99: !!DLL$;;	<
 $,,w"778 ""T\\*%==> f!556 	 r=   c                 *   |j                  dd      }|dk  rd}n|dk  rd}n|dk  rd}n
|dk  rd	}nd
}|j                  dd      s|j                  dd      dk  r|dz  }|j                  dkD  r|dz  }|j                  dk  r|dz  }t        |d      S )z"Estime le potentiel de profit en %r   r   r   g      @r        @g?r~   r0  g      ?r   Fr   r   r   r5  r  r4  r   ffffff?r   )r   r    r!   r8   )r:   r   r  r&  	potentials        r;   r  z+AIAdvancedScorer._estimate_profit_potentialF  s     mS1 C<Ic\Ic\Ic\II <<(%0HLLQR4SVW4WI !!B&I "IY""r=   c                 0   d}|j                  dd      }|j                  dd      |j                  dd      z
  }|j                  dd      dkD  r||j                  dd      z  dz  nd}|d	k  r|d
z  }n|dk  r|dz  }n
|dkD  r|dz  }|dk  r|dz  }n|dk  r|dz  }n
|dkD  r|dz  }|j                  dkD  r|dz  }n|j                  dkD  r|dz  }|j                  dd      }d|cxk  rdk  r	n n|dz  }n
|dk  r|dz  }t        dt        d|            S )u-   Évalue la qualité du point d'entrée actuelr   r   r   r   r   r   r   rW   r   r)  r  r  rQ  r}   r  r   r  <   r   r<  r  )r   r    r   r   )r:   r   r  qualityr&  r#  rB  r%  s           r;   r  z)AIAdvancedScorer._calculate_entry_qualityf  sL   mS1<<+hll8Q.GGEM\\RZ\]E^abEbx(,,x";;cAhi C<rMGc\rMGc\rMG $rMGArMGCrMG !!B&rMG##b(rMG ||L!,$rMGD[rMG1c#w'((r=   c                    |j                  dd      }|j                  dd      }|dkD  r||z
  |z  dz  nd}|j                  dd      }|j                  dd      }|j                  d|j                  d	d            }|j                  d
d      }	|dk  xr |dkD  xr |dkD  xr |dkD  xr |	dk  }
|j                  dk\  |j                  dk\  |dk  |j                  dk\  g}|j                  dk\  |j                  dk\  |dk  |j
                  dk\  g}|
rp|j                  dk\  ra|j                  dk\  rRd|_        t        d|j                  dz         |_        d|_	        |j                  j                  d|dd|dd       n|dk\  rv|dk  r2d|_        d|_        d|_	        |j                  j                  d        ncd!|_        |j                  d"z  |_        d#|_	        |j                  j                  d$       n$t        |      rM|dk  rHd|_        t        d%|j                  dz         |_        d&|_	        |j                  j                  d'       nt        |      r@|dk  r;d|_        |j                  |_        d(|_	        |j                  j                  d)       nt        |      d*k\  rC|dk  r>d!|_        |j                  d+z  |_        d*|_	        |j                  j                  d,       n0d-|_        d|_        d.|_	        |j                  j                  d/       |j                  dk\  r*|j                  j                  d0|j                  d1d2       |d3k  r |j                  j                  d4|d5d2       |j
                  d6k\  r*|j                  j                  d7|j
                  d8d       |j                  dk\  r|j                  j                  d9       |j                  dk  r*|j                  j                  d:|j                  d1d2       |j                  d;d      d(kD  r|j                  j                  d<       |j                  d=d      d>k  r|j                  j                  d?       y@y@)Au'   Génère le signal final et les raisonsr   r   r   rW   r   r   r   r  r  r   r   r  rA  r  A   rT  gr  K   r  r~   7   ACHATZ   r  u'   🔥 CROISEMENT EMA IMMINENT (EMA_diff=z.2fz%, Mom3=%)NO_BUYr   u;   🚫 EMA9 > EMA21 + Momentum négatif = Correction en coursPOSSIBLErQ  r.  u3   ⏳ EMA9 > EMA21 mais momentum positif = Surveiller_   r   u/   🔥 Configuration optimale au creux détectéer   u(   ✅ Conditions d'achat au creux rempliesr   r  u%   ⚡ Opportunité potentielle au creuxr%   r   u"   ⏳ Attendre conditions favorablesu$   🔄 Retournement détecté (score: .0f)r?  u   🛡️ Zone de rebond BB (z.1%rP  u   💰 Fort potentiel (+r   u   📈 Momentum favorableu   ⚠️ Risque élevé (score: r   u   ⚠️ Volatilité élevéer   rd   u   ⚠️ Momentum très négatifN)r   r$   r#   r!   r    r"   r&   r   r'   r(   r)   r  allr   r   r*   )r:   r  r   r!  r"  rB  r&  r%  r  r   rF  buy_conditionsbuy_optimals                r;   r  z!AIAdvancedScorer._generate_signal  sn    ||GQ'Xq)7<qyu-3amS1||L!,LL[!0LM	ll5"% 1 4M 6M "H 	 2%!!R'5 "$	
 2%""b(SL$$+	
 !W%8%8B%>7CUCUY[C[$GN!$R)<)<r)A!BG GOO""%L\Z]L^^fgklofppr#st Qax!)%'"#% &&'de!+%,%8%83%>"#$ &&'\] ,"2$GN!$R)<)<r)A!BG GOO""#TU  \A%5$GN!(!4!4G GOO""#MN  A%,*:'GN!(!4!4s!:G GOO""#JK $GN!#G GOO""#GH !!R'OO""%I'J`J`adIeef#ghD=OO""%@A#NO##s*OO""%;G<T<TUX;YY[#\]!!R'OO""#<= "##&DWEWEWX[D\\]$^_<<*Q.##$AB<<a(2-##$DE .r=   profileslimitc                 n    |D cg c]  }|j                   dv s| }}t        |d       }|d| S c c}w )u;   Retourne les meilleures opportunités triées par priorité)rZ  r^  c                 L    | j                   | j                   | j                   fS r   )r(   r$   r"   )ps    r;   <lambda>z8AIAdvancedScorer.get_top_opportunities.<locals>.<lambda>  s     1::~8J8J7JK r=   )keyN)r&   sorted)r:   re  rf  ri  buyablesorted_profiless         r;   get_top_opportunitiesz&AIAdvancedScorer.get_top_opportunities  sJ     'L!((6K*K1LL !K

 v&& Ms   22cryptos_datac                     i }|j                         D ]P  \  }}|j                  dg       }|j                  dg       }t        |      dk\  s9| j                  |||      }|||<   R |S )u9   Analyse un batch de cryptos en parallèle (GPU optimisé)rK   r   r   )itemsr   rQ   r  )r:   rp  resultsr   datarK   r   r  s           r;   batch_analyzezAIAdvancedScorer.batch_analyze  ss    (..0 	*LFDXXh+Fhhy"-G6{b --ffgF")	* r=   )NN)r   )r>   r?   r@   rA   r   rB   r   rE   r   r  r   r  r  r  r  r  r	  r
  r  r  r  r  r  rF   ro  ru  rH   r=   r;   r   r     s   >/. /3.28S 8$u+ 8 $U8&+87D8tB'4 B' B'% B'H'$ '5 '8'D 'U '0%' %' %'N' '% '4't ' '8W'$ W'U W'PU W'r$'d $'u $'Lm  #4 #- #TY #@%) %) %)RW %)NnF nF nF`'d=.A '# 'W[\iWj '$sDy/ d3CU>V r=   r+   c                  .    t         
t               a t         S )u-   Retourne l'instance globale du scorer avancé)_advanced_scorerr   rH   r=   r;   get_advanced_scorerrx    s     +-r=   __main__z<============================================================z  TEST AI ADVANCED SCORER*   rW   c   r   rd   r   gףp=
?r   gx&1?i@B i@KL TESTUSDTu   
📊 Analyse de :z   Score Final: z/100z   Signal: z (confiance: r`  r\  z   Potentiel: +%u      Qualité entrée: u   
   Scores détaillés:z   - Technique: z   - Momentum: z   - Retournement: z   - Risque: z
   Raisons: z   Warnings: )OrA   numpyrN   r   r   typingr   r   r   r   jsonosloggingdataclassesr	   r
   collectionsr   basicConfigINFO	getLoggerr   r   r   r  r   nnr   torch.nntorch.nn.functional
functionalset_num_threadsset_num_interop_threadsRuntimeErrorr   is_availableget_device_nameget_device_propertiestotal_memorygpu_memr   versionImportErrorr   rJ   r   r   rw  rx  r>   randomprintscorerseed
base_pricerK   rP   _normalchanger  rT   rQ   uniformr   r  r  r   r$   r&   r'   r"   r#   r   r   r    r!   r)   r*   )r  s   0r;   <module>r     s  
  ( . .  	  (    ',, '			-	. 	 		##E!%%%a( zz ::--a0**2215BBWL+H:67ogc]#67k%--"4"4!567 3
 3
 3
lM% M%`O
 O
dF
 F
T  -  z	(O	
%&	(O "F IINN2J\F2Y 5!!!S)fRjAs
N345
 2Y *fRj5()*1X *fRj5()* :?s6{9KLA~v~~gw/LG ##J@G	w~~.a
01	W005T
:;	K'}W5G5G4LB
OP	OG44S9
;<	!'"7"7!<D
AB	$&	W44S9
:;	OG2237
89	 6 6s;
<=	M',,S1
23	N7??+
,-	M'**+
,-O A     
KKCDOT  Ms=   1%O N6 )B6O ;O!6N?;O >N??O OO