o
    ÑyÚh0  ã                   @   s”   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 e¡ZG dd„ dƒZdd	„ Zed
krHejejd� eƒ  dS dS )u�   
SystÃ¨me dynamique de classification des marchÃ©s Hyperliquid
DÃ©tecte automatiquement la qualitÃ© des tokens selon des critÃ¨res objectifs
é    N)ÚdatetimeÚ	timedelta)ÚDictÚListÚSetÚTuple)ÚHyperliquidClientc                   @   s´   e Zd ZdZddefdd„Zdd„ Zdefd	d
„Zdefdd„Z	de
defdd„Zdedefdd„Zdde
dede
fdd„Zdee
e
f fdd„Zdeee
 ee
 f fdd„ZdS )ÚDynamicMarketClassifieruP   
    Classifie automatiquement les tokens selon leur qualitÃ© et mÃ©triques
    é   Úcache_duration_hoursc                 C   sZ   |d | _ d| _d| _dddddd	œd
ddddœdœ| _h d£| _h d£| _h d£| _dS )ue   
        Args:
            cache_duration_hours: DurÃ©e de cache pour Ã©viter les re-calculs
        i  z market_classification_cache.jsonNi€–˜ éÈ   im  gš™™™™™é?T)Úmin_volume_24h_usdÚmin_market_cap_rankÚmin_age_daysÚmin_liquidity_scoreÚknown_quality_tokensi@B iè  éZ   g      à?)r   r   r   r   )ÚhighÚmedium>$   ÚOPÚADAÚARBÚBNBÚBTCÚCRVÚDOTÚENSÚEOSÚETHÚFILÚFTMÚGRTÚICPÚLDOÚMKRÚRPLÚSNXÚSOLÚTRXÚUNIÚXRPÚXTZÚYFIÚAAVEÚALGOÚATOMÚAVAXÚCOMPÚDOGEÚFLOWÚLINKÚNEARÚMATICÚSUSHIÚRENDER>   ÚAPTÚBCHÚETCÚINJÚJUPÚLTCÚSEIÚSTXÚSUIÚTAOÚTIAÚVETÚWLDÚHBARÚTHETAÚPENDLE>   ÚMEWÚWIFÚBOMEÚBONKr2   ÚGOATÚMEMEÚPEPEÚPNUTÚSHIBÚBRETTÚFLOKIÚTURBOÚkBONKÚkPEPEÚkSHIBÚPOPCATÚkFLOKIÚMOODENGÚCHILLGUYÚFARTCOIN)Úcache_durationÚ
cache_fileÚclientÚquality_thresholdsÚknown_high_qualityÚknown_medium_qualityÚknown_shitcoins)Úselfr   © re   úD/var/www/html/HyperOracle/crypto_trader/dynamic_market_classifier.pyÚ__init__   s$   
ûüø

z DynamicMarketClassifier.__init__c              
   C   sZ   | j s+ztƒ | _ t d¡ W dS  ty* } zt d|› �¡ W Y d}~dS d}~ww dS )u/   Initialise le client Hyperliquid si nÃ©cessaireu2   Client Hyperliquid initialisÃ© pour classificationzErreur init client: N)r_   r   ÚloggerÚinfoÚ	ExceptionÚerror)rd   Úere   re   rf   Úinitialize_clientE   s   €ÿüz)DynamicMarketClassifier.initialize_clientÚreturnc              
   C   s®   zBt | jdƒ�}t |¡}W d  ƒ n1 sw   Y  t | dd¡¡}t ¡ | t| j	d�k rAt
 dt ¡ | › d�¡ |W S W n ttjtfyO   Y nw t
 d¡ i S )	z!Charge le cache de classificationÚrNÚ	timestampz
2000-01-01)Úsecondsz%Cache de classification valide (age: ú)u+   Cache de classification expirÃ© ou invalide)Úopenr^   ÚjsonÚloadr   ÚfromisoformatÚgetÚnowr   r]   rh   ri   ÚFileNotFoundErrorÚJSONDecodeErrorÚKeyError)rd   ÚfÚcacheÚ
cache_timere   re   rf   Ú
load_cacheN   s   ÿþÿ
z"DynamicMarketClassifier.load_cacheÚclassificationc              
   C   s¨   z8t  ¡  ¡ |t|ƒdœ}t| jdƒ�}tj||dd� W d  ƒ n1 s&w   Y  t 	dt|ƒ› d�¡ W dS  t
yS } zt d|› �¡ W Y d}~dS d}~ww )	z%Sauvegarde le cache de classification)rp   r€   Úupdate_countÚwé   )ÚindentNu   Cache sauvegardÃ©: u    tokens classifiÃ©szErreur sauvegarde cache: )r   rx   Ú	isoformatÚlenrs   r^   rt   Údumprh   ri   rj   rk   )rd   r€   Ú
cache_datar|   rl   re   re   rf   Ú
save_cache`   s   
ýÿ€ÿz"DynamicMarketClassifier.save_cacheÚsymbolc              
   C   sø   | j s|  ¡  zP| j j ¡ }| j j ¡ }| dg ¡}|D ]9}| d¡|krU|t| di ¡ dd¡ƒ||v r=t| |d¡ƒndt| dd¡ƒ| dd	¡| d
d¡dœ  W S qW n tyt } zt	 
d|› d|› �¡ W Y d}~nd}~ww |ddddœS )u–   
        RÃ©cupÃ¨re les mÃ©triques d'un marchÃ© depuis Hyperliquid

        Returns:
            Dict avec volume_24h, prix, liquiditÃ©, etc.
        ÚuniverseÚnameÚ	prevDayPxÚvolumer   ÚmaxLeverageé   ÚonlyIsolatedFÚgenesis)rŠ   Úvolume_24h_usdÚ	price_usdÚmax_leverageÚonly_isolatedÚlisting_timeu   Erreur mÃ©triques ú: N)rŠ   r“   r”   r•   )r_   rm   ri   Úall_midsÚmetarw   ÚfloatÚintrj   rh   rk   )rd   rŠ   Ústatsrš   r‹   Ú
token_inforl   re   re   rf   Úget_market_metricsq   s,   

úÿÿ"€ÿz*DynamicMarketClassifier.get_market_metricsÚmetricsc                 C   sZ   |  dd¡}|  dd¡}|dkrtd|d d ƒ}nd}td|d ƒ}|d	 |d  }|S )
u�   
        Calcule un score de liquiditÃ© basÃ© sur volume, spread, depth

        Returns:
            Score entre 0 et 1
        r“   r   r•   r�   g      ð?i€ðúg333333Ó?é2   gffffffæ?)rw   Úmin)rd   r    Ú
volume_24hr•   Úvolume_scoreÚleverage_scoreÚliquidity_scorere   re   rf   Úcalculate_liquidity_score“   s   z1DynamicMarketClassifier.calculate_liquidity_scoreNc           	      C   sÒ   |  dd¡  dd¡ ¡ }|| jv rdS || jv rdS || jv r!dS |s(|  |¡}| dd¡}|  |¡}| d	d
¡}| jd }| jd }||d krU||d krU|dkrUdS ||d krg||d krg|dkrgdS dS )ut   
        Classifie un token selon sa qualitÃ©

        Returns:
            'high', 'medium', ou 'shitcoin'
        ÚUSDTÚ ú-PERPÚshitcoinr   r   r“   r   r•   r�   r   r   é   é
   )	ÚreplaceÚupperrc   ra   rb   rŸ   rw   r§   r`   )	rd   rŠ   r    Úclean_symbolr£   r¦   r•   Úhigh_criteriaÚmedium_criteriare   re   rf   Úclassify_token«   s.   






z&DynamicMarketClassifier.classify_tokenc                    sœ  t  d¡ | js|  ¡  i }zƒ| jj ¡ }| dg ¡}t  dt|ƒ› d�¡ t|ƒD ]e\}}| dd¡}|s7q*|dkrT|d dkrTt 	d	¡ t  d
|› dt|ƒ› d�¡ |t
| di ¡ dd¡ƒt| dd	¡ƒ| dd¡dœ}|  ||¡‰ ˆ ||< t  |› dˆ › d|d d›d|d › d�¡ q*W n ty« } zt  d|› �¡ W Y d}~nd}~ww i }	dD ]‰ t‡ fdd„| ¡ D ƒƒ}
|
|	ˆ < q°t  d|	› �¡ |S ) u|   
        Scanne tous les marchÃ©s Hyperliquid et les classifie

        Returns:
            Dict {symbol: quality}
        u4   DÃ©but du scan dynamique des marchÃ©s Hyperliquid...r‹   zAnalyse de u    marchÃ©s...rŒ   r©   r   r­   r�   zProgression: ú/u    marchÃ©s analysÃ©sr�   rŽ   r�   r‘   F)rŠ   r“   r•   r–   r˜   z (vol: $r“   z,.0fz, lev: r•   zx)u   Erreur scan marchÃ©s: N)r   r   r«   c                 3   s   � | ]	}|ˆ krd V  qdS )r�   Nre   )Ú.0Úq©Úqualityre   rf   Ú	<genexpr>
  s   € z;DynamicMarketClassifier.scan_all_markets.<locals>.<genexpr>u   Classification terminÃ©e: )rh   ri   r_   rm   rš   rw   r†   Ú	enumerateÚtimeÚsleepr›   rœ   r³   Údebugrj   rk   ÚsumÚvalues)rd   r€   rš   r‹   Úirž   rŠ   r    rl   ÚsummaryÚcountre   r·   rf   Úscan_all_markets×   sD   


ü.ë€ÿ
z(DynamicMarketClassifier.scan_all_marketsc                 C   s´   |   ¡ }|rd|v r|d }n	|  ¡ }|  |¡ tƒ }tƒ }| ¡ D ]#\}}| dd¡ dd¡ ¡ }|dkr<| |¡ q"|dkrE| |¡ q"t 	dt
|ƒ› dt
|ƒ› d	�¡ ||fS )
uš   
        RÃ©cupÃ¨re une classification mise Ã  jour des marchÃ©s

        Returns:
            Tuple (high_quality_tokens, medium_quality_tokens)
        r€   r¨   r©   rª   r   r   zClassification: z high, z medium)r   rÃ   r‰   ÚsetÚitemsr®   r¯   Úaddrh   ri   r†   )rd   r}   r€   Úhigh_qualityÚmedium_qualityrŠ   r¸   r°   re   re   rf   Úget_updated_classification  s    


€ z2DynamicMarketClassifier.get_updated_classification)r
   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rœ   rg   rm   r   r   r‰   ÚstrrŸ   r›   r§   r³   rÃ   r   r   rÉ   re   re   re   rf   r	      s    0	","9r	   c                  C   s¾   t ƒ } |  ¡ \}}tt|ƒƒ}tt|ƒƒ}tdƒ tdt|ƒ› d�ƒ tdt|ƒ› d�ƒ tt|ƒdkr>d|dd… › d�nd|› �ƒ tt|ƒdkrUd	|dd… › d�nd
|› �ƒ ||fS )uH   Met Ã  jour trading_config.py avec les marchÃ©s dÃ©tectÃ©s dynamiquementu'   ðŸ“Š MARCHÃ‰S DÃ‰TECTÃ‰S DYNAMIQUEMENT:u   âœ… Haute qualitÃ©: z tokensu   âš¡ QualitÃ© moyenne: r­   u   
Haute qualitÃ©: Nz...u   QualitÃ© moyenne: u   
QualitÃ© moyenne: )r	   rÉ   ÚsortedÚlistÚprintr†   )Ú
classifierrÇ   rÈ   Ú	high_listÚmedium_listre   re   rf   Ú*update_trading_config_with_dynamic_markets.  s   ..rÕ   Ú__main__)Úlevel)rÍ   rt   Úloggingr»   r   r   Útypingr   r   r   r   Úhyperliquid_clientr   Ú	getLoggerrÊ   rh   r	   rÕ   ÚbasicConfigÚINFOre   re   re   rf   Ú<module>   s    
   
þ