
    i}'                         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
 e
j                  d      Z G d d      ZdadefdZy)	u   
Market Regime Detector - Détection avancée du régime de marché
Identifie 5 régimes distincts et adapte la stratégie en conséquence
    N)datetime	timedelta)DictListOptionalTupleMarketRegimeDetectorc                   T   e Zd ZdZdddddddd	d
ddddddddd	dddddddddd	dddddddddd	dddddddd d	d!d"Zd# Zd$ Zd8d&ee   d'e	fd(Z
d)ed*ed+ed'efd,Zd9d-ej                  d.ed'efd/Zd+ed'efd0Zd'e	fd1Zd'e	fd2Zd'efd3Zd'efd4Zd'efd5Zd'efd6Zd'efd7Zy%):r	   u>   Détecteur de régime de marché pour adaptation de stratégiezBull Market Fort      @low-      Tg333333?)	min_scoremax_positions
aggressiverisk_multiplier)namebtc_trend_min
volatilitystrategyzBull Market Faible      ?medium7      F)r   r   btc_trend_maxr   r   u   Marché Latéral      <      g?zBear Market Faible      F   
   333333?zBear Market ForthighP      皙?)r   r   r   r   )BULL_STRONG	BULL_WEAKSIDEWAYS	BEAR_WEAKBEAR_STRONGc                 f    d| _         g | _        d | _        d | _        t        j                  d       y )Nr)   u&   ✅ Market Regime Detector initialisé)current_regimeregime_historylast_updateklines_fetcherloggerinfoselfs    ./market_regime_detector.py__init__zMarketRegimeDetector.__init__N   s/    ( "<=    c                     || _         y)zInjecte le fetcher de klinesN)r0   )r4   fetchers     r5   set_klines_fetcherz'MarketRegimeDetector.set_klines_fetcherU   s
    %r7   N
btc_pricesreturnc           
      6   	 |=| j                   r1| j                  ddd      }|r|D cg c]  }t        |d          }}|rt        |      dk  r%t        j	                  d       | j                         S t        j                  |      }|d	   |d
   z
  |d
   z  dz  }t        |      dk\  r|d	   |d   z
  |d   z  dz  }n|}| j                  |      }| j                  |||      }|| _
        t        j                         | _        | j                  j                  || j                  |||d       t        | j                        dkD  r| j                  dd | _        d|| j                   |   d   |||| j#                  |      | j                   |   d   | j                  j%                         d	}	t        j'                  d|	d    d|dd|dd       |	S c c}w # t(        $ r2}
t        j+                  d|
        | j                         cY d}
~
S d}
~
ww xY w)u   
        Détecte le régime de marché actuel basé sur BTC
        
        Args:
            btc_prices: Prix BTC (si None, fetch automatiquement)
        
        Returns:
            Dict avec régime détecté et stratégie adaptée
        NBTCUSDT1hd   )intervallimit   2   u8   ⚠️ Données BTC insuffisantes pour détecter régimei   iX)regime	timestampbtc_24h_changebtc_7d_changer   iTr   r   	successrG   regime_namerI   rJ   r   volatility_levelr   r/   u   📊 Régime détecté: rM   z (BTC 24h: z+.2fz%, Vol: z.2fz%)u   Erreur détection régime: )r0   floatlenr1   warning_get_default_regimenparray_calculate_volatility_classify_regimer-   r   nowr/   r.   appendREGIMES_classify_volatility	isoformatr2   	Exceptionerror)r4   r;   klinesk	btc_arrayrI   rJ   r   rG   resultes              r5   detect_regimez"MarketRegimeDetector.detect_regimeY   sT   >	.!d&9&9,,YS,Q7=!>!%!+!>J!>Z2!5YZ//11,I  )}y~=3OSVVN 9~$"+B-)D/"AYt_!TX[ [ . 33I>J **>=*UF"(D'||~D && !--"0!.((  4&&'#-&*&9&9$%&@#   #||F3F;"0!.($($=$=j$I LL0<#//99;
F KK26-3H2IUcdhTiiqr|  ~A  rB  BD  E  FMk "?n  	.LL6qc:;++--	.s4   (G G6G 6E!G G 	H&'HHHbtc_24hbtc_7dr   c                 r    |dz  |dz  z   }|dk  s
|dk  r|dkD  ry|dk  ry|d	kD  s
|d
kD  r|d
k  ry|dkD  ryy)u   
        Classifie le régime basé sur les métriques
        
        Args:
            btc_24h: Variation BTC 24h (%)
            btc_7d: Variation BTC 7j (%)
            volatility: Volatilité (%)
        r"   r&   r   g            @r+   r   r*   r   g      @r'   r   r(   r)    )r4   rd   re   r   combined_trends        r5   rV   z%MarketRegimeDetector._classify_regime   si     "C-&3,6 D Wt^
S8H  d" c!gm
S8H  c! r7   pricesperiodc                     t        |      |dz   k  ryt        j                  t        j                  || dz
  d             }t        j                  |      }||d   z  dz  }|S )u   
        Calcule la volatilité (ATR-like en pourcentage)
        
        Returns:
            Volatilité en % du prix
                  @NrE   r@   )rP   rS   absdiffmean)r4   rj   rk   changes
avg_changevolatility_pcts         r5   rU   z*MarketRegimeDetector._calculate_volatility   sf     v;!# &&	
!345WWW%
 %vbz1S8r7   c                     |dk  ry|dk  ryy)u"   Classifie le niveau de volatilitérn   r   rg   r   r#   rh   )r4   r   s     r5   rZ   z)MarketRegimeDetector._classify_volatility   s    #r7   c           
      z    ddddddd| j                   d   d   t        j                         j                         d	S )	u(   Retourne un régime par défaut (neutre)Fr)   u   Marché Latéral (défaut)r   rn   r   r   rK   )rY   r   rW   r[   r3   s    r5   rR   z(MarketRegimeDetector._get_default_regime   sF      7 (Z0<#<<>335

 
	
r7   c                     | j                   | j                  v r| j                  | j                      d   S | j                  d   d   S )u   
        Retourne la stratégie adaptée au régime actuel
        
        Returns:
            Dict avec paramètres de stratégie
        r   r)   r-   rY   r3   s    r5   get_adapted_strategyz)MarketRegimeDetector.get_adapted_strategy   sD     $,,.<< 3 34Z@@||J'
33r7   c                 F    | j                         }|j                  dd      S )u1   Indique si on doit être agressif dans le tradingr   Fry   getr4   r   s     r5   should_be_aggressivez)MarketRegimeDetector.should_be_aggressive   s!    ,,.||L%00r7   c                 F    | j                         }|j                  dd      S )u,   Retourne le score minimum adapté au régimer   r   r{   r}   s     r5   get_min_score_thresholdz,MarketRegimeDetector.get_min_score_threshold   s!    ,,.||K,,r7   c                 F    | j                         }|j                  dd      S )u6   Retourne le nombre max de positions adapté au régimer   r   r{   r}   s     r5   get_max_positionsz&MarketRegimeDetector.get_max_positions  s!    ,,.||OR00r7   c                 F    | j                         }|j                  dd      S )u7   Retourne le multiplicateur de risque adapté au régimer   r   r{   r}   s     r5   get_risk_multiplierz(MarketRegimeDetector.get_risk_multiplier  s"    ,,.||-s33r7   c                     | j                   | j                  v r2| j                  | j                      }|d    d|d   d    d|d   d    S y)u4   Retourne une description textuelle du régime actuelr   z - Min Score: r   r   z, Max Pos: r   u   Régime inconnurx   )r4   regime_datas     r5   get_regime_infoz$MarketRegimeDetector.get_regime_info  s}    $,,.,,t':':;K!&)*.Z9PQ\9]8^^iju  wA  kB  CR  kS  jT  U  U r7   )N)   )__name__
__module____qualname____doc__rY   r6   r:   r   rO   r   rc   strrV   rS   ndarrayintrU   rZ   rR   ry   boolr~   r   r   r   r   rh   r7   r5   r	   r	      s   H ' !#"#&		

 )  "!###&	
 '! !###&	
 )!!"!###&	
 '! !"##&		

a;Gz>&H.U H.t H.T u % TW @BJJ  U &u  
T 
	4d 	41d 1
- -
13 1
4U 4
! !r7   r<   c                  .    t         
t               a t         S )u4   Retourne l'instance globale du détecteur de régime)_regime_detectorr	   rh   r7   r5   get_regime_detectorr     s     /1r7   )r   numpyrS   r   r   typingr   r   r   r   logging	getLoggerr1   r	   r   r   rh   r7   r5   <module>r      sP   
  ( . . 			1	2C! C!N  1 r7   