o
    1^ïh'  ã                   @   s`   d Z ddlZddlZddlmZmZmZ ddlmZ G dd„ dƒZ	dd„ Z
ed	kr.e
ƒ  dS dS )
uo   
DÃ©tecteur de rÃ©gime de marchÃ© par symbole
Adapte les paramÃ¨tres de trading selon les conditions actuelles
é    N)ÚDictÚTupleÚList)Údatetimec                
   @   sÂ   e Zd ZdZddd„Zdee dee dedeee	f fd	d
„Z
de	dede	defdd„Zddededefdd„Zdedefdd„Zdedefdd„Zdedefdd„Zdedede	fdd„ZdS )ÚMarketRegimeDetectoruC   DÃ©tecte le rÃ©gime de marchÃ© pour chaque symbole individuellementNc                 C   sˆ   |pt  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œdœ| _d S )Nr   u#   change_24h > 2% et volatilitÃ© < 3%g333333ó?ç      ð?gš™™™™™é?gÍÌÌÌÌÌô?gffffffæ?)Ú
conditionsÚscore_multiplierÚposition_multiplierÚleverage_multiplierÚcooldown_multiplierÚ	long_biasÚ
short_biasu$   change_24h > 2% et volatilitÃ© >= 3%gÍÌÌÌÌÌì?u*   -8% < change_24h < -2% et volatilitÃ© < 3%gš™™™™™ñ?u+   -8% < change_24h < -2% et volatilitÃ© >= 3%g      à?g333333ã?ç      ø?zchange_24h < -8%g        z-2% <= change_24h <= 2%gffffffî?©ÚBULL_STABLEÚBULL_VOLATILEÚBEAR_STABLEÚBEAR_VOLATILEÚDUMPÚCONSOLIDATION)ÚloggingÚ	getLoggerÚloggerÚregimes)Úselfr   © r   úmarket_regime_detector.pyÚ__init__   sd   ù
ù
ù
ù
ù
ùÒzMarketRegimeDetector.__init__ÚclosesÚvolumesÚcurrent_priceÚreturnc              
   C   sZ  zŠt |ƒdk r| j dt |ƒ› d�¡ d| jd fW S |d }|| | d }t |dd… ¡}t |¡|dd…  }t |¡d }|d	k rId
}	n.|dk rT|dkrTd}	n#|dk r_|dk r_d}	n|dkrj|dkrjd}	n|dkru|dk rud}	nd}	| j|	  ¡ }
||
d< ||
d< |	|
fW S  t	y¬ } z| j 
d|› �¡ d| jd fW  Y d}~S d}~ww )u!  
        DÃ©tecte le rÃ©gime actuel pour un symbole

        Args:
            closes: Liste des prix de clÃ´ture (au moins 24 pÃ©riodes)
            volumes: Liste des volumes
            current_price: Prix actuel

        Returns:
            Tuple (regime_name, regime_params)
        é   u.   Pas assez de donnÃ©es pour dÃ©tecter rÃ©gime: u
    pÃ©riodesr   içÿÿÿéd   Néÿÿÿÿiøÿÿÿr   éþÿÿÿé   r   r   é   r   r   Ú
change_24hÚvolatility_pctu   Erreur dÃ©tection rÃ©gime: )Úlenr   Úwarningr   ÚnpÚarrayÚdiffÚstdÚcopyÚ	ExceptionÚerror)r   r   r    r!   Úprice_24h_agor)   Úrecent_closesÚreturnsr*   ÚregimeÚparamsÚer   r   r   Údetect_regimeK   s:   
€þz"MarketRegimeDetector.detect_regimeÚsignalr7   Úregime_paramsc           	      C   sò   zW|  dd¡}|  dd¡}|  dd¡}|dkr ||  dd¡9 }n|d	kr,||  d
d¡9 }|| }t|| ƒdkrU| j |d › d|› d|d›d|d›d|› d|d›d�¡ |W S  tyx } z| j d|› �¡ |  dd¡W  Y d}~S d}~ww )u  
        Ajuste le score d'un signal selon le rÃ©gime

        Args:
            signal: Signal de trading avec 'score' et 'side'
            regime: Nom du rÃ©gime
            regime_params: ParamÃ¨tres du rÃ©gime

        Returns:
            Score ajustÃ©
        Úscorer   ÚsideÚ r	   r   ÚLONGr   ÚSHORTr   gš™™™™™©?Úsymbolú z: Score ú.3fu    â†’ u    (rÃ©gime: z, mult: ú.2fú)zErreur ajustement score: N)ÚgetÚabsr   Údebugr2   r3   )	r   r;   r7   r<   Ú
base_scorer>   Ú
multiplierÚadjusted_scorer9   r   r   r   Úadjust_signal_score~   s.    ÿÿÿ€þz(MarketRegimeDetector.adjust_signal_scorer>   c                 C   s   |dkr|r
|dkS dS dS )u¼   
        VÃ©rifie si on peut trader dans ce rÃ©gime

        Args:
            regime: Le rÃ©gime dÃ©tectÃ©
            side: LONG ou SHORT (si fourni, vÃ©rifie la compatibilitÃ©)
        r   rA   FTr   )r   r7   r>   r   r   r   Úshould_trade_in_regime¦   s   	z+MarketRegimeDetector.should_trade_in_regimec                 C   ó   | j |  dd¡S )u@   Retourne le multiplicateur de taille de position pour ce rÃ©gimer
   r   ©r   rG   ©r   r7   r   r   r   Úget_position_size_multiplierµ   ó   z1MarketRegimeDetector.get_position_size_multiplierc                 C   rO   )u6   Retourne le multiplicateur de leverage pour ce rÃ©gimer   r   rP   rQ   r   r   r   Úget_leverage_multiplier¹   rS   z,MarketRegimeDetector.get_leverage_multiplierc                 C   rO   )u6   Retourne le multiplicateur de cooldown pour ce rÃ©gimer   r   rP   rQ   r   r   r   Úget_cooldown_multiplier½   rS   z,MarketRegimeDetector.get_cooldown_multiplierrB   c                 C   sp   |  dd¡}|  dd¡}ddddddd	œ  |d
¡}| j |› d|› d|› d|d›d|d›d|d d›d�¡ dS )u   Log la dÃ©tection de rÃ©gimer)   r   r*   u   ðŸŸ¢u   ðŸŸ¡u   ðŸ”´u   âš ï¸�u   âšªr   u   â�“rC   z: u
    | Î”24h: z+.2fz	% | Vol: rE   z% | ScoreMult: r	   ÚxN)rG   r   Úinfo)r   rB   r7   r<   ÚchangeÚvolÚemojir   r   r   Úlog_regime_detectionÁ   s    úù	"ÿÿz)MarketRegimeDetector.log_regime_detection)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úfloatr   Ústrr   r:   rM   ÚboolrN   rR   rT   rU   r[   r   r   r   r   r      s    
=ÿ

ÿ3(r   c               	   C   sÆ  ddl } | j| jd� tƒ }tdƒ dd„ tdƒD ƒ}dgd }| |||d	 ¡\}}td
|› �ƒ td|› �ƒ tdƒ dgd dd„ tdƒD ƒ }| |||d	 ¡\}}td
|› �ƒ td| |¡› �ƒ tdƒ dg}tdƒD ]}| |d	 dt	j
 dd¡  ¡ qr| |||d	 ¡\}}td
|› �ƒ td| |¡› �ƒ tdƒ ddddœ}	ddddœ}
dD ]-}|j| }| |	||¡}| |
||¡}td|› d �ƒ td!|d"›�ƒ td#|d"›�ƒ q³dS )$u   Test du dÃ©tecteur de rÃ©gimer   N)Úlevelz
=== TEST 1: BULL_STABLE ===c                 S   s   g | ]}d |d  ‘qS )r$   g333333Ó?r   ©Ú.0Úir   r   r   Ú
<listcomp>Þ   ó    z(test_regime_detector.<locals>.<listcomp>é   i@B r%   u   RÃ©gime dÃ©tectÃ©: u   ParamÃ¨tres: z
=== TEST 2: DUMP ===r$   é
   c                 S   s   g | ]}d |d  ‘qS )r$   r   r   rd   r   r   r   rg   æ   rh   é   zCan trade: z
=== TEST 3: BEAR_VOLATILE ===é   gV-²�ïï?g{®Gáz„¿g{®Gázt?zPosition multiplier: z"
=== TEST 4: Ajustement scores ===ÚBTCr@   gÍÌÌÌÌÌÜ?)rB   r>   r=   rA   )r   r   r   Ú
ú:u     LONG:  0.45 â†’ rD   u     SHORT: 0.45 â†’ )r   ÚbasicConfigÚINFOr   ÚprintÚranger:   rN   Úappendr-   ÚrandomÚuniformrR   r   rM   )r   ÚdetectorÚcloses_bullr    r7   r8   Úcloses_dumpÚcloses_bearrf   Úsignal_longÚsignal_shortÚregime_namer<   Úadjusted_longÚadjusted_shortr   r   r   Útest_regime_detectorÕ   s@   
"
ùr€   Ú__main__)r_   r   Únumpyr-   Útypingr   r   r   r   r   r€   r\   r   r   r   r   Ú<module>   s     K/
ÿ