o
    …iž(  ã                   @   sÀ  d Z ddlZddlZddlmZ ddlZddlmZmZ ddl	Z	ej
ejd� e e¡ZG dd„ dƒZedkrÞe d	¡ e d
¡ e d	¡ eƒ Ze d¡ e d¡Zer^e ded›�¡ e d¡ e d¡Zerse ded›�¡ e d¡ e g d¢¡Ze ¡ D ]\ZZer•e de› ded›�¡ qƒe d¡ e ddd¡ZedurÍe deeƒ› d�¡ e deg d¢  ¡ › �¡ e ded jd d›�¡ e d ¡ e d!¡ e d	¡ dS dS )"u{   
Pyth Network Price Feed - Prix en temps rÃ©el depuis l'oracle Pyth
Compatible avec l'oracle on-chain utilisÃ© par ApolloX
é    N)Údatetime)ÚOptionalÚDict)Úlevelc                
   @   s®   e Zd ZdZdZddddddd	œZd
d„ Zdedee fdd„Z	ddedee
 fdd„Zdedee
 fdd„Zd dedededeej fdd„Zdedeee
f fdd„ZdS )!ÚPythPriceFeedu  
    RÃ©cupÃ¨re les prix depuis Pyth Network (oracle on-chain)

    Pyth Network est l'oracle de prix utilisÃ© par ApolloX on-chain.
    En utilisant Pyth pour nos signaux, on Ã©vite les Ã©carts de prix
    entre notre analyse et l'exÃ©cution on-chain.
    zhttps://hermes.pyth.networkÚB0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43ÚB0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0aceÚB0x2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4fÚB0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56dÚB0x2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0dÚB0xca3eed9b267293f6595901c734c7525ce8ef49adafe8284606ceb307afa2ca5b)ÚBTCUSDÚETHUSDÚBNBUSDÚSOLUSDÚADAUSDÚDOTUSDc                 C   s   i | _ d| _d| _d S )Né   zhttps://api.binance.com/api/v3)ÚcacheÚcache_durationÚbinance_url)Úself© r   úK/var/www/html/HyperOracle/crypto_trader/apollo_degen_bot/pyth_price_feed.pyÚ__init__)   s   
zPythPriceFeed.__init__ÚsymbolÚreturnc                 C   sB   |  ¡ }| d¡r|dd… }n| d¡r|dd… }| j |¡S )u¿   
        RÃ©cupÃ¨re le Price Feed ID Pyth pour un symbole

        Args:
            symbol: BTCUSD, ETHUSD, BNBUSD, etc. (sans T)

        Returns:
            Price Feed ID ou None
        ÚUSDTNéÿÿÿÿÚBUSD)ÚupperÚendswithÚPRICE_FEED_IDSÚget)r   r   r   r   r   Úget_price_feed_id0   s   

zPythPriceFeed.get_price_feed_idÚBTCUSDTc              
   C   s€  |› d�}|| j v r| j | \}}t ¡ | | jk r|S |  |¡}|s1t d|› d�¡ |  |¡S zg| dd¡}| j› d�}|ddœ}t	j
||d	d
�}	|	 ¡  |	 ¡ }
|
r[t|
ƒdkrit d|› �¡ |  |¡W S |
d d }t|d ƒ}t|d ƒ}|d|  }t ¡ |f| j |< t d|› d|d›�¡ |W S  ty¿ } zt d|› d|› �¡ t d¡ |  |¡W  Y d}~S d}~ww )uË   
        RÃ©cupÃ¨re le prix actuel depuis Pyth Network

        Args:
            symbol: Symbole de la paire (ex: BTCUSDT, BNBUSDT)

        Returns:
            Prix en float ou None si erreur
        Ú_priceu$   âš ï¸�  Pas de Price Feed Pyth pour z, utilisation BinanceÚ0xÚ ú/api/latest_price_feedsÚfalse©zids[]Úbinaryé   ©ÚparamsÚtimeoutr   u"   âš ï¸�  Pas de donnÃ©es Pyth pour ÚpriceÚexpoé
   u   ðŸ“Š Prix Pyth ú: $ú,.2fu   â�Œ Erreur Pyth pour z: u      â†’ Fallback BinanceN)r   Útimer   r$   ÚloggerÚwarningÚ_get_binance_priceÚreplaceÚ
HERMES_URLÚrequestsr#   Úraise_for_statusÚjsonÚlenÚfloatÚintÚdebugÚ	ExceptionÚerrorÚinfo)r   r   Ú	cache_keyÚcached_timeÚcached_priceÚprice_feed_idÚfeed_id_cleanÚurlr/   ÚresponseÚdataÚ
price_datar1   r2   Úactual_priceÚer   r   r   Úget_current_priceE   sD   



þ
€ýzPythPriceFeed.get_current_pricec              
   C   sz   z!| j › d�}d|i}tj||dd�}| ¡  | ¡ }t|d ƒW S  ty< } zt d|› �¡ W Y d}~dS d}~ww )u(   Fallback: rÃ©cupÃ¨re prix depuis Binancez/ticker/pricer   r-   r.   r1   u   â�Œ Erreur fallback Binance: N)	r   r<   r#   r=   r>   r@   rC   r7   rD   )r   r   rK   r/   rL   rM   rP   r   r   r   r9   „   s   €þz PythPriceFeed._get_binance_priceÚ1méd   ÚintervalÚlimitc              
   C   sú   za| j › d�}|||dœ}tj||dd�}| ¡  | ¡ }tj|g d¢d�}|g d¢ }tj|d d	d
�|d< dD ]}	||	  t	¡||	< q9|  
|¡}
|
r_|
|j|jd df< t d|
d›�¡ |W S  ty| } zt d|› �¡ W Y d}~dS d}~ww )u  
        RÃ©cupÃ¨re les donnÃ©es OHLCV historiques

        Note: Pyth ne fournit pas de donnÃ©es historiques OHLCV,
        on utilise Binance pour Ã§a (nÃ©cessaire pour ATR, RSI, etc.)
        Mais le prix actuel (close) sera mis Ã  jour avec Pyth.

        Args:
            symbol: Paire de trading (ex: BTCUSDT)
            interval: Timeframe (1m, 5m, 15m, 1h, etc.)
            limit: Nombre de bougies

        Returns:
            DataFrame avec colonnes: timestamp, open, high, low, close, volume
        z/klines)r   rT   rU   r3   r.   )Ú	timestampÚopenÚhighÚlowÚcloseÚvolumeÚ
close_timeÚquote_volumeÚtradesÚtaker_buy_baseÚtaker_buy_quoteÚignore)Úcolumns)rV   rW   rX   rY   rZ   r[   rV   Úms)Úunit)rW   rX   rY   rZ   r[   r   rZ   u-      âœ… Dernier close mis Ã  jour avec Pyth: $r5   u"   â�Œ Erreur rÃ©cupÃ©ration klines: N)r   r<   r#   r=   r>   ÚpdÚ	DataFrameÚto_datetimeÚastyper@   rQ   ÚlocÚindexr7   rB   rC   rD   )r   r   rT   rU   rK   r/   rL   rM   ÚdfÚcolÚcurrent_pyth_pricerP   r   r   r   Ú
get_klines”   s0   ý
€þzPythPriceFeed.get_klinesÚsymbolsc              
   C   sh  i }g }i }|D ]}|   |¡}|r| |¡ |||< q|s0t d¡ |D ]	}|  |¡||< q$|S z\dd„ |D ƒ}| j› d�}|ddœ}	tj||	dd�}
|
 ¡  |
 	¡ }|D ])}|d	 }| d
| ¡}|r~|d }t
|d ƒ}t|d ƒ}|d|  }|||< qUt dt|ƒ› d�¡ W |S  ty³ } zt d|› �¡ |D ]	}|  |¡||< qžW Y d}~|S d}~ww )uÆ   
        RÃ©cupÃ¨re plusieurs prix en une seule requÃªte

        Args:
            symbols: Liste de symboles ['BTCUSDT', 'ETHUSDT', ...]

        Returns:
            Dict {symbol: price}
        u7   âš ï¸�  Aucun Price Feed Pyth trouvÃ©, fallback Binancec                 S   s   g | ]}|  d d¡‘qS )r'   r(   )r:   )Ú.0Úfidr   r   r   Ú
<listcomp>ê   s    z5PythPriceFeed.get_multiple_prices.<locals>.<listcomp>r)   r*   r+   r-   r.   Úidr'   r1   r2   r3   u   ðŸ“Š RÃ©cupÃ©rÃ© z prix depuis Pythu)   â�Œ Erreur rÃ©cupÃ©ration multiple Pyth: N)r$   Úappendr7   r8   r9   r;   r<   r#   r=   r>   r@   rA   rE   r?   rC   rD   )r   ro   ÚpricesÚfeed_idsÚsymbol_to_feedr   Úfeed_idÚfeed_ids_cleanrK   r/   rL   rM   ÚitemrN   r1   r2   rO   rP   r   r   r   Úget_multiple_pricesÌ   sR   


€

€ú
ÿ€úz!PythPriceFeed.get_multiple_pricesN)r%   )r%   rR   rS   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   r"   r   Ústrr   r$   r@   rQ   r9   rA   re   rf   rn   Úlistr   r{   r   r   r   r   r      s     	ú	?"8r   Ú__main__zP================================================================================u   ðŸ§ª TEST PYTH PRICE FEEDu$   
ðŸ“Š Prix actuel BTC (Pyth Oracle):r%   z	   BTC: $r5   u$   
ðŸ“Š Prix actuel BNB (Pyth Oracle):ÚBNBUSDTz	   BNB: $u)   
ðŸ“Š Prix multiples (requÃªte groupÃ©e):)r%   ÚETHUSDTrƒ   z   r4   u'   
ðŸ“Š Klines 1m (Binance + Pyth close):rR   r3   u      RÃ©cupÃ©rÃ©: z bougiesÚ
)rV   rZ   r[   z
   Dernier close (Pyth): $rZ   r   zQ
================================================================================u   âœ… Test terminÃ©)r   r<   Úpandasre   r   ÚloggingÚtypingr   r   r6   ÚbasicConfigÚINFOÚ	getLoggerr|   r7   r   rE   ÚfeedrQ   Ú	btc_priceÚ	bnb_pricer{   ru   Úitemsr   r1   rn   rk   r?   ÚtailÚilocr   r   r   r   Ú<module>   sP   
 z







€


Ü