o
    T¡ÝhÖ  ã                
   @   sÒ   d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
mZmZ e e¡ZG dd„ dƒZzddl	mZ eed�Ze d	¡ W dS  eyh Z ze d
e› �¡ eƒ Ze d¡ W Y dZ[dS dZ[ww )u‚   
Client Hyperliquid pour rÃ©cupÃ©rer les balances et positions rÃ©elles
Version amÃ©liorÃ©e avec patterns Ã©prouvÃ©s de l'archive
é    N)ÚDictÚListÚOptional)ÚMASTER_ACCOUNT_ADDRESSÚBASE_URLÚDEFAULT_HEADERSc                   @   sâ  e Zd ZdZdbdedefdd„Zdedee fd	d
„Zdee fdd„Z	deee
f fdd„Zdee fdd„Zdee fdd„Zdedee
 fdd„Zdedefdd„Zdeeef fdd„Zdefdd„Zdede
fdd„Zdeeef fdd„Zdefdd „Zdcded"ed#e
d$ed%ed&edefd'd(„Zddd*ed+edee fd,d-„Zdeded/e
d0edee
 fd1d2„Zd3ee dee fd4d5„Zd6e
d7e
defd8d9„Zd:e
d;e
d#e
d<ede
f
d=d>„Zdfd:e
d@e
d#e
d<ed%edefdAdB„Zdgd+edee fdCdD„ZdhdedGedHedeee  fdIdJ„Z didKedLedHedee
 fdMdN„Z!didedHedee
 fdOdP„Z"dgd+edee fdQdR„Z#dee fdSdT„Z$dedUe
defdVdW„Z%dbdXedYe
dZe
defd[d\„Z&dbdXed]edefd^d_„Z'djdedee fd`da„Z(dS )kÚHyperliquidClientu8   Client Hyperliquid avec patterns Ã©prouvÃ©s de l'archiveNÚapi_wallet_keyÚmaster_accountc              
   C   sX  t | _|pt| _t| _|| _z$ddlm} ddl	m
} ||jdd�| _t d| jdd… › d	�¡ W n tyO } zt d
|› �¡ d| _W Y d}~nd}~ww d| _z:ddlm} ddl	m
} ddlm} ddlm} |po|}	|	r†| |	¡}
||
|jƒ| _t d¡ W dS t d¡ W dS  ty« } zt d|› �¡ d| _W Y d}~dS d}~ww )uØ   
        Initialise le client Hyperliquid
        
        Args:
            api_wallet_key: ClÃ© privÃ©e du wallet API (pour signer)
            master_account: Adresse du compte maÃ®tre (pour les donnÃ©es)
        r   )ÚInfo)Ú	constantsT)Úskip_wsu,   Client Hyperliquid initialisÃ© pour compte: Né   z...z Erreur initialisation Info API: )ÚExchange©ÚAPI_WALLET_PRIVATE_KEY)ÚAccountu;   âœ… Exchange API initialisÃ© avec succÃ¨s pour trading liveu7   âš ï¸� Pas de clÃ© privÃ©e fournie - mode lecture seuleu(   â�Œ Erreur initialisation Exchange API: )r   Úbase_urlr   Úaccount_addressr   Úheadersr	   Úhyperliquid.infor   Úhyperliquid.utilsr   ÚMAINNET_API_URLÚinfoÚloggerÚ	ExceptionÚerrorÚexchangeÚhyperliquid.exchanger   Úhyperliquid_configr   Úeth_accountr   Úfrom_keyÚwarning)Úselfr	   r
   r   r   Úer   r   r   Ú
wallet_keyÚwallet_account© r'   ú=/var/www/html/HyperOracle/crypto_trader/hyperliquid_client.pyÚ__init__   sD   
 €þ
þ€þzHyperliquidClient.__init__ÚpayloadÚreturnc              
   C   sd   zt j| j› d�| j|dd�}| ¡  | ¡ W S  ty1 } ztd|› �ƒ W Y d}~dS d}~ww )u,   Effectue une requÃªte vers l'API Hyperliquidú/infoé
   )r   ÚjsonÚtimeoutu   Erreur requÃªte Hyperliquid: N)ÚrequestsÚpostr   r   Úraise_for_statusr.   r   Úprint)r#   r*   Úresponser$   r'   r'   r(   Ú_make_requestE   s   
ü
€þzHyperliquidClient._make_requestc              
   C   s�   z"| j st d¡ W dS | j  | j¡}|r t dt|ƒ› d�¡ |W S  tyG } zt d|› �¡ d| jdœ}|  |¡W  Y d}~S d}~ww )u?   RÃ©cupÃ¨re l'Ã©tat du compte utilisateur via l'API Info moderneúInfo API non disponibleNu   Ã‰tat utilisateur rÃ©cupÃ©rÃ©: z champsu)   Erreur rÃ©cupÃ©ration Ã©tat utilisateur: ÚclearinghouseState)ÚtypeÚuser)	r   r   r   Ú
user_stater   ÚdebugÚlenr   r5   )r#   r:   r$   r*   r'   r'   r(   Úget_user_stateT   s    
þ€ùz HyperliquidClient.get_user_statec              
   C   sz  z |   ¡ }|st d¡ i W S i }| di ¡}| di ¡}|rFt| dd¡ƒ}t| dd¡ƒ}||d< ||d< t d	|d
›d|d
›d�¡ n|r`t| dd¡ƒ}t| dd¡ƒ}||d< ||d< | dd¡}t|ƒ|d< d|v rž|d  dg ¡}|D ]#}	|	 dd¡}
t|	 dd¡ƒ}|dkr�|||
< t d|
› d|› �¡ qz|W S  ty¼ } zt d|› �¡ i W  Y d}~S d}~ww )u8   RÃ©cupÃ¨re les balances du compte avec format amÃ©liorÃ©õ-   Impossible de rÃ©cupÃ©rer l'Ã©tat utilisateurÚmarginSummaryÚcrossMarginSummaryÚaccountValueÚ0ÚtotalRawUsdÚUSDCÚUSDC_availablezBalance principale: $ú.2fz (disponible: $ú)ÚcrossMaintenanceMarginUsedÚUSDC_margin_usedÚspotUserÚbalancesÚcoinÚ Útotalr   zBalance spot ú: u    Erreur rÃ©cupÃ©ration balances: N)r=   r   r"   ÚgetÚfloatr;   r   r   )r#   r:   rK   Úmargin_summaryÚcross_margin_summaryÚaccount_valueÚtotal_raw_usdÚcross_margin_usedÚspot_balancesÚbalanceÚtokenrN   r$   r'   r'   r(   Úget_balancesi   sH   
€€þzHyperliquidClient.get_balancesc                 C   s  |   ¡ }|sg S g }| dg ¡}|D ]o}| di ¡}| dd¡}t| dd¡ƒ}|dkr�t| dd¡ƒ}t| d	| d	d¡¡ƒ}	t d
|› d�¡ t d|› �¡ t d|› �¡ | dd¡}
|
sg| dd¡}
| |› d�|dkrsdndt|ƒ||	d|
||dœ	¡ q|S )u!   RÃ©cupÃ¨re les positions ouvertesÚassetPositionsÚpositionrL   rM   ÚszirB   r   ÚentryPxÚunrealizedPnlú	Position u    - DonnÃ©es complÃ¨tes:z  position_info: z  pos: ÚleverageNú-PERPÚLONGÚSHORTÚ	perpetual)	ÚsymbolÚsideÚsizeÚentry_priceÚunrealized_pnlr8   ra   Úraw_position_dataÚraw_asset_data)r=   rP   rQ   r   r;   ÚappendÚabs)r#   r:   Ú	positionsÚasset_positionsÚposÚposition_inforL   rh   Úentry_pxrj   ra   r'   r'   r(   Úget_positions—   s>   ÷€zHyperliquidClient.get_positionsc                 C   s   ddi}|   |¡S )u>   RÃ©cupÃ¨re les informations meta (leverages disponibles, etc.)r8   Úmeta)r5   )r#   r*   r'   r'   r(   Úget_meta_infoÄ   s   
zHyperliquidClient.get_meta_inforf   c              
   C   sÔ   zK|  dd¡}| j ¡ }t|ƒdk rW dS |d d }|d }d}t|ƒD ]\}}|d |kr3|} nq%|durI|t|ƒk rIt|| d	 ƒ}	|	W S W dS  tyi }
 zt d
|› d|
› �¡ W Y d}
~
dS d}
~
ww )u2   RÃ©cupÃ¨re le mark price actuel depuis HyperliquidÚUSDTrM   é   Nr   Úuniverseé   ÚnameÚmarkPxu!   Erreur rÃ©cupÃ©ration mark price rO   )	Úreplacer   Úmeta_and_asset_ctxsr<   Ú	enumeraterQ   r   r   r   )r#   rf   Úclean_symbolÚmeta_and_ctxsry   Ú
asset_ctxsÚsymbol_indexÚiÚassetÚ
mark_pricer$   r'   r'   r(   Úget_current_market_priceÉ   s,   
þ€þz*HyperliquidClient.get_current_market_pricec                 C   sH   |   ¡ }|r
d|vrdS |d D ]}| d¡|kr!| dd¡  S qdS )uK   RÃ©cupÃ¨re le nombre de dÃ©cimales autorisÃ©es pour un symbole (szDecimals)ry   é   r{   Ú
szDecimals)rv   rP   )r#   rf   Ú	meta_infoÚ
token_infor'   r'   r(   Úget_symbol_decimalsç   s   ÿz%HyperliquidClient.get_symbol_decimalsc                 C   sZ   |   ¡ }|r
d|vri S i }|d D ]}d|v r*d|v r*|d }t|d ƒ}|||< q|S )u>   RÃ©cupÃ¨re les leverages maximum disponibles pour chaque tokenry   r{   ÚmaxLeverage)rv   Úint)r#   rŠ   Ú	leveragesr‹   rf   Úmax_leverager'   r'   r(   Úget_available_leveragesó   s   €z)HyperliquidClient.get_available_leveragesc              
   C   s€   z%|   ¡ }|s
W dS d}|D ]}tt| dd¡ƒƒ}|dkr"|d7 }q|W S  ty? } ztd|› �ƒ W Y d}~dS d}~ww )u9   RÃ©cupÃ¨re le nombre de positions actives sur Hyperliquidr   rh   rz   u9   Erreur lors de la rÃ©cupÃ©ration du nombre de positions: N)rt   rn   rQ   rP   r   r3   )r#   ro   Úactive_countrq   rh   r$   r'   r'   r(   Úget_active_positions_count  s    €€þz,HyperliquidClient.get_active_positions_countc              
   C   sø   z^| j › d�}ddi}tj||d�}|jdkrW dS | ¡ }t|ƒdk r'W dS |d d	 }|d
 }d}t|ƒD ]\}	}
|
 d¡|krF|	} nq7|dksQ|t|ƒkrTW dS t|| d ƒ}|W S  t	y{ } zt
d|› d|› �ƒ W Y d}~dS d}~ww )u/   RÃ©cupÃ¨re le mark price actuel pour un symboler,   r8   ÚmetaAndAssetCtxs)r.   éÈ   ç        rx   r   ry   rz   éÿÿÿÿr{   r|   u&   Erreur rÃ©cupÃ©ration mark price pour rO   N)r   r0   r1   Ústatus_coder.   r<   r   rP   rQ   r   r3   )r#   rf   Úurlr*   r4   r�   ry   r‚   rƒ   r„   r‹   r†   r$   r'   r'   r(   r‡     s4   
þ€þc           	      C   sð   z\|   ¡ }|s
i W S i }|D ]K}tt| dd¡ƒƒ}|dkrY| dd¡ dd¡}| dd¡ ¡ }|› d|› �}|||t| dd¡ƒt| d	d¡ƒt| d
i ¡ dd¡ƒ|dœ||< q|W S  tyw } ztd|› �ƒ i W  Y d}~S d}~ww )uG   RÃ©cupÃ¨re les dÃ©tails des positions actives groupÃ©es par symbol_siderh   r   rf   rM   rb   rg   Ú_ri   rj   ra   Úvaluerz   )rf   rg   rh   ri   rj   ra   Úraw_datau<   Erreur lors de la rÃ©cupÃ©ration des dÃ©tails de positions: N)	rt   rn   rQ   rP   r}   ÚupperrŽ   r   r3   )	r#   ro   Úactive_positionsrq   rh   rf   rg   Úkeyr$   r'   r'   r(   Úget_active_positions_details9  s4   
ù€
€þz.HyperliquidClient.get_active_positions_detailsc           
      C   sÜ   zG|   ¡ }|  ¡ }|  ¡ }| dd¡}| dd¡}|| }tdd„ |D ƒƒ}tdd„ |D ƒƒ}|||||||| j|rC| dd¡d	œ	W S dd	œ	W S  tym }	 ztd
|	› �ƒ dddddg i t	|	ƒdœW  Y d}	~	S d}	~	ww )u+   RÃ©cupÃ¨re un rÃ©sumÃ© complet du portfoliorD   r   rI   c                 s   s   � | ]}|d  V  qdS )rj   Nr'   )Ú.0rq   r'   r'   r(   Ú	<genexpr>d  s   € z:HyperliquidClient.get_portfolio_summary.<locals>.<genexpr>c                 S   s   g | ]
}|d  dkr|‘qS )rh   r   r'   )r¡   Úpr'   r'   r(   Ú
<listcomp>g  s    z;HyperliquidClient.get_portfolio_summary.<locals>.<listcomp>Útime)	rT   Úavailable_balanceÚmargin_usedrj   rž   ro   rK   r   Ú	timestampzErreur portfolio summary: )rT   r¦   r§   rj   rž   ro   rK   r   N)
rZ   rt   r=   rP   Úsumr<   r   r   r3   Ústr)
r#   rK   ro   r:   Útotal_account_valuer§   r¦   Útotal_unrealized_pnlÚactive_positions_countr$   r'   r'   r(   Úget_portfolio_summaryW  sD   ÷	÷ø€þz'HyperliquidClient.get_portfolio_summaryFÚis_buyrh   Úreduce_onlyra   Ú	order_tagc                 C   sx  �z| j sd}t |¡ d|dœW S |dkr&d|› �}t |¡ d|dœW S | dd¡ dd¡}t d	|› d
|r:dnd› d
|› �|rHd|› d�nd |rNdnd ¡ |r«|dkr«|s«z6t d|› d|› d�¡ | j jt|ƒ|dd�}	t d|	› �¡ |	r�|	 d¡dkr�t d|	 dd¡› �¡ W n t	yª }
 zt d|
› �¡ W Y d}
~
nd}
~
ww |  
|¡}t||ƒ}||krËt d|› d|› d|› d |› d!�	¡ |så|rÑdnd}d"|› d#|› �}|råd$|› d#|› �}t d%|› d
|› d&|› d'|› d(|› �
¡ t d)|› d
|› d(|› d*�¡ z| j j|||d+|d,�}W n% t	�y: } zt d-|› �¡ | j j|||d+d.�}W Y d}~nd}~ww t d/|› �¡ |�rút|tƒ�rú| d¡dk�rv| dd¡}d0t|ƒv �rgd1|› d2�}t d3|› �¡ d||d4œW S | d¡d5k�r÷| d6i ¡ di ¡ d7i ¡}| d8g ¡}|D ]"}| d9¡�rµ| d9¡}t d:|› �¡ dd;|› �|d4œ  W S �q”| di ¡ d7i ¡}| d8g ¡}d}|�rÛ|d  d<¡�pÚ|d  d=¡}t d>|› d?�¡ d@|||||�rîdnd|t ¡ dAœW S W dS | di ¡ d9t|ƒ¡}dB|› �}t |¡ d||d4œW S  t	�y; }
 zdC|
› �}t |¡ d|t|
ƒdDœW  Y d}
~
S d}
~
ww )Eu6  
        Place un ordre au marchÃ© sur Hyperliquid avec gestion d'erreurs amÃ©liorÃ©e
        
        Args:
            symbol: Symbole du token (ex: "BTC", "ETH")
            is_buy: True pour acheter, False pour vendre
            size: Taille de l'ordre
            reduce_only: True pour fermer une position seulement
            leverage: Effet de levier Ã  appliquer (ex: 3, 5, 10)
            order_tag: Tag/label pour identifier l'ordre (ex: "AUTO_BUY_SIGNAL", "CLOSE_TP")
            
        Returns:
            Dict avec le rÃ©sultat de l'ordre
        u>   Exchange API non initialisÃ© - impossible de passer des ordresF©Úsuccessr   r   zTaille d'ordre invalide: rb   rM   z-USDu   LIVE: Passage ordre marchÃ© Ú ÚBUYÚSELLz
 leverage Úxz (reduce_only)rz   u   DÃ©finition leverage zx pour z en mode ISOLATED)ra   r{   Úis_crossu   Leverage dÃ©fini: ÚstatusÚerrzErreur leverage: r4   úErreur inconnueu   Erreur dÃ©finition leverage: NzTaille arrondie rO   z -> z (u    dÃ©cimales)ÚAUTO_rš   ÚCLOSE_zEnvoi ordre Hyperliquid: z taille=z tag=z reduce_only=zOrdre z": market_open() avec slippage 0.5%g{®Gázt?)r{   r¯   ÚszÚslippageÚcloidu#   Tag non supportÃ©, ordre sans tag: )r{   r¯   r¾   r¿   u   RÃ©sultat ordre: zdoes not existu   API Wallet non autorisÃ©: z4 - Veuillez enregistrer l'API wallet sur HyperliquidzErreur API Hyperliquid: ©r³   r   ÚresultÚokrÂ   ÚdataÚstatusesr   zErreur ordre Hyperliquid: zErreur ordre: ÚrestingÚfilledu*   SUCCES: Ordre exÃ©cutÃ© avec succÃ¨s (ID: rG   T)r³   Úorder_idrÅ   rÂ   rf   rg   rh   r¨   u   Ordre rejetÃ©: z)Erreur critique lors du passage d'ordre: ©r³   r   Ú	exception)r   r   r   r}   r   Úupdate_leveragerŽ   rP   r"   r   rŒ   ÚroundÚmarket_openÚ
isinstanceÚdictrª   r¥   )r#   rf   r¯   rh   r°   ra   r±   Ú	error_msgr€   Úleverage_resultr$   ÚdecimalsÚrounded_sizeÚactionÚorder_resultÚ	tag_errorÚresponse_datarÅ   r¹   rÈ   Úerror_detailsr'   r'   r(   Úplace_market_order‚  sê   
þ

 ÿ
þý€€ÿ

$(
ûü€þ	ý
ýýøè#

ý

ý€ýz$HyperliquidClient.place_market_orderéd   Úuser_addressÚlimitc              
   C   s´   z=| j st d¡ g W S |p| j}| j  |¡}|r6t|dd„ dd�}|d|… }t dt|ƒ› d�¡ |W S t d	¡ g W S  tyY } zt d
|› �¡ g W  Y d}~S d}~ww )u?  
        RÃ©cupÃ¨re les informations de fills (ordres exÃ©cutÃ©s) rÃ©cents
        
        Args:
            user_address: Adresse utilisateur (utilise self.account_address par dÃ©faut)
            limit: Nombre maximum de fills Ã  rÃ©cupÃ©rer
            
        Returns:
            List des fills rÃ©cents
        r6   c                 S   s   |   dd¡S )Nr¥   r   ©rP   ©r·   r'   r'   r(   Ú<lambda>:  s    z1HyperliquidClient.get_fill_info.<locals>.<lambda>T©rŸ   ÚreverseNõ   RÃ©cupÃ©rÃ© u    fills rÃ©centsu   Aucun fill trouvÃ©u   Erreur rÃ©cupÃ©ration fills: )	r   r   r   r   Ú
user_fillsÚsortedr;   r<   r   )r#   rÛ   rÜ   Ú	user_addrÚfillsÚfills_sortedÚfills_limitedr$   r'   r'   r(   Úget_fill_info#  s$   


€þzHyperliquidClient.get_fill_infoé   Ú
order_timeÚtolerance_secondsc              
   C   s´   z?|   ¡ }|D ].}| d¡|kr5t| dd¡d | ƒ|kr5t| dd¡ƒ}td|› d|› �ƒ |  W S qtd|› �ƒ W d	S  tyY } ztd
|› �ƒ W Y d	}~d	S d	}~ww )uh  
        RÃ©cupÃ¨re le prix d'exÃ©cution rÃ©el depuis les fills rÃ©cents
        
        Args:
            symbol: Symbole recherchÃ©
            order_time: Timestamp de l'ordre (epoch)
            tolerance_seconds: TolÃ©rance en secondes pour trouver le fill
            
        Returns:
            Prix d'exÃ©cution rÃ©el ou None si non trouvÃ©
        rL   r¥   r   éè  Úpxu   Prix d'exÃ©cution trouvÃ©: õ    Ã  $u.   WARNING: Aucun prix d'exÃ©cution trouvÃ© pour Nu0   ERROR: Erreur rÃ©cupÃ©ration prix d'exÃ©cution: )ré   rP   rn   rQ   r3   r   )r#   rf   rë   rì   ræ   ÚfillÚexecution_pricer$   r'   r'   r(   Úget_execution_price_from_fillsG  s    
€€þz0HyperliquidClient.get_execution_price_from_fillsÚtradesc           
      C   sò  g }i }t |dd„ d�}|D ]¦}|d }| dd¡}|dks(dt| d	d¡ƒv r8||vr0g ||< ||  |¡ q|d
ksFdt| d	d¡ƒv r´||v r´|| r´||  d¡}d|d › d|d › �||d dkridnd|d |d |d |d |d |  |d |d ¡| dd¡p | j|d |d |d |d dkr›dndd�d | dd¡| dd¡ ddœ}	| |	¡ q| ¡ D ]=\}}|D ]6}d|d › �||d dkrÐdnd|d d|d |d d|  |d t ¡ ¡d| dd¡dddœ}	| |	¡ q¿q¹|S ) u”   
        Regroupe les trades individuels en positions complÃ¨tes
        Une position = un trade OPEN + un trade CLOSE sur le mÃªme symbole
        c                 S   s   | d S )Nr¨   r'   rÞ   r'   r'   r(   rß   o  s    z=HyperliquidClient.group_trades_to_positions.<locals>.<lambda>)rŸ   rf   Ú	operationrM   ÚOPENÚOpenÚdirÚCLOSEÚCloser   Úpos_Úidrš   rg   rµ   rc   rd   Úpricerh   r¨   Úpnl)ri   Úcurrent_pricerh   rg   Ú
pnl_dollarÚfeeÚHYPERLIQUID)rû   rf   rg   ri   Ú
exit_pricerh   Ú	open_timeÚ
close_timeÚdurationrý   ÚfeesÚsourceÚ	pos_open_N)rû   rf   rg   ri   r  rh   r  r  r  rý   r  r¹   r  )	rä   rP   rª   rm   ÚpopÚ_calculate_durationÚcalculate_position_pnlÚitemsr¥   )
r#   ró   ro   Úopen_tradesÚsorted_tradesÚtraderf   rô   Ú
open_trader\   r'   r'   r(   Úgroup_trades_to_positionsf  sl   üûï
€
óïz+HyperliquidClient.group_trades_to_positionsÚ
start_timeÚend_timec                 C   sV   t || ƒ}|d }|d d }|d }|dkr#|› d|› d|› d�S |› d|› d�S )u'   Calcule la durÃ©e entre deux timestampsi  é<   r   zh zm Ús)rŽ   )r#   r  r  Úduration_secondsÚhoursÚminutesÚsecondsr'   r'   r(   r
  ®  s   z%HyperliquidClient._calculate_durationri   r  rg   c                 C   s    |dkr
|| | S || | S )zCalcule le PnL d'une positionrµ   r'   )r#   ri   r  rh   rg   r'   r'   r(   Ú_calculate_pnlº  s   z HyperliquidClient._calculate_pnlrz   rþ   c           	      C   s|   |dks|dkrddddœS |dkr|| | }n|| | }|dkr,|| | d }n|| | d }|| }|||dœS )uº  
        Calcule le PnL d'une position de maniÃ¨re centralisÃ©e
        UtilisÃ© par ProfitTaker et l'historique pour garantir la cohÃ©rence

        Args:
            entry_price: Prix d'entrÃ©e
            current_price: Prix actuel (ou de sortie)
            size: Taille de la position
            side: 'LONG' ou 'SHORT'
            leverage: Levier utilisÃ©

        Returns:
            dict avec pnl_dollar, pnl_percent, etc.
        r   r–   )rÿ   Úpnl_percentÚpnl_percent_leveragedrc   rÚ   r'   )	r#   ri   rþ   rh   rg   ra   rÿ   r  r  r'   r'   r(   r  Á  s    ýýz(HyperliquidClient.calculate_position_pnlc              
   C   st   z| j |d d�}|  |¡}|jdd„ dd� |d|… W S  ty9 } zt d|› �¡ g W  Y d}~S d}~ww )	uš   
        RÃ©cupÃ¨re l'historique des positions (trades regroupÃ©s)
        
        Returns:
            Liste des positions fermÃ©es et ouvertes
        rx   ©rÜ   c                 S   s   |   d¡p
|   dd¡S )Nr  r  r   rÝ   rÞ   r'   r'   r(   rß   û  s    z8HyperliquidClient.get_position_history.<locals>.<lambda>Trà   Nu,   Erreur rÃ©cupÃ©ration historique positions: )Úsync_trade_historyr  Úsortr   r   r   )r#   rÜ   ró   ro   r$   r'   r'   r(   Úget_position_historyì  s   
€þz&HyperliquidClient.get_position_historyÚ1hé   ÚintervalÚlookback_hoursc                 C   s   zðddl }ddl}ddl}t|  ¡ d ƒ}||d d d  }d||||dœdœ}	|jd|	d	d
�}
|
jdkrLt d|› d�¡ | d¡ |jd|	d	d
�}
|
jdkr`t 	d|
j› d|› �¡ W dS |
 ¡ }|rj|dkrut d|› �¡ W dS g }|D ]g}t
|tƒr±| t| dd¡ƒt| dd¡ƒt| dd¡ƒt| dd¡ƒt| dd¡ƒt| dd¡ƒdœ¡ qyt
|tƒràt|ƒdkrà| t|d ƒt|d ƒt|d ƒt|d ƒt|d ƒt|d ƒdœ¡ qyt dt|ƒ› d |› �¡ |W S  t�y } zt 	d!|› d"|› �¡ W Y d}~dS d}~ww )#u�  
        RÃ©cupÃ¨re les donnÃ©es de chandeliers pour un symbole
        
        Args:
            symbol: Symbole (ex: 'BTC', 'ETH')
            interval: Intervalle de temps ('1m', '5m', '15m', '1h', '4h', '1d')
            lookback_hours: Nombre d'heures Ã  rÃ©cupÃ©rer
            
        Returns:
            Liste des chandeliers avec 'time', 'open', 'high', 'low', 'close', 'volume'
        r   Nrí   r  ÚcandleSnapshot)rL   r#  Ú	startTimeÚendTime)r8   Úreqz https://api.hyperliquid.xyz/infor-   )r.   r/   i­  zRate limit atteint pour z, pause de 2 secondesrx   r•   zErreur HTTP z pour u   Aucune donnÃ©e chandelier pour ÚtÚoÚhÚlÚcÚv)r¥   ÚopenÚhighÚlowÚcloseÚvolumerˆ   rz   é   é   é   râ   z chandeliers pour u"   Erreur rÃ©cupÃ©ration chandeliers rO   )r¥   r0   r.   rŽ   r1   r˜   r   r"   Úsleepr   rÎ   rÏ   rm   rP   rQ   Úlistr<   r;   r   )r#   rf   r#  r$  Útime_moduler0   r.   r  r  r*   r4   ÚcandlesÚformatted_candlesÚcandler$   r'   r'   r(   Úget_candles_data  sj   üþ





ú





ú€	€þz"HyperliquidClient.get_candles_dataÚsymbol1Úsymbol2c                    sL  �z| j |d|d�}| j |d|d�}|r|s$t d|› d|› �¡ W dS i ‰i ‰|D ]
}|d ˆ|d < q*|D ]
}|d ˆ|d < q7ttˆ ¡ ƒtˆ ¡ ƒ@ ƒ}t|ƒdk rdt d	|› d|› �¡ W dS ‡fd
d„|D ƒ‰ ‡fdd„|D ƒ‰‡ fdd„tdtˆ ƒƒD ƒ‰‡fdd„tdtˆƒƒD ƒ‰tˆƒdk r›W dS ddl}| 	ˆ¡‰| 	ˆ¡‰t
‡‡‡‡fdd„ttˆƒƒD ƒƒ}	t
‡‡fdd„ttˆƒƒD ƒƒ}
t
‡‡fdd„ttˆƒƒD ƒƒ}|
| d }|dkrèW dS |	| }t d|› d|› d|d›dtˆƒ› d�	¡ |W S  t�y% } zt d|› d|› d|› �¡ W Y d}~dS d}~ww )uG  
        Calcule la corrÃ©lation entre deux symboles
        
        Args:
            symbol1: Premier symbole (ex: 'BTC')
            symbol2: Second symbole (ex: 'ETH') 
            lookback_hours: PÃ©riode de calcul en heures
            
        Returns:
            CorrÃ©lation entre -1 et 1, ou None si erreur
        r!  )r#  r$  u&   DonnÃ©es manquantes pour corrÃ©lation Ú-Nr2  r¥   rx   u$   Pas assez de donnÃ©es communes pour c                    ó   g | ]}ˆ | ‘qS r'   r'   ©r¡   r)  )Úprices1r'   r(   r¤   |  ó    z;HyperliquidClient.calculate_correlation.<locals>.<listcomp>c                    rA  r'   r'   rB  )Úprices2r'   r(   r¤   }  rD  c                    ó,   g | ]}ˆ | ˆ |d    ˆ |d    ‘qS ©rz   r'   ©r¡   r„   )Úaligned_prices1r'   r(   r¤   €  ó    $ÿrz   c                    rF  rG  r'   rH  )Úaligned_prices2r'   r(   r¤   ‚  rJ  r   c                 3   s(   � | ]}ˆ| ˆ  ˆ| ˆ  V  qd S ©Nr'   rH  )Úmean1Úmean2Úreturns1Úreturns2r'   r(   r¢   Ž  s   €& z:HyperliquidClient.calculate_correlation.<locals>.<genexpr>c                 3   ó    � | ]}ˆ| ˆ  d  V  qdS ©rx   Nr'   rH  )rM  rO  r'   r(   r¢   �  ó   € c                 3   rQ  rR  r'   rH  )rN  rP  r'   r(   r¢   ‘  rS  g      à?r–   u   CorrÃ©lation rO   z.3fz sur u
    pÃ©riodesu   Erreur calcul corrÃ©lation )r=  r   r"   rä   ÚsetÚkeysr<   ÚrangeÚ
statisticsÚmeanr©   r;   r   r   )r#   r>  r?  r$  Úcandles1Úcandles2r<  Úcommon_timesrW  Ú	numeratorÚsum_sq1Úsum_sq2ÚdenominatorÚcorrelationr$   r'   )rI  rK  rM  rN  rC  rE  rO  rP  r(   Úcalculate_correlationU  sV   
ÿ
ÿ

$  *€þz'HyperliquidClient.calculate_correlationc                 C   s   |dkrdS |   d||¡S )u  
        Calcule la corrÃ©lation entre BTC et un autre symbole
        
        Args:
            symbol: Symbole Ã  comparer avec BTC
            lookback_hours: PÃ©riode de calcul
            
        Returns:
            CorrÃ©lation avec BTC (-1 Ã  1) ou None
        ÚBTCg      ð?)ra  )r#   rf   r$  r'   r'   r(   Úget_btc_correlation¡  s   z%HyperliquidClient.get_btc_correlationc                 C   sP  z‹| j |d�}|st d¡ g W S g }|D ]h}| dd¡d }| d¡dkr(dnd	}| d
d¡}d|v r6dnd}d| dd¡› �| dd¡||t| dd¡ƒt| dd¡ƒ|t| dd¡ƒ| d¡rjt| dd¡ƒnd| d¡| d¡d|dœ}	| |	¡ qt dt|ƒ› d�¡ |W S  ty§ }
 zt d|
› �¡ g W  Y d}
~
S d}
~
ww )u	  
        RÃ©cupÃ¨re l'historique des trades Hyperliquid et les convertit au format du systÃ¨me
        
        Args:
            limit: Nombre maximum de fills Ã  rÃ©cupÃ©rer
            
        Returns:
            Liste des trades au format du systÃ¨me
        r  u&   Aucun fill Hyperliquid Ã  synchroniserr¥   r   rí   rg   ÚBrµ   r¶   r÷   rM   rö   rõ   rø   Úhl_ÚoidrL   r¾   rî   r   Ú	closedPnlNÚhashr  )rû   rf   rg   rô   rh   rü   r¨   r   rý   rÈ   rh  r  Úraw_fillu   SynchronisÃ© z trades depuis Hyperliquidz#Erreur synchronisation historique: )	ré   r   r   rP   rQ   rm   r<   r   r   )r#   rÜ   ræ   Úsynced_tradesrð   r¨   rg   Ú	directionÚoperation_typer  r$   r'   r'   r(   r  ±  sB   


ó€þz$HyperliquidClient.sync_trade_historyc              
   C   sZ   z|   ¡ }|st d¡ W dS |W S  ty, } zt d|› �¡ W Y d}~dS d}~ww )u¹   
        RÃ©cupÃ¨re l'Ã©tat complet du compte Hyperliquid
        Compatible avec l'API dashboard
        
        Returns:
            Dict avec marginSummary, positions, etc.
        r>   Nu$   Erreur rÃ©cupÃ©ration Ã©tat compte: )r=   r   r"   r   r   )r#   r:   r$   r'   r'   r(   Úget_account_stateè  s   
€þz#HyperliquidClient.get_account_stateÚstop_loss_pricec                 C   s¾  �z¬| j sdddœW S | dd¡}tt|ƒdƒ}t d|› d|d	›�¡ |  ¡ }d
}|D ]}| dd¡ dd¡|kr>|} nq,|sKdd|› d�dœW S t| dd¡ƒ}|dkradd|› d�dœW S |dkrjd}	d}
nd}	d}
t|ƒ}t d|
› d|› d|› d|› �¡ zZ| jrŽ| j 	| j
¡ng }|rÜ|D ]G}| d¡|krÛ| dd¡rÛ| d¡}|rÛz| j  |t|ƒ¡ t d|› �¡ W q” tyÚ } zt d|› d|› �¡ W Y d
}~q”d
}~ww q”W n ty÷ } zt d|› �¡ W Y d
}~nd
}~ww z‚| j j||	||dt|ƒddd œidd!�}t d"|› �¡ |�r,| d#¡d$k�r,d|||
||d%d&œW W S d}|�rWd'|v �rWd(|d' v �rW|d' d( }d)|v �rW|d) �rW|d) d  d*d+¡}t d,|› �¡ t d-|› d.|d	›�¡ d|||
|dd/d0|› �d1œW W S  t�y­ } z&t d2|› �¡ t d-|› d.|d	›�¡ d|||
|dd/d3d1œW  Y d
}~W S d
}~ww  t�yÞ } z$t|ƒ d4d5¡ d6d7¡}d8|› �}t |¡ d|t|ƒd9œW  Y d
}~S d
}~ww ):uv  
        Met Ã  jour le stop loss d'une position en crÃ©ant un ordre stop limit
        Utilise exchange.order() pour crÃ©er un ordre de protection
        
        Args:
            symbol: Symbole du token (ex: "BTC", "ETH")
            stop_loss_price: Nouveau prix de stop loss
            
        Returns:
            Dict avec le rÃ©sultat de la mise Ã  jour
        FúExchange API non disponibler²   rb   rM   rx   u   CrÃ©ation ordre stop loss: z stop=$rF   Nrf   r`   u    non trouvÃ©erh   r   u    fermÃ©eÚSellTÚBuyzOrdre stop: r´   z @ $rL   Ú
reduceOnlyrf  u   AnnulÃ© ordre stop existant: u   Ã‰chec annulation ordre rO   u'   Ã‰chec vÃ©rification ordres existants: ÚtriggerÚsl)Ú	triggerPxÚisMarketÚtpsl)r{   r¯   r¾   Úlimit_pxÚ
order_typer°   u   RÃ©sultat ordre stop: r¹   rÃ   Ústop_trigger_order)r³   rn  rf   Ú
order_sideÚ
order_sizerÂ   Úmethodr4   rÄ   rÅ   r   r»   u   Ã‰chec ordre stop: z"Activation stop loss virtuel pour rï   Útrailing_stop_fallbacku   Fallback - ordre Ã©chouÃ©: )r³   rn  rf   r{  r|  Úvirtualr}  ÚnotezException ordre stop: zFallback - exception ordreÚ{z{{Ú}z}}zErreur update stop loss: rÉ   )r   r}   rÌ   rQ   r   r   rt   rP   rn   Úopen_ordersr   ÚcancelrŽ   r   r"   Úorderrª   r   )r#   rf   rn  r€   Úrounded_pricero   Útarget_positionrq   Úposition_sizer¯   r{  r|  Úexisting_ordersr…  rÈ   Úcancel_er$   rÂ   rØ   rÄ   Úorder_eÚsafe_erÐ   r'   r'   r(   Úupdate_position_stop_lossý  sÒ   þ"
ÿ
"€ÿ€€ÿú	
ù
øø€û

ý€üz+HyperliquidClient.update_position_stop_lossrÈ   Ú	new_priceÚnew_sizec              
   C   s(  zo| j s
dddœW S |sdddœW S t d|› d|› d|› �¡ dt|ƒi}|d	ur0t|ƒ|d
< |d	ur:t|ƒ|d< | j  |¡}t d|› �¡ |rZ| d¡dkrZd||||dœW S | di ¡ dt|ƒ¡}dd|› �|dœW S  ty“ } zd|› �}t |¡ d|t|ƒdœW  Y d	}~S d	}~ww )u8  
        Modifie un ordre existant sur Hyperliquid
        
        Args:
            order_id: ID de l'ordre Ã  modifier
            new_price: Nouveau prix (optionnel)
            new_size: Nouvelle taille (optionnel)
            
        Returns:
            Dict avec le rÃ©sultat de la modification
        Fro  r²   zOrder ID requiszModification ordre z: prix=z	, taille=rf  Nrî   r¾   u   RÃ©sultat modification: r¹   rÃ   T)r³   rÈ   rŽ  r�  rÂ   r4   r   u   Ã‰chec modification ordre: rÁ   zErreur modification ordre: rÉ   )	r   r   r   rŽ   rª   Úmodify_orderrP   r   r   )r#   rÈ   rŽ  r�  ÚmodificationsrÂ   rÐ   r$   r'   r'   r(   r�  ‡  sF   ÿûý

ý€ýzHyperliquidClient.modify_orderrÀ   c              
   C   s
  z`| j s
dddœW S |s|sdddœW S t d|› d|› �¡ |r(dt|ƒi}nd|i}| j  |¡}t d	|› �¡ |rK| d
¡dkrKd|||dœW S | di ¡ dt|ƒ¡}dd|› �|dœW S  ty„ } zd|› �}t |¡ d|t|ƒdœW  Y d}~S d}~ww )u  
        Annule un ordre sur Hyperliquid
        
        Args:
            order_id: ID de l'ordre Ã  annuler
            cloid: Client Order ID (alternative Ã  order_id)
            
        Returns:
            Dict avec le rÃ©sultat de l'annulation
        Fro  r²   zOrder ID ou CLOID requiszAnnulation ordre: ID=z, CLOID=rf  rÀ   u   RÃ©sultat annulation: r¹   rÃ   T)r³   rÈ   rÀ   rÂ   r4   r   u   Ã‰chec annulation ordre: rÁ   zErreur annulation ordre: rÉ   N)	r   r   r   rŽ   Úcancel_orderrP   rª   r   r   )r#   rÈ   rÀ   Úcancel_requestrÂ   rÐ   r$   r'   r'   r(   r’  Ä  s>   üý

ý€ýzHyperliquidClient.cancel_orderc              
      s�   z+| j sg W S | j  | j¡}|r| dd¡‰ ‡ fdd„|D ƒ}t dt|ƒ› �¡ |W S  tyG } zt d|› �¡ g W  Y d}~S d}~ww )u½   
        RÃ©cupÃ¨re les ordres ouverts
        
        Args:
            symbol: Symbole spÃ©cifique (optionnel)
            
        Returns:
            Liste des ordres ouverts
        rb   rM   c                    s   g | ]}|  d ¡ˆ kr|‘qS )rL   rÝ   )r¡   r…  ©r€   r'   r(   r¤     s    z5HyperliquidClient.get_open_orders.<locals>.<listcomp>u   Ordres ouverts trouvÃ©s: u&   Erreur rÃ©cupÃ©ration ordres ouverts: N)	r   rƒ  r   r}   r   r;   r<   r   r   )r#   rf   rƒ  r$   r'   r”  r(   Úget_open_ordersû  s   
€þz!HyperliquidClient.get_open_orders)NN)FNN)NrÚ   )rê   rG  )rÚ   )r!  r"  )r"  rL  ))Ú__name__Ú
__module__Ú__qualname__Ú__doc__rª   r)   r   r   r5   r=   rQ   rZ   r   rt   rv   r‡   rŽ   rŒ   r‘   r“   r    r®   ÚboolrÙ   ré   rò   r  r
  r  rÏ   r  r   r=  ra  rc  r  rm  r�  r�  r’  r•  r'   r'   r'   r(   r      sD    2.-$(+ " $H$+$ QL7 =7r   r   )r	   u;   Client Hyperliquid global initialisÃ© avec support Exchangeu#   Initialisation Exchange Ã©chouÃ©e: u;   Client Hyperliquid global initialisÃ© en mode lecture seule)r™  r0   r.   r¥   ÚloggingÚtypingr   r   r   r   r   r   r   Ú	getLoggerr–  r   r   r   Úhyperliquid_clientr   r   r$   r"   r'   r'   r'   r(   Ú<module>   s:   
          
€ý