o
    A^ïhŒ¦  ã                   @   sð   d 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 ddlZddlZddlZddlZej ej ej e¡¡¡Zej e¡ ddlmZ ddlmZ ddlmZ eG d	d
„ d
ƒƒZG dd„ dƒZG dd„ dƒZddd„Z dS )u’   
SystÃ¨me de Signaux Pragmatique pour Trading SimplifiÃ©
GÃ©nÃ¨re des signaux de trading basÃ©s sur des indicateurs techniques simples et fiables
é    N)ÚdatetimeÚ	timedelta)ÚDictÚListÚOptionalÚTuple)Ú	dataclass)ÚBinanceDataProvider©Úget_max_leverage)ÚMarketRegimeDetectorc                   @   sv   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	< d
Z	e
ed< d
Zeed< d
Zeed< d
S )ÚTradingSignalz Structure d'un signal de tradingÚsymbolÚsideÚstrengthÚcurrent_priceÚleverageÚquality_scoreÚreasonÚ	timestampNÚ
indicatorsÚtarget_priceÚtarget_pnl_percent)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__ÚfloatÚintr   r   r   r   r   © r!   r!   úpragmatic_signals.pyr      s   
 r   c                   @   s.   e Zd ZdZdd„ Zdefdd„Zdd„ Zd	S )
ÚMarketSentimentAnalyzeru?   Analyse le sentiment global du marchÃ© pour ajuster les signauxc                 C   s,   d| _ d| _d| _d| _d| _g d¢| _d S )Ni,  é  r   ç        )ÚbitcoinÚethereumÚsolanaÚbinancecoin)Úcache_durationÚbackoff_durationÚlast_updateÚrate_limited_untilÚmarket_sentimentÚmajor_coins©Úselfr!   r!   r"   Ú__init__+   s   z MarketSentimentAnalyzer.__init__Úreturnc                 C   s<   t   ¡ }|| jk r| jS || j | jkr|  ¡  || _| jS )uK   Retourne le sentiment du marchÃ© (-1 Ã  +1) avec backoff automatique si 429)Útimer-   r.   r,   r*   Ú_update_sentiment)r1   Únowr!   r!   r"   Úget_market_sentiment3   s   
z,MarketSentimentAnalyzer.get_market_sentimentc           	   
      s"  zsd}t j|dd�}|jdkrf| ¡ }ddddd	œ}g }| ¡ D ]‰ t‡ fd
d„|D ƒdƒ}|r=d|v r=| t|d ƒ¡ q |r`t 	|¡}t 
|d dd¡| _td| jd›d|d›d�ƒ W dS d| _W dS td|j› �ƒ d| _W dS  ty� } ztd|› �ƒ d| _W Y d}~dS d}~ww )uS   Met Ã  jour le sentiment basÃ© sur les variations 24h des majors via Binance tickerz*https://api.binance.com/api/v3/ticker/24hré
   )ÚtimeoutéÈ   r&   r'   r(   r)   )ÚBTCUSDTÚETHUSDTÚSOLUSDTÚBNBUSDTc                 3   s    � | ]}|d  ˆ kr|V  qdS )r   Nr!   )Ú.0Út©r   r!   r"   Ú	<genexpr>W   s   € z<MarketSentimentAnalyzer._update_sentiment.<locals>.<genexpr>NÚpriceChangePercentg      $@g      ð¿ç      ð?u   ðŸ“Š Market sentiment: ú.3fz (avg 24h: ú.2fz%)r%   u"   âš  Erreur sentiment Binance API: u   âš  Erreur calcul sentiment: )ÚrequestsÚgetÚstatus_codeÚjsonÚkeysÚnextÚappendr   ÚnpÚmeanÚclipr.   ÚprintÚ	Exception)	r1   ÚurlÚresponseÚdataÚmajor_symbolsÚchangesÚtickerÚ
avg_changeÚer!   rA   r"   r5   A   s8   
ü€
"€þz)MarketSentimentAnalyzer._update_sentimentN)r   r   r   r   r2   r   r7   r5   r!   r!   r!   r"   r#   (   s
    r#   c                   @   s  e Zd ZdZdGdd„Zdedee fdd„Zde	e fd	d
„Z
dd„ Zdedefdd„ZdHde	e dedefdd„Zde	e dedefdd„ZdIde	e dededeeeef fdd„Zde	e deeef fdd„ZdHde	e dedefdd„ZdJde	e dedefd d!„Zde	e de	e d"edefd#d$„Zdefd%d&„Zdedee fd'd(„ZdKd)ed*ededefd+d,„Zd-ed.ed/ed0edef
d1d2„Zd3edefd4d5„Zd3ed6efd7d8„Zd3edefd9d:„Zd;d<„ Z dedefd=d>„Z!dLded@ede"fdAdB„Z#de	e fdCdD„Z$defdEdF„Z%dS )MÚPragmaticSignalGeneratoruZ   
    GÃ©nÃ©rateur de signaux pragmatique basÃ© sur des rÃ¨gles simples mais efficaces
    Nc                 C   sÜ   || _ |p	t t¡| _tƒ | _| j d¡ i | _d | _	t
ƒ | _t| jd�| _d| _d| _|  ¡ | _t ¡ | _d| _d| _d| _d| _d	| _d
| _d| _d| _d| _d| _d| _d| _d| _ d| _!i | _"d| _#| j d¡ d S )Nu<   BinanceDataProvider initialisÃ© pour les candles historiques)Úloggerr   i`T  r$   i ¡ é#   éA   é   éK   é   é	   é   é   é   é   é   r8   u@   PragmaticSignalGenerator initialisÃ© avec paramÃ¨tres optimisÃ©s)$Úhyperliquid_clientÚloggingÚ	getLoggerr   r\   r	   Úbinance_providerÚinfoÚleverage_cacheÚleverage_cache_timer#   Úsentiment_analyzerr   Úregime_detectorÚlast_market_updateÚmarket_update_intervalÚ_get_tradable_symbolsÚsymbolsr4   Úsymbols_last_updateÚsymbols_update_intervalÚmin_volume_24hÚrsi_oversoldÚrsi_overboughtÚrsi_extreme_oversoldÚrsi_extreme_overboughtÚema_fastÚ	ema_shortÚema_longÚ	bb_periodÚbb_stdÚ	macd_fastÚ	macd_slowÚmacd_signalÚprice_cacher*   )r1   rh   r\   r!   r!   r"   r2   o   s:   

z!PragmaticSignalGenerator.__init__r   r3   c              
   C   sÊ  zÅ|| j v r| j | \}}t ¡ | | jk r|W S | js"|  |¡W S | jj|ddd�}d}|r5t|ƒdk rU| jj|ddd�}d}|rHt|ƒdk rU| j	 
d|› d	�¡ W d
S | j	 tj¡ri| j	 
d|› d|› �¡ nt| j ƒd dkr|| j	 d|› d�¡ dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}	|d }
t|	ƒdkr¬t|	dd
… ƒ|
 nd}||
||||t ¡ dœ}|t ¡ f| j |< |W S  tyä } z| j	 d|› d|› �¡ W Y d
}~d
S d
}~ww )u\   RÃ©cupÃ¨re les donnÃ©es de marchÃ© avec cache - utilise Binance pour les candles historiquesÚ1héd   )ÚintervalÚlimitÚBinanceé2   )r‡   Úlookback_hoursÚHyperliquidu   Pas assez de donnÃ©es pour z (Binance + Hyperliquid)Nu	   DonnÃ©es u    rÃ©cupÃ©rÃ©es depuis rd   r   u   DonnÃ©es rÃ©cupÃ©rÃ©es depuis z pour certains symbolesc                 S   ó   g | ]}t |d  ƒ‘qS )Úclose©r   ©r?   Úcr!   r!   r"   Ú
<listcomp>Æ   ó    z<PragmaticSignalGenerator.get_market_data.<locals>.<listcomp>c                 S   r�   )Úhighr�   r�   r!   r!   r"   r’   Ç   r“   c                 S   r�   )Úlowr�   r�   r!   r!   r"   r’   È   r“   c                 S   r�   )Úvolumer�   r�   r!   r!   r"   r’   É   r“   éÿÿÿÿé   ièÿÿÿ©r   r   ÚclosesÚhighsÚlowsÚ
volume_24hr   u   Erreur rÃ©cupÃ©ration donnÃ©es ú: )r„   r4   r*   rh   Ú_get_mock_datark   Úget_candlesÚlenÚget_candles_datar\   ÚdebugÚisEnabledForri   ÚDEBUGrl   Úsumr   r6   rR   Úerror)r1   r   Úcached_datar   ÚcandlesÚdata_sourcerš   r›   rœ   Úvolumesr   r�   rU   rZ   r!   r!   r"   Úget_market_data¥   sP   
$ù€þz(PragmaticSignalGenerator.get_market_datac              
      s6  z{| j rq| j  ¡ }|rqd|v rqg ‰ |d D ]}| d¡}|r+| dd¡dkr+ˆ  |¡ qg d¢‰‡ fdd„ˆD ƒ}t‡fdd„ˆ D ƒƒ}|| }| j d	t|ƒ› d
�¡ | j dd 	|dd… ¡› t|ƒdkridnd› �¡ |W S | j 
d¡ g d¢W S  tyš } z| j d|› �¡ g d¢W  Y d}~S d}~ww )uP   RÃ©cupÃ¨re dynamiquement TOUS les symboles tradables disponibles sur HyperliquidÚuniverseÚnameÚmaxLeverager   )
ÚBTCÚETHÚSOLÚBNBÚAVAXÚARBÚOPÚLINKÚUNIÚDOTc                    s   g | ]}|ˆ v r|‘qS r!   r!   ©r?   Ús)Úall_symbolsr!   r"   r’   ô   r“   zBPragmaticSignalGenerator._get_tradable_symbols.<locals>.<listcomp>c                    s   g | ]}|ˆ vr|‘qS r!   r!   rº   )Úpriority_symbolsr!   r"   r’   õ   r“   u   ChargÃ© z& symboles tradables depuis Hyperliquidz
Symboles: z, Nrd   z...Ú uC   Client Hyperliquid non disponible, utilisation symboles par dÃ©fautu    Erreur rÃ©cupÃ©ration symboles: )r°   r±   r²   r³   )rh   Úget_meta_inforH   rM   Úsortedr\   rl   r¡   r£   ÚjoinÚwarningrR   r§   )r1   Ú	meta_infoÚtokenr   ÚprioritizedÚothersÚfinal_symbolsrZ   r!   )r¼   r½   r"   rs   á   s0   


€4
€ýz.PragmaticSignalGenerator._get_tradable_symbolsc                 C   sb   t   ¡ }|| j | jkr-| j d¡ |  ¡ }|r/|| _|| _| j dt| jƒ› d�¡ dS dS dS )u0   Met Ã  jour la liste des symboles si nÃ©cessaireu(   Mise Ã  jour de la liste des symboles...u   Liste mise Ã  jour: z	 symbolesN)r4   ru   rv   r\   rl   rs   rt   r¡   )r1   r6   Únew_symbolsr!   r!   r"   Ú_update_symbols_if_needed  s   úz2PragmaticSignalGenerator._update_symbols_if_neededc              	   C   sØ   ddl }ddddddd	d
œ}| |d¡}d}g }g }g }tdƒD ]9}	| d|¡}
|d|
  }|dt| d|d ¡ƒ  }|dt| d|d ¡ƒ  }| |¡ | |¡ | |¡ q ||d |||| dd¡t ¡ dœS )u-   GÃ©nÃ¨re des donnÃ©es fictives pour les testsr   Nièý  i¬  é–   iX  é(   ç333333ó?g      @)r°   r±   r²   r³   r´   rµ   r¶   r†   g{®Gáz”?é   re   r—   i@B i€–˜ r™   )	ÚrandomrH   ÚrangeÚgaussÚabsrM   Úuniformr   r6   )r1   r   rÎ   Úbase_pricesÚ
base_priceÚ
volatilityrš   r›   rœ   ÚiÚchangeÚpricer”   r•   r!   r!   r"   rŸ     s<   ù



ùz'PragmaticSignalGenerator._get_mock_dataé   ÚpricesÚperiodc           
      C   s”   t |ƒ|d k r
dS t |¡}t |dk|d¡}t |dk | d¡}t || d… ¡}t || d… ¡}|dkr<dS || }ddd|   }	|	S )zCalcule le RSIrÍ   ç      I@r   Ng      Y@r†   )r¡   rN   ÚdiffÚwhererO   )
r1   rÚ   rÛ   ÚdeltasÚgainsÚlossesÚavg_gainÚavg_lossÚrsÚrsir!   r!   r"   Úcalculate_rsi;  s   
z&PragmaticSignalGenerator.calculate_rsic                 C   sb   t |ƒ|k r|r|d S dS d|d  }||  }|| d d… D ]}|| |d|   }q"|S )zCalcule l'EMAr—   r   re   rÍ   N)r¡   )r1   rÚ   rÛ   Ú
multiplierÚemarØ   r!   r!   r"   Úcalculate_emaO  s   
z&PragmaticSignalGenerator.calculate_emard   re   Ústd_devc           
      C   sj   t |ƒ|k r|r|d nd}|||fS || d… }t |¡}t |¡}|||  }|||  }	|||	fS )zCalcule les Bandes de Bollingerr—   r   N)r¡   rN   rO   Ústd)
r1   rÚ   rÛ   rê   ÚcurrentÚrecent_pricesÚmiddlerë   ÚupperÚlowerr!   r!   r"   Úcalculate_bollinger_bands\  s   



z2PragmaticSignalGenerator.calculate_bollinger_bandsc           
      C   sª   t |ƒdk rdS |  |d¡}|  |d¡}|| }g }tdt |ƒƒD ]!}|  |d|d … d¡}|  |d|d … d¡}| || ¡ q!t |ƒdkrO|  |d¡n|}	||	fS )u*   Calcule le MACD avec paramÃ¨tres standardsé   )r   r   é   NrÍ   rb   )r¡   ré   rÏ   rM   )
r1   rÚ   Úema12Úema26Ú	macd_lineÚmacd_valuesrÖ   Ú
ema12_tempÚ
ema26_tempÚsignal_liner!   r!   r"   Úcalculate_macdk  s   z'PragmaticSignalGenerator.calculate_macdc                 C   s¨   t |ƒ|d k r
dS g }t|t |ƒƒD ]}|  |d|d … |¡}| |¡ qt |ƒ|k r/dS || d… }|d }t|ƒ}t|ƒ}	|	|krHdS || |	|  d }
|
S )zCalcule le Stochastic RSIre   rÜ   NrÍ   r—   r†   )r¡   rÏ   ræ   rM   ÚminÚmax)r1   rÚ   rÛ   Ú
rsi_valuesrÖ   Úrsi_valÚ
recent_rsiÚcurrent_rsiÚmin_rsiÚmax_rsiÚ	stoch_rsir!   r!   r"   Úcalculate_stochastic_rsi  s    z1PragmaticSignalGenerator.calculate_stochastic_rsir«   c                 C   sH   t |ƒ|d k r
dS |d }t || d d… ¡}|dkr dS || S )z(Calcule le ratio volume actuel / moyennerÍ   rD   r—   r   )r¡   rN   rO   )r1   r«   rÛ   Úcurrent_volumeÚ
avg_volumer!   r!   r"   Úcalculate_volume_ratio™  s   z/PragmaticSignalGenerator.calculate_volume_ratior   c              	   C   sž  t |ƒdk st |ƒdk rdi dddœS |  |d¡}|  |d¡}|dkr+t|| ƒ| nd}t|d	 d
ƒ}||kr:dnd}|  |d¡}	|  |d¡}
d}|	dk rUd|	 d }n|	dkr`|	d  d }d}|
dk rmd|
 d }n|
dkrx|
d  d }t|| d ƒ}|| dkrˆdnd}|  |¡\}}}||krž|| ||  nd}|dkr¬d|| |  nd}d}d}|dk r¿|dkr¿d}d}n|dkrÌ|dkrÌd}d}nt|d ƒd }|  |¡}t|d d
ƒ}||ddœ||ddœ||ddœ|ddœdœ}|d |d  |d  |d  }dddœ}|�r||  d7  < |�r!||  d7  < |dk�r/|d  d7  < n|d  d7  < |d |d k�rBdnd}|||||	|
||d œS )!uy   
        NOUVEAU SYSTÃˆME DE SCORING Ã‰QUILIBRÃ‰
        Ã‰limine la redondance et privilÃ©gie momentum + volume
        rŠ   rd   ç      à?N)ÚscoreÚ
componentsr   r   rb   rc   r   r8   rD   ÚBULLISHÚBEARISHrÙ   r_   r`   éP   re   ÚLONGÚSHORTrÍ   gš™™™™™É?çš™™™™™é?g       @ç      Ð?)r
  Ú	directionÚweightçffffffÖ?)r
  r   r  g333333Ã?)r
  r  )ÚtrendÚmomentumrÕ   r–   )r  r  )r
  r  r   r   rå   r  Úvolume_ratioÚtrend_direction)r¡   ré   rÑ   rü   ræ   r  rñ   r  )r1   rÚ   r«   r   Úema9Úema21Útrend_strengthÚtrend_scorer  rå   r  Ú
rsi_signalÚstoch_signalÚmomentum_scoreÚmomentum_sideÚupper_bbÚ	middle_bbÚlower_bbÚbb_positionÚ
bb_squeezeÚvolatility_scoreÚvolatility_sider  Úvolume_scorer  Úfinal_scoreÚ
side_votesÚdominant_sider!   r!   r"   Úcalculate_balanced_score¦  s~   



üÿÿ

øz1PragmaticSignalGenerator.calculate_balanced_scorec           	   
   C   sF  z‚|   d¡}|sdddœW S |d }t|ƒdk rdddœW S |  |d¡}|  |d¡}|  |d¡}d}d}||  kr>|krNn nd	}t|| | d
 dƒ}n||  k rX|k rhn nd}t|| | d
 dƒ}nd}d}| j d|› d|d›d�¡ |||||dœW S  ty¢ } z| j d|› �¡ dddœW  Y d}~S d}~ww )zIAnalyse la tendance macro de BTC pour filtrer les signaux contre-tendancer°   ÚNEUTRALr%   )r  r   rš   rŠ   rb   rc   r  r†   rD   r  u   ðŸ”� BTC Macro: z	 (force: rF   ú))r  r   r  r  Úema50zErreur analyse BTC macro: N)r¬   r¡   ré   rü   r\   rl   rR   rÂ   )	r1   Úbtc_datarš   r  r  r0  r  r  rZ   r!   r!   r"   Úget_btc_macro_trend  s@   
û€þz,PragmaticSignalGenerator.get_btc_macro_trendc                 C   sp  �z–|   |¡}|s| j d|› d�¡ W dS |d }|| jk r5| j d|› d|d›d| jd›d�¡ W dS | j d|› d	|d›d
|d d›d�¡ |d }| ddgt|ƒ ¡}|d }|  |||¡}|d dk r{| j d|› d|d d›�¡ W dS |d }|d }	|d }
| j d|› d|d d›d|d d d›d|d d d›d|d d d›d|d  d d›d!|	› �¡ | j |||¡\}}| j 	|||¡ | j 
||	¡sä| j d"|› d#|	› d$|› �¡ W dS ||	|d d%œ}| j |||¡}||d  }t|ƒd&k�r| j d'|› d(|d d›d)|d›d*|d+›d�	¡ ||d< || d,d-¡| d.d-¡d/œ}|  ¡ }|d d0k�r�|	d1k�r�|d d2k�ra|d  d39  < | j d"|› d4|d d›d5|d d›d�¡ nq|d d6k�r€|d  d79  < | j d"|› d8|d d›d�¡ nQ|d d9k�rÒ|	d:k�rÒ|d d2k�r³|d  d39  < | j d"|› d;|d d›d5|d d›d�¡ n|d d6k�rÒ|d  d79  < | j d"|› d<|d d›d�¡ |d d=k �rë| j d|› d>|d d›�¡ W dS |d d }|  |
|d? |¡}t|d d@ƒ}g }| ¡ D ]\}}|d d2k�r | |› dA|d d›d�¡ �qdBdC |ddD… ¡› �}|  ||	||
¡\}}t||	|
||||t ¡ |||dE |dF |dG |dH ||d |dI |dJ |dK dLœ	dM�}g }|  |¡d- �rƒ| |¡ | j dN|› dO|	› dP|d›�¡ n
| j dQ|› dR�¡ |�r•|d- W S dW S  t�y· } z| j dS|› dT|› �¡ W Y d}~dS d}~ww )UuB   Analyse un symbole avec le NOUVEAU SYSTÃˆME DE SCORING Ã‰QUILIBRÃ‰u   ðŸ“Š u"   : REJETÃ‰ (donnÃ©es indisponibles)Nr�   u    : REJETÃ‰ (volume trop faible: $z,.0fz < $r/  z: ANALYSE (volume OK: $z	, prix: $r   z.6frš   r«   rÍ   r
  r  z: Score trop faible rE   r  r   r   z: Score z	 (trend: r  rF   z, momentum: r  z, volatility: rÕ   z
, volume: r–   u   ) â†’ u   âš ï¸�  u   : REJETÃ‰ - u    interdit en rÃ©gime )r   r   r
  g{®Gáz„?u   ðŸ”„ u   : Score ajustÃ© par rÃ©gime: u    â†’ z (z+.3fÚ
change_24hr   Úvolatility_pct)ÚregimeÚregime_change_24hÚregime_volatilityr  r  gffffffæ?ç      è?u*   : SHORT pÃ©nalisÃ© 25% - BTC bullish fort u    (score â†’ çš™™™™™Ù?ç333333ë?u9   : SHORT pÃ©nalisÃ© 15% - BTC bullish modÃ©rÃ© (score â†’ r  r  u)   : LONG pÃ©nalisÃ© 25% - BTC bearish fort u8   : LONG pÃ©nalisÃ© 15% - BTC bearish modÃ©rÃ© (score â†’ r  u(   : Score insuffisant aprÃ¨s filtre macro r8   çffffffî?ú(zNouveau scoring: z + é   rå   r  r  r  r5  r6  r7  )	rå   r  r  r  Úscoring_componentsr*  r5  r6  r7  )r   r   r   r   r   r   r   r   r   r   r   u   âœ… ú u   : Signal gÃ©nÃ©rÃ© avec score u   â�Œ u(   : Signal rejetÃ© par rÃ¨gles de filtragezErreur analyse rž   )r¬   r\   rl   rw   rH   r¡   r-  rp   Údetect_regimeÚlog_regime_detectionÚshould_trade_in_regimerÂ   Úadjust_signal_scorerÑ   r2  Ú_calculate_smart_leveragerü   ÚitemsrM   rÁ   Ú_calculate_target_pricer   r   r6   Úis_signal_suitable_for_rulesrR   r§   )r1   r   rU   r�   rš   r«   r   Úscoring_resultr  r   r   r5  Úregime_paramsÚsignal_with_regimeÚadjusted_scoreÚscore_changeÚregime_infoÚ	btc_macrorÕ   r   r   Údominant_componentsÚ	comp_nameÚ	comp_datar   r   Ú
target_pnlÚsignalÚsuitable_signalsrZ   r!   r!   r"   Úanalyze_symbol5  sØ   

&(ÿþýüü0

ý. €. €öõ
"€þz'PragmaticSignalGenerator.analyze_symbolr   rÕ   c                 C   sT  zddl m} |r||ƒnd}W n ty   d}Y nw zddlm}m}m} |}	|}
|}W n
   d}	d}
d}Y tt||
ƒ|	 ƒ}|dkrMt|d	 ƒ}n'|d
krXt|d ƒ}n|dkrct|d
 ƒ}n|dkrnt|d ƒ}nt|d ƒ}|dkr‚t	dt|d ƒƒ}n|dkr�t	dt|d ƒƒ}n|dk ržt|t|d ƒƒ}n|}t	|t||ƒƒ}|S )uK   Calcule le leverage intelligent basÃ© sur la force du signal et volatilitÃ©r   r
   rd   )ÚLEVERAGE_SAFETY_FACTORÚMAX_LEVERAGEÚMIN_LEVERAGE_THRESHOLDr;  é   rf   r:  rD   r8  gÍÌÌÌÌÌì?gÍÌÌÌÌÌä?gš™™™™™á?g333333ã?r	  ra   re   gÍÌÌÌÌÌô?)
Úleverage_limitsr   ÚImportErrorÚtrading_configrV  rW  rX  r    rü   rý   )r1   r   rÕ   r   r   Úmax_leverage_for_symbolrV  rW  rX  Úsafety_factorÚ
global_maxÚmin_leverageÚsafe_maxÚbase_leverager   r!   r!   r"   rD  Ï  sD   þz2PragmaticSignalGenerator._calculate_smart_leverageÚentry_pricer   r   Úsignal_strengthc           	      C   sx   |dkrd}n|dkrd}n	|dkrd}nd}|dd|   }|d	kr,|d
|d   }n|d
|d   }|| }||fS )z#Calcule le prix cible et PnL targetrd   r  r8   r	  ra   r  rÌ   r9  r  rÍ   r†   r!   )	r1   rc  r   r   rd  Úbase_tp_percentÚ
tp_percentr   rR  r!   r!   r"   rF    s   z0PragmaticSignalGenerator._calculate_target_pricerS  c                 C   s&   |j pi }| dd¡}|dkrdS dS )uM   VÃ©rifie si le signal est adaptÃ© aux rÃ¨gles (simplifiÃ© pour trailing stop)rÕ   r=  é   )Fu   VolatilitÃ© extrÃªme > 15%)TzOK pour trailing stop)r   rH   )r1   rS  r   rÕ   r!   r!   r"   rG    s
   
z5PragmaticSignalGenerator.is_signal_suitable_for_rulesr.   c                 C   ó   |S )u/   Filtre les signaux selon sentiment (simplifiÃ©)r!   )r1   rS  r.   r!   r!   r"   Ú_apply_market_sentiment_filter%  ó   z7PragmaticSignalGenerator._apply_market_sentiment_filterc                 C   rh  )u'   Applique un biais shitcoin (simplifiÃ©)r!   )r1   rS  r   r!   r!   r"   Ú_apply_shitcoin_bias+  rj  z-PragmaticSignalGenerator._apply_shitcoin_biasc              
   C   sd   zt   ¡ }|| j | jk rW dS || _W dS  ty1 } z| j d|› �¡ W Y d}~dS d}~ww )u9   Met Ã  jour la classification des marchÃ©s si nÃ©cessaireNu   Erreur mise Ã  jour marchÃ©s: )r4   rq   rr   rR   r\   r§   )r1   Úcurrent_timerZ   r!   r!   r"   Ú'_update_market_classification_if_needed1  s    €ÿz@PragmaticSignalGenerator._update_market_classification_if_neededc                 C   sX   z!ddl m}m} | dd¡ ¡ }||v rW dS ||v rW dS W dS  ty+   Y dS w )u·   
        DÃ©termine la catÃ©gorie de qualitÃ© d'un crypto

        Args:
            symbol: Symbole du crypto

        Returns:
            str: 'high', 'medium', 'shitcoin'
        r   )ÚHIGH_QUALITY_CRYPTOSÚMEDIUM_QUALITY_CRYPTOSÚUSDTr¾   r”   ÚmediumÚshitcoin)r\  rn  ro  Úreplacerï   r[  )r1   r   rn  ro  Úclean_symbolr!   r!   r"   Ú_get_crypto_quality_category>  s   
ÿz5PragmaticSignalGenerator._get_crypto_quality_categoryr   Úcurrent_positionsc                    s”  z¿ddl m}m}m}m} |sˆ j d|› d�¡ W dS ˆ  |¡}|dkr2ˆ j d|› d�¡ W dS |dkr\t|| ƒ}||k }	|	rDd	nd
}
ˆ j d|› d|
› d|› d|› d�	¡ |	W S |dkr½|dkrqˆ j d|› d�¡ W dS |dkr¬ddl m	} t
‡ fdd„t|ƒD ƒƒ}||krŸˆ j d|› d|› d|› d�¡ W dS ˆ j d|› d�¡ W dS |dkr½ˆ j d|› d�¡ W dS W dS  tyÉ   Y dS w )u  
        VÃ©rifie si un crypto doit Ãªtre traitÃ© selon la stratÃ©gie configurÃ©e

        Args:
            symbol: Symbole du crypto
            current_positions: Nombre de positions actuelles

        Returns:
            bool: True si le crypto doit Ãªtre traitÃ©
        r   )ÚUSE_QUALITY_FILTERÚSHITCOIN_STRATEGYÚMAX_MEDIUM_QUALITY_RATIOÚMAX_SIMULTANEOUS_POSITIONSu   ðŸ”� u)   : AUTORISÃ‰ (filtre qualitÃ© dÃ©sactivÃ©)Tr”   u   : AUTORISÃ‰ (haute qualitÃ©)rq  u	   AUTORISÃ‰u   REJETÃ‰rž   u    (qualitÃ© moyenne, ú/r/  rr  ÚEXCLUDEu)   : REJETÃ‰ (shitcoin exclu par stratÃ©gie)FÚ
SHORT_BIAS)ÚSHITCOIN_MAX_POSITIONSc                 3   s(   � | ]}ˆ   d |› �¡dkrdV  qdS )ÚDUMMY_rr  rÍ   N)ru  rº   r0   r!   r"   rB   Š  s   € ÿÿzBPragmaticSignalGenerator._should_process_crypto.<locals>.<genexpr>u%   : REJETÃ‰ (limite shitcoins atteinte u&   : AUTORISÃ‰ (shitcoin avec SHORT bias)ÚALLOWu/   : AUTORISÃ‰ (shitcoin autorisÃ© par stratÃ©gie))r\  rw  rx  ry  rz  r\   rl   ru  r    r~  r¦   rÏ   r[  )r1   r   rv  rw  rx  ry  rz  ÚqualityÚmax_medium_positionsÚallowedÚstatusr~  Úshitcoin_countr!   r0   r"   Ú_should_process_crypto\  sD   
& ÿz/PragmaticSignalGenerator._should_process_cryptoc           
      C   sì  | j  dt| jƒ› d�¡ g }|  ¡  |  ¡  | j ¡ }| j  d|d›�¡ d}d}t| jƒD ]ª\}}|  	|t|ƒ¡s@|d7 }q/|dkrS|d dkrSddl
}| d	¡ |  |¡}|rÙ|  ||¡}|ru|  ||¡}|ru|  |¡d
kru|d7 }|rÙ|j|j|j|j|j|jt|jd ƒ|j|j ¡ dœ	}	|jrÔ|j dd¡|	d< |j dd¡|	d< |j dd¡|	d< |j di ¡|	d< |j dd¡|	d< |j dd¡|	d< |j dd¡|	d< | |	¡ q/|dksâ|dkrô| j  d|› d|› dt|ƒ› d�¡ |S )u7   GÃ©nÃ¨re des signaux pour tous les symboles surveillÃ©su"   ðŸ”„ generate_signals() appelÃ© - u    symboles Ã  analyseru)   ðŸŽ¯ DÃ©but analyse - sentiment marchÃ©: rE   r   rÍ   ra   Nr	  rr  r†   )	r   r   r   r   r
  r   Ú
confidencer   r   rÕ   rå   rŠ   r  r.  r>  r  r5  ÚCONSOLIDATIONr6  r7  u   ðŸ”� Filtre: z	 exclus, z shitcoins SHORT bias, u    signaux gÃ©nÃ©rÃ©s)r\   rl   r¡   rt   rÉ   rm  ro   r7   Ú	enumerater†  r4   ÚsleeprU  ri  rk  ru  r   r   r   r   r   r    r   r   Ú	isoformatr   rH   rM   )
r1   Úsignalsr.   Úfiltered_countÚshitcoin_signalsrÖ   r   r4   rS  Úsignal_dictr!   r!   r"   Úgenerate_signalsš  s\   


÷
€$z)PragmaticSignalGenerator.generate_signalsc                 C   sh   t  ¡  ¡ t| jƒg dœ}| jD ]}|  |¡}|r)|d  |j|j|j	|j
dœ¡ qt|d ƒ|d< |S )u(   Retourne un rÃ©sumÃ© des signaux actuels)r   Úsymbols_monitoredrŒ  rŒ  )r   r   r�  r   Útotal_signals)r   r6   r‹  r¡   rt   rU  rM   r   r   r   r   )r1   Úsummaryr   rS  r!   r!   r"   Úget_signal_summaryä  s    
ý

ü€z+PragmaticSignalGenerator.get_signal_summary©NN)rÙ   )rd   re   )rd   )N)r   )&r   r   r   r   r2   r   r   r   r¬   r   rs   rÉ   rŸ   r   r    ræ   ré   r   rñ   rû   r  r  r-  r2  r   rU  rD  ÚtuplerF  rG  ri  rk  rm  ru  Úboolr†  r�  r”  r!   r!   r!   r"   r[   j   s6    
6<%**"_0 3>Jr[   c                 C   s   t | |ƒ}|jS )u-   CrÃ©e une instance du gÃ©nÃ©rateur de signaux)r[   r�  )rh   r\   Ú	generatorr!   r!   r"   Úcreate_signal_providerû  s   
r™  r•  )!r   ri   r4   r   r   Útypingr   r   r   r   Údataclassesr   ÚnumpyrN   rG   ÚsysÚosÚpathÚdirnameÚabspathÚ__file__Ú
parent_dirrM   Úbinance_data_providerr	   Úhyperliquid_leverages_cacher   Úmarket_regime_detectorr   r   r#   r[   r™  r!   r!   r!   r"   Ú<module>   s6   B       