
    i)                     x    d Z ddlZddlmZmZmZmZ ddlZ ej                  d      Z
 G d d      ZdadefdZy)u~   
Volume Profile Analyzer - Analyse avancée des volumes
Détecte accumulation, distribution, breakouts et zones de liquidité
    N)DictListOptionalTupleVolumeProfileAnalyzerc                      e Zd ZdZd Zdedee   dee   defdZ	de
j                  de
j                  defdZde
j                  de
j                  defd	Zde
j                  de
j                  dee   fd
Zde
j                  defdZde
j                  de
j                  de
j                  fdZdedeeef   fdZy)r   u%   Analyseur avancé de profil de volumec                 <    i | _         t        j                  d       y )Nu'   ✅ Volume Profile Analyzer initialisé)volume_historyloggerinfo)selfs    ./volume_profile_analyzer.py__init__zVolumeProfileAnalyzer.__init__   s     =>    symbolpricesvolumesreturnc                 R   |rt        |      dk  rdddS 	 t        j                  |dd       }t        j                  |dd       }t        j                  |dd       }t        j                  |      }|d   }||t        j                  d	      d
| j
                  |<   d||||dkD  r||z  nddg d}	||dz  kD  rB|	d   j                  d       |	dxx   dz  cc<   t        j                  d| d||z  dd       n)||dz  kD  r!|	d   j                  d       |	dxx   dz  cc<   | j                  ||      }
|
dkD  rB|
|	d<   |	d   j                  d       |	dxx   |
z  cc<   t        j                  d| d|
 d       | j                  ||      }|dkD  rB||	d<   |	d   j                  d        |	dxx   |z  cc<   t        j                  d!| d"| d       | j                  ||      }||	d#<   | j                  |      }||	d$<   |d%k(  r|	dxx   d&z  cc<   n|d'k(  r|	dxx   d&z  cc<   | j                  ||      }||	d(<   |d   |d)   kD  rd*nd+|	d,<   |	d,   d*k(  r|	dxx   d-z  cc<   |	S # t        $ r3}t        j                  d.| d/|        dt!        |      dcY d}~S d}~ww xY w)0u   
        Analyse complète du profil de volume
        
        Returns:
            Dict avec détection accumulation/distribution, breakouts, anomalies
           Finsufficient_data)successreasoniNnow)avg_20avg_50	timestampTr      )r   current_volumeavg_volume_20avg_volume_50volume_ratioscore_bonussignals   r&   BREAKOUT_VOLUMEr%      u   🔥 u   : BREAKOUT VOLUME détecté (×.1f)   HIGH_VOLUME   accumulation_scoreACCUMULATIONu   💎 u!   : ACCUMULATION détectée (score=distribution_scoreDISTRIBUTIONu   ⚠️ u!   : DISTRIBUTION détectée (score=volume_clustersvolume_trend
INCREASING   
DECREASINGobvBULLISHBEARISH	obv_trend
   zErreur analyse volume profile z: )lennparraymean
datetime64r
   appendr   debug_detect_accumulation_detect_distribution_find_volume_clusters_analyze_volume_trend_calculate_obv	Exceptionerrorstr)r   r   r   r   volumes_arrayprices_arrayr"   r#   r!   resultr/   r1   r3   r4   r8   es                   r   analyze_volume_profilez,VolumeProfileAnalyzer.analyze_volume_profile   s-    #g,+$0CDDL	8HHWST]3M88F34L1L GGM#$$78MGGM2M*2.N (']]51+D'  "0!.!.BORSBS >YZ F  11y!(():;}%+%uVH,KN[hLhilKmmnop-!"33y!((7}%+% "&!:!:<!W!A%/A+,y!((8}%);;%uVH,MN`Maabcd "&!:!:<!W!A%/A+,y!((8}%);;%wvh.OPbOccdef #88}UO(7F$%  55mDL%1F>"|+}%*%-}%*% %%lMBCF5M/22wS/A)yF;k"i/}%+%M 	8LL9&A3GH$A77	8s   II* *	J&3(J!J&!J&c                 b   t        |      dk  st        |      dk  ryt        j                  |dd       }t        j                  |dd       }t        j                  |dd       t        j                  |dd       z  }|dkD  r||z  nd}|dkD  r |dk  rt	        dt        |dz
  d	z              S y)
u   
        Détecte une phase d'accumulation (volume élevé + prix stable)
        
        Returns:
            Score 0-20 selon intensité de l'accumulation
        r   r   r9   Nr   r    ?gQ?   )r>   r?   rA   stdminint)r   r   r   recent_volumeolder_volumeprice_volatilityvolume_increases          r   rE   z*VolumeProfileAnalyzer._detect_accumulationl   s     v;s7|b0 .wwws3/0 66&,/"''&,2GG ;G:J-,6PQS %5%=r3! 3r9:;;r   c                    t        |      dk  st        |      dk  ryt        j                  |dd       }t        j                  |dd       }|d   |d   z
  |d   z  }||dz  kD  r&|dk  r!t        d	t	        t        |      d
z              S y)u   
        Détecte une phase de distribution (volume élevé + prix en baisse)
        
        Returns:
            Score 0-20 selon intensité de la distribution
        r=   r   r9   Nr   r   rS   g{Gzr   i  )r>   r?   rA   rV   rW   abs)r   r   r   rX   
avg_volumeprice_changes         r   rF   z*VolumeProfileAnalyzer._detect_distribution   s     v;s7|b0.WWWST]+
 r
VC[0F3K? :++u0Dr3s<036788r   c           	         t        |      dk  rg S t        j                  |      }t        j                  |      }d}t        j                  |||      }g }t        t        |      dz
        D ]b  }|||   k\  |||dz      k  z  }	t        j                  ||	         }
|
dkD  s5|j                  ||   ||dz      z   dz  |
||   ||dz      d       d |j                  d d	       |d
d S )u   
        Identifie les zones de prix avec volume important (support/résistance)
        
        Returns:
            Liste de clusters {price_level, volume_total, type}
        r   r=   r    r   r,   )price_levelvolume_total	price_min	price_maxc                     | d   S )Nrb    )xs    r   <lambda>z=VolumeProfileAnalyzer._find_volume_clusters.<locals>.<lambda>   s    An$5 r   T)keyreverseNr6   )	r>   r?   rV   maxlinspacerangesumrC   sort)r   r   r   rc   rd   n_binsbinsclustersimaskvolume_in_bins              r   rG   z+VolumeProfileAnalyzer._find_volume_clusters   s    v;I FF6N	FF6N	{{9i8s4y1}% 	Ad1g%&4!9*<=DFF74=1Mq $(Gd1Q3i$71#<$1!%a!%ac	! 	 	5tD|r   c                     t        |      dk  ryt        j                  |dd       }t        j                  |dd       }|dkD  r||z
  |z  nd}|dkD  ry|d	k  ry
y)z
        Analyse la tendance du volume (hausse, baisse, stable)
        
        Returns:
            'INCREASING', 'DECREASING', 'STABLE'
        r   STABLEr9   Nr   r   g333333?r5   g333333ÿr7   )r>   r?   rA   )r   r   
recent_avg	older_avgchanges        r   rH   z+VolumeProfileAnalyzer._analyze_volume_trend   sj     w<"WWWST]+
GGGC,-	9BQ*y(I5AD=e^r   c                    t        j                  t        |            }|d   |d<   t        dt        |            D ]M  }||   ||dz
     kD  r||dz
     ||   z   ||<   #||   ||dz
     k  r||dz
     ||   z
  ||<   C||dz
     ||<   O |S )z
        Calcule l'On-Balance Volume (OBV)
        Indicateur cumulatif : +volume si prix monte, -volume si prix baisse
        r   r    )r?   zerosr>   rm   )r   r   r   r8   rs   s        r   rI   z$VolumeProfileAnalyzer._calculate_obv   s    
 hhs6{#Aq#f+& 	"Aay6!A#;&QqSGAJ.AVAaC[(QqSGAJ.AQqSA	" 
r   volume_resultc                    |j                  d      syd}g }|j                  dd      }|dkD  r|dz  }|j                  d|d	d
       n
|dkD  r|dz  }d|j                  dg       v r|dz  }|j                  d       d|j                  dg       v r|dz  }|j                  d       |j                  d      dk(  r|dz  }|j                  d       t        dt        d|            }|rdj	                  |      nd}||fS )u   
        Évalue la qualité du signal basé sur le volume
        
        Returns:
            (score 0-100, explication)
        r   )2   u   Données volume insuffisantesr   r$   r    r,   r   u   Volume élevé (×r*   r+   g      ?r=   r0   r&   r.   zPhase d'accumulationr2   u   Phase de distribution (⚠️)r<   r:   zOBV haussierr   d   z | zVolume normal)getrC   rk   rV   join)r   r}   scorereasonsr$   explanations         r   get_volume_quality_scorez.VolumeProfileAnalyzer.get_volume_quality_score   s!      +6 %((;!RKENN/S/ACDCRKE ]..y"==RKENN12 ]..y"==RKENN;< [)Y6RKENN>*As3'-4ejj)/k!!r   N)__name__
__module____qualname____doc__r   rL   r   floatr   rQ   r?   ndarrayrE   rF   rG   rH   rI   r   r   rf   r   r   r   r      s   /?V8S V8$u+ V8PTUZP[ V8`d V8p2:: 

 u 22:: 

 u ,!BJJ ! !PTUYPZ !FRZZ C ,RZZ "**  $'"d '"uUCZ?P '"r   r   c                  .    t         
t               a t         S )z4Retourne l'instance globale de l'analyseur de volume)_volume_analyzerr   rf   r   r   get_volume_analyzerr     s     02r   )r   numpyr?   typingr   r   r   r   logging	getLoggerr   r   r   r   rf   r   r   <module>r      sM   
  . . 			2	3@" @"H  2 r   