o
    Ñh4  ã                   @   s„   d Z ddlZddlmZmZ ddlmZmZmZ ddlZddl	Z	ej
 d¡ ddlmZ G dd„ dƒZd	d
„ Zedkr@eƒ  dS dS )uw   
DÃ©tecteur de tendance pour filtrer les signaux de trading
Ã‰vite d'ouvrir des positions contre la tendance dominante
é    N)ÚdatetimeÚ	timedelta)ÚDictÚOptionalÚTuplez..©ÚHyperliquidClientc                   @   s–   e Zd ZdZddefdd„Zdedeeee	f fdd	„Z
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eef fdd„Zdedefdd„ZdS )ÚTrendDetectoruM   DÃ©tecte la tendance du marchÃ© avant d'autoriser les ouvertures de positionsNÚhyperliquid_clientc                 C   s.   || _ t d¡| _d| _d| _i | _d| _d S )Nr	   g      ø?g      à?é´   )r
   ÚloggingÚ	getLoggerÚloggerÚstrong_trend_thresholdÚneutral_zoneÚtrend_cacheÚcache_duration)Úselfr
   © r   úO/var/www/html/HyperOracle/crypto_trader/simple_trading_system/trend_detector.pyÚ__init__   s   
zTrendDetector.__init__ÚsymbolÚreturnc              
   C   sî  |› d�}|| j v r&| j | \}}t ¡ | j| jk r&| j d|› �¡ |S �z'|  |¡}|s@| j d|› �¡ ddddifW S |  	|dd	… d
¡|  	|dd	… d¡|  	|dd	… d¡|  	|dd	… d¡dœ}d}dddddœ}| 
¡ D ]%\}	}
||	 }|d dkr‹||
|d  7 }qt|d dkr™||
|d  8 }qt|dkr¦d}td|ƒ}n|dk r´d}tdt|ƒƒ}nd}t|ƒ}|rÂ|d d nd}t|ƒdkrÙtdd „ |d!d	… D ƒƒd n|}t|ƒd"krðtd#d „ |d$d	… D ƒƒd" n|}||||||dk�r|| | d nd|dk�r|| | d nd||d%œ	}| j |› d&|› d'|d(›d)�¡ t|d* ƒd+k�r>| j d,|d* d-›d.�¡ |||f}|t ¡ f| j |< |W S  t�yv } z| j d/|› d0|› �¡ dddt|ƒifW  Y d	}~S d	}~ww )1u#  
        DÃ©termine la tendance actuelle du marchÃ© pour un symbole

        Returns:
            Tuple: (trend, strength, details)
            - trend: 'BULLISH', 'BEARISH', 'NEUTRAL'
            - strength: force de la tendance (0-100)
            - details: dÃ©tails de l'analyse
        Ú_trendzUsing cached trend for u   Pas de donnÃ©es pour ÚNEUTRALr   ÚerrorzNo dataiôÿÿÿNÚ5miniðÿÿÿÚ15minièÿÿÿÚ1hiäÿÿÿÚ4h)r   r   r   r   g333333Ã?g      Ð?gffffffÖ?ÚtrendÚBULLISHÚstrengthÚBEARISHé   éd   iâÿÿÿéÿÿÿÿÚcloseé   c                 s   ó   � | ]}|d  V  qdS ©r'   Nr   ©Ú.0Úcr   r   r   Ú	<genexpr>X   ó   € z1TrendDetector.get_market_trend.<locals>.<genexpr>iìÿÿÿé2   c                 s   r)   r*   r   r+   r   r   r   r.   Y   r/   iÎÿÿÿ)	r    r"   Úcurrent_priceÚma_20Úma_50Úprice_vs_ma20Úprice_vs_ma50Ú
timeframesÚweighted_scorez Trend: z (Strength: ú.1fú%)r4   é   z  Price vs MA20: z.2fú%zErreur analyse tendance ú: )r   r   ÚnowÚsecondsr   r   ÚdebugÚfetch_recent_candlesÚwarningÚanalyze_timeframeÚitemsÚminÚabsÚlenÚsumÚinfoÚ	Exceptionr   Ústr)r   r   Ú	cache_keyÚcached_dataÚ	timestampÚcandlesÚanalysisr7   ÚweightsÚ	timeframeÚweightÚtf_datar    r"   r1   r2   r3   ÚdetailsÚresultÚer   r   r   Úget_market_trend   sr   


ü€..÷ 
€þzTrendDetector.get_market_trendrN   rQ   c                 C   s¦  |rt |ƒdk rddddœS |d d }|d d }|dkr&|| | d nd}tdd	„ |D ƒƒ}td
d	„ |D ƒƒ}d}d}	tdt |ƒƒD ]&}
||
 d ||
d  d krY|d7 }||
 d ||
d  d k rk|	d7 }	qEd}t|ƒ| jkr‚|d|dkr}dnd 7 }nt|ƒ| jkr•|d|dkr‘dnd 7 }|| t |ƒ }||d 7 }||	kr¬|d7 }n|	|kr´|d8 }|dkr»d}n	|dk rÂd}nd}|tdt|ƒƒ|||||	dœS )u0   Analyse la tendance sur un timeframe spÃ©cifiquer:   r   r   )r    r"   Úchanger'   r&   r%   c                 s   s$   � | ]}|d  |d krdV  qdS ©r'   Úopené   Nr   r+   r   r   r   r.   ‚   ó   €" z2TrendDetector.analyze_timeframe.<locals>.<genexpr>c                 s   s$   � | ]}|d  |d k rdV  qdS rY   r   r+   r   r   r   r.   ƒ   r\   r[   ÚhighÚlowé(   r(   r$   é   é   r!   içÿÿÿr#   )r    r"   rX   Úbullish_candlesÚbearish_candlesÚhigher_highsÚ
lower_lows)rF   rG   ÚrangerE   r   r   rD   )r   rN   rQ   Úfirst_priceÚ
last_priceÚprice_changerb   rc   rd   re   ÚiÚtrend_scoreÚcandle_ratior    r   r   r   rB   v   sN   €
ùzTrendDetector.analyze_timeframer%   Úlimitc                 C   s>  z~| j sg W S ddl}d}tt ¡  ¡ d ƒ}tt ¡ tdd�  ¡ d ƒ}d|d||d	œd
œ}|j||d�}|jdkr|| 	¡ }	g }
|	D ]&}|
 
t|d ƒt|d ƒt|d ƒt|d ƒt|d ƒt|d ƒdœ¡ qDt|
ƒ|kry|
| d… W S |
W S g W S  tyž } z| j d|› d|› �¡ g W  Y d}~S d}~ww )u6   RÃ©cupÃ¨re les chandeliers rÃ©cents depuis Hyperliquidr   Nz https://api.hyperliquid.xyz/infoiè  é   )ÚhoursÚcandleSnapshotÚ5m)ÚcoinÚintervalÚ	startTimeÚendTime)ÚtypeÚreq)ÚjsonéÈ   ÚtÚoÚhÚlr-   Úv)rM   rZ   r]   r^   r'   Úvolumeu   Erreur rÃ©cupÃ©ration candles r<   )r
   ÚrequestsÚintr   r=   rM   r   ÚpostÚstatus_coderx   ÚappendÚfloatrF   rI   r   r   )r   r   rm   r€   ÚurlÚend_timeÚ
start_timeÚpayloadÚresponseÚdatarN   Úcandle_datarV   r   r   r   r@   ³   sD   üþ








ú"	€þz"TrendDetector.fetch_recent_candlesÚsignalc                 C   s@  |  d¡}|  dd¡ ¡ }|r|sdS |  |¡\}}}|dkr`|dkr0|dkr0dd	|d
›d�fS |dkrT|dkrT|  dd¡}|dk rKdd|d›d�fS dd|d
›d�fS dd|› d|d
›d�fS |dkrž|dkru|dkrudd|d
›d�fS |dkr’|dkr’|  dd¡}|dkr�dd|d›d�fS d$S dd|› d|d
›d!�fS d"S )%uÑ   
        VÃ©rifie si un signal devrait Ãªtre exÃ©cutÃ© basÃ© sur la tendance

        Args:
            signal: Le signal de trading Ã  vÃ©rifier

        Returns:
            Tuple: (allowed, reason)
        r   ÚsideÚ )FzSignal invalideÚLONGr#   éF   Fu   Tendance BEARISH trÃ¨s forte (z.0fu   %), LONG trop risquÃ©r0   r4   r   éýÿÿÿz)Tendance BEARISH forte + prix sous MA20 (r8   u   %), LONG refusÃ©TzTendance BEARISH (u$   %) mais prix correct, LONG autorisÃ©z	Tendance ú (u   %), LONG autorisÃ©ÚSHORTr!   u   Tendance BULLISH trÃ¨s forte (u   %), SHORT trop risquÃ©é   u*   Tendance BULLISH mais prix survalorisÃ© (+u   % vs MA20), SHORT autorisÃ©õ3   Tendance BULLISH forte + prix normal, SHORT refusÃ©u   %), SHORT autorisÃ©)Tu   Signal autorisÃ© par dÃ©fautN)Fr–   )ÚgetÚupperrW   )r   r�   r   rŽ   r    r"   rT   r4   r   r   r   Úshould_allow_signalå   s0   
z!TrendDetector.should_allow_signalc                 C   s\   |   |¡\}}}|dkr|dkrdS |dkrdS dS |dkr,|dkr$dS |dkr*d	S d
S dS )u8   Donne une recommandation basÃ©e sur la tendance actueller!   é<   u&   STRONG_BUY - Tendance haussiÃ¨re forter$   u#   BUY - Tendance haussiÃ¨re modÃ©rÃ©eu%   WEAK_BUY - Tendance haussiÃ¨re faibler#   u'   STRONG_SELL - Tendance baissiÃ¨re forteu$   SELL - Tendance baissiÃ¨re modÃ©rÃ©eu&   WEAK_SELL - Tendance baissiÃ¨re faibleu#   HOLD - MarchÃ© sans tendance claire)rW   )r   r   r    r"   rT   r   r   r   Úget_trend_recommendation  s   z&TrendDetector.get_trend_recommendation)N)r%   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   rJ   r   r…   r   rW   ÚlistrB   r�   r@   Úboolr™   r›   r   r   r   r   r	      s    Y=23r	   c               
   C   sH  t dƒ ddlm}  | ƒ }t|ƒ}g d¢}|D ]Š}t d|› d�ƒ t dƒ | |¡\}}}t d|› �ƒ t d	|d
›d�ƒ t d| |¡› �ƒ |ddœ}|ddœ}	| |¡\}
}| |	¡\}}t d|
rednd› d|› �ƒ t d|rsdnd› d|› �ƒ d|v r¡t dƒ |d  ¡ D ]\}}t d|› d|d › d|d d›d�ƒ q‰qdS )u   Test le dÃ©tecteur de tendanceu$   === TEST DÃ‰TECTEUR DE TENDANCE ===
r   r   )ÚBNBÚBTCÚETHÚSOLÚ
ú:z(----------------------------------------z
Tendance: zForce: r8   r;   zRecommandation: r�   )r   rŽ   r”   z
Signal LONG: ÚOKÚBLOCKEDz - zSignal SHORT: r6   z
Analyse par timeframe:z  r<   r    r“   rX   z+.2fr9   N)Úprintr
   r   r	   rW   r›   r™   rC   )r   ÚclientÚdetectorÚsymbolsr   r    r"   rT   Úlong_signalÚshort_signalÚlong_allowedÚlong_reasonÚshort_allowedÚshort_reasonÚtfr‹   r   r   r   Útest_trend_detector/  s0   

(€érµ   Ú__main__)rŸ   r   r   r   Útypingr   r   r   ÚsysÚosÚpathr„   r
   r   r	   rµ   rœ   r   r   r   r   Ú<module>   s      #&
ÿ