o
    ./êhšÌ ã                   @   s&  d Z ddlmZmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZ dd	lZdd	lZdd	lZdd	lZdd	lZdd	lZdd	lZdd
lmZ ddlmZ e e¡Zdedefdd„Z dd„ Z!e!ƒ  e"e #dd¡ƒZ$e #dd¡Z%e #dd¡Z&e #dd¡Z'eƒ Z(deeee(ƒf fdd„Z)ddl*m+Z+ ddl,m-Z- ddl.m/Z/ dd l0m1Z1 dd!l2m3Z3 dd"l4m5Z5 dd#l6m7Z7 dd$l8m9Z9 e+d%d&�Z:e-d'd&�Z;e/d(d&�Z<e5ƒ Z=e7e=ƒZ>i a?d	a@d)d*„ ZAd+edefd,d-„ZBd+ed.edeCfd/d0„ZDd1eEdeCfd2d3„ZF�dd+ed4eCdeGfd5d6„ZHd+ed7eCde"fd8d9„ZId:d;„ ZJd<d=„ ZKd>d?„ ZLdd@lMmNZN ddAlOmPZP ddBlQmRZR ddClSmSZS dd	lTZTddDlUmVZV ddElWmXZX dd	lYZYG dFdG„ dGeVƒZZedHefdIdJ„ƒZ[edKdLe[dM�Z\e\ ]eZ¡ e\j^dNe	dOdP�dQdR� edSdP�Z_e`dTƒ e`dUƒ e`dVeTja› �ƒ e`dTƒ eT b¡  eReSedW�ZceTjadXk�r±eNdXeTjddY�Zed	ZfneNdZd[eSd\�ZeePeSdC�Zfeejgef_gd	ahg aid]d^„ Zjee kej¡ d_d`„ Zle\ mda¡dbefdcdd„ƒZne\ mde¡dbefdfdg„ƒZoe\ mdh¡dbefdidj„ƒZpe\ mdk¡dbefdldm„ƒZqe\ mdn¡dodp„ ƒZre\ sdq¡dreEfdsdt„ƒZte\ mdu¡dvdw„ ƒZue\ sdx¡�ddzed{efd|d}„ƒZve\ md~¡dd€„ ƒZwe\ md�¡d‚dƒ„ ƒZxe\ md„¡d…d†„ ƒZye\ md‡¡dˆd‰„ ƒZze\ mdŠ¡d‹dŒ„ ƒZ{e\ md�¡dŽd�„ ƒZ|e\ md�¡d‘d’„ ƒZ}e\ md“¡d”d•„ ƒZ~e\ md–¡d—d˜„ ƒZe\ sd™¡dšefd›dœ„ƒZ€e\ sd�¡dždŸ„ ƒZ�e\ ‚d ¡dšefd¡d¢„ƒZƒe\ sd£¡d¤d¥„ ƒZ„e\ sd¦¡d§d¨„ ƒZ…e\ sd©¡dªefd«d¬„ƒZ†e\ sd­¡d®efd¯d°„ƒZ‡e\ md±¡d²d³„ ƒZˆe\ sd´¡dµefd¶d·„ƒZ‰e\ sd¸¡dµefd¹dº„ƒZŠe\ sd»¡d¼eEfd½d¾„ƒZ‹i aŒdd¿l�mŽZŽm�Z� d+edÀeCdÁeCdefdÂdÃ„Z�e\ mdÄ¡dÅdÆ„ ƒZ‘e\ mdÇ¡dÈdÉ„ ƒZ’e\ sdÇ¡dÊeEfdËdÌ„ƒZ“e\ sdÍ¡dÎdÏ„ ƒZ”e\ mdÐ¡�dd®edÓe"fdÔdÕ„ƒZ•e\ mdÖ¡d×dØ„ ƒZ–e\ mdÙ¡dÚdÛ„ ƒZ—e\ mdÜ¡�d	dÞe"fdßdà„ƒZ˜e\ mdá¡dâdã„ ƒZ™e\ mdä¡dådæ„ ƒZše\ ›dç¡dèeEfdédê„ƒZœe\ mdë¡�d	dÞe"fdìdí„ƒZ�edîk�re`dTƒ e`dïƒ e`dTƒ e`dðe%› dñe$› �ƒ e`dòe&› dóe'› �ƒ e`dôƒ e`dõƒ e`döƒ e`d÷ƒ e`døƒ e`dùƒ e`dTƒ e`dúƒ e`dûe düƒ› �ƒ e`dýe dþƒ› �ƒ e`dÿe �d ƒ› �ƒ e`�de �dƒ› �ƒ e`dTƒ ejž�de%e$�d�d� d	S d	S (
  u>   
SERVEUR UNIFIÃ‰ - Toutes les fonctionnalitÃ©s crypto trading
é    )ÚFastAPIÚHTTPExceptionÚDependsÚstatus)ÚHTMLResponse)ÚStaticFiles)ÚJinja2Templates)ÚRequest)Ú	HTTPBasicÚHTTPBasicCredentials)ÚasynccontextmanagerN©Údatetime)Ú	AnnotatedÚfilepathÚreturnc              
   C   st   z"ddl }ddlm} |j | ¡r |j | ¡}| |¡ d¡W S W dS  ty9 } zd|› �W  Y d}~S d}~ww )u9   RÃ©cupÃ¨re la date de derniÃ¨re modification d'un fichierr   Nr   z%Y-%m-%d %H:%M:%Su   Fichier non trouvÃ©zErreur: )Úosr   ÚpathÚexistsÚgetmtimeÚfromtimestampÚstrftimeÚ	Exception)r   r   r   ÚmtimeÚe© r   úA/var/www/html/HyperOracle/crypto_trader/unified_trading_server.pyÚget_file_modification_time   s   €ÿr   c                  C   sâ   ddl m}  ddl}d}|j |¡s| |¡ tjsot t	j
¡ | |j |d¡ddd�}t	 d	¡}| |¡ t |¡ t d
¡ t d¡ t dtdƒ› �¡ t dtdƒ› �¡ t dtdƒ› �¡ t dtdƒ› �¡ dS dS )uS   Configure le logger du serveur pour utiliser le mÃªme fichier que le trading enginer   )ÚRotatingFileHandlerNÚlogsztrading_engine.logi    é   )ÚmaxBytesÚbackupCountz4%(asctime)s - %(levelname)s - [SERVER] - %(message)sz&=== UNIFIED TRADING SERVER STARTED ===zFILE MODIFICATION DATES:ú  unified_trading_server.py: úunified_trading_server.pyú  real_time_trading_engine.py: úreal_time_trading_engine.pyú  hyperliquid_client.py: úhyperliquid_client.pyú  trading_config.py: útrading_config.py)Úlogging.handlersr   r   r   r   ÚmakedirsÚloggerÚhandlersÚsetLevelÚloggingÚDEBUGÚjoinÚ	FormatterÚsetFormatterÚ
addHandlerÚinfor   )r   r   Úlogs_dirÚhandlerÚ	formatterr   r   r   Úsetup_unified_logging'   s0   
ýÿ



èr:   ÚAPP_PORTÚ8888ÚAPP_HOSTz0.0.0.0ÚAUTH_USERNAMEÚadminÚAUTH_PASSWORDÚtrading2024Úcredentialsc                 C   s>   t  | jt¡}t  | jt¡}|r|sttjdddid�‚| jS )u9   VÃ©rifie les identifiants pour l'authentification basiquezIdentifiants incorrectsúWWW-AuthenticateÚBasic)Ústatus_codeÚdetailÚheaders)	ÚsecretsÚcompare_digestÚusernamer>   Úpasswordr@   r   r   ÚHTTP_401_UNAUTHORIZED)rB   Úcorrect_usernameÚcorrect_passwordr   r   r   Úverify_credentialsX   s   ýrO   )ÚTechnicalIndicatorsOracle)ÚSentimentOracle)ÚTradFiOracle©Úposition_persistence)ÚIndicatorSignal)ÚPriceService)ÚExecutedSignalsService)Úsettingsi  )Úupdate_intervalé  i@8  c               
   C   s¢   z5ddl m } m} tr|  ¡ t |dd�k rW dS t ¡ }|r3|a|  ¡ at dt	|ƒ› d�¡ W dS W dS  t
yP } zt d|› �¡ W Y d}~dS d}~ww )	u;   Met Ã  jour le cache des leverages depuis l'API Hyperliquidr   )r   Ú	timedeltaé   )ÚhoursNu#   Leverages Hyperliquid mis Ã  jour: z tokensu+   Erreur mise Ã  jour leverages Hyperliquid: )r   r[   Úlast_leverage_updateÚnowÚhyperliquid_clientÚget_available_leveragesÚhyperliquid_leverages_cacher-   ÚdebugÚlenr   Úerror)r   r[   Ú	leveragesr   r   r   r   Úupdate_hyperliquid_leveragesy   s   ý€ÿrg   Úsymbolc                 C   s8   |   d¡s
|   d¡r| S |   d¡r|  dd¡S | › d�S )z3Convertir un symbole vers format Hyperliquid (-USD)z-USDÚPERPÚUSDT)ÚendswithÚreplace)rh   r   r   r   Ú!normalize_symbol_for_price_oracleŒ   s
   

rm   Úexpected_signalc              
   C   sô   z[g d¢}ddddœ}d}d}|D ]>}| › d|› �}|t jv rOt j| }|rOt|dƒrO|j}	|| }
|dkr?|	d	v r?||
7 }n|d
krK|	dv rK||
7 }||
7 }q|dkrY|| W S W dS  tyy } zt d| › d|› �¡ W Y d}~dS d}~ww )u�   
    Analyse l'alignement des signaux sur plusieurs timeframes
    Retourne un score entre 0 et 1 (1 = parfaitement alignÃ©)
    )Ú15mÚ1hÚ4hçš™™™™™É?ç333333Ó?ç      à?ç        Ú_Úoverall_signalÚBUY)rx   Ú
STRONG_BUYÚSELL)rz   ÚSTRONG_SELLr   z$Erreur analyse multi-timeframe pour ú: N)Útech_oracleÚindicators_cacheÚhasattrrw   r   r-   rc   )rh   rn   Ú
timeframesÚweightsÚaligned_scoreÚtotal_weightÚtfÚ	cache_keyÚ
indicatorsÚsignalÚweightr   r   r   r   Ú!analyze_multi_timeframe_alignment”   s4   


€
€þr‰   r‡   c                 C   s  d}|   dd¡}|dkrtd|ƒ}||d 7 }d| v rk| d }d}d|v rF|d }| d	 d
kr8|dk r8|d7 }n| d	 dkrF|dkrF|d7 }d|v rb| d	 d
krT|d s^| d	 dkrb|d sb|d7 }|t|dƒd 7 }d| v ry| d dkry|d7 }d| v r…|| d d 7 }td|ƒS )u"  OBSOLÃˆTE - Calcule un score de qualitÃ© pour un signal (0-1)

    Cette fonction est remplacÃ©e par le systÃ¨me pragmatic_signals qui gÃ©nÃ¨re
    directement des scores de qualitÃ© valides dans les signaux.
    Prend en compte: confidence, momentum, volume, convergence d'indicateurs
    ru   Ú
confidencert   r   rr   gš™™™™™Ù?r†   ÚrsiÚsignal_typerx   é(   rz   é<   Úmacd_bullishç      ð?rs   Úvolume_ratioç333333ó?Útimeframe_alignmentçš™™™™™¹?)ÚgetÚmaxÚmin)r‡   ÚscorerŠ   r†   Úmomentum_scorer‹   r   r   r   Ú"calculate_signal_quality_score_OLD¸   s0   


rš   Ú
volume_24hc              
   C   s¨   | t jv rdS t| ƒ}|t jv rdS |dur|t jkS ztj |¡}|r0t|dƒr3|jt jkW S W dS W dS  t	yS } zt
 d| › d|› �¡ W Y d}~dS d}~ww )uE   VÃ©rifie si un marchÃ© a suffisamment de liquiditÃ© pour Ãªtre tradÃ©TNr›   u    Erreur vÃ©rification liquiditÃ© r|   F)rX   Úhigh_liquidity_symbolsrm   Úmin_volume_24h_usdtÚprice_serviceÚoracleÚget_latest_pricer   r›   r   r-   re   )rh   r›   Úsymbol_hyperliquidÚ
price_datar   r   r   r   Úis_market_liquid_enoughç   s(   


ÿúü €ür£   rŠ   c                 C   sr   t ƒ  t | d¡}| dv r|dkrdnd}n| dv r#|dkr dnd}n|d	kr)dnd
}t|| ƒ}tdt||ƒƒS )u6   DÃ©termine le leverage optimal selon l'API Hyperliquidé   )ÚBTCÚETHçš™™™™™©?r�   çffffffî?)ÚSOLÚAVAXÚLINKÚUNIÚADAÚDOTg¸…ëQ¸®?g333333ë?ç{®Gáz´?ç      è?r\   )rg   rb   r•   Úintr–   r—   )rh   rŠ   Úmax_leverageÚconfidence_multiplierÚoptimal_leverager   r   r   Úget_optimal_leverage  s   rµ   c                  C   s’  i } z«t jdv r|t jr|t j ¡ }|rh|D ]S}|d  dd¡}t| dd¡ƒ}|dkrg| di ¡}t| dd¡ƒ}t| d	d
¡ƒ}t|| ƒ}|dkrP|| d nd}	|d  ¡ |	|||t| d|¡ƒdœ| |< qdd„ |  	¡ D ƒ}
t
 d|
› �¡ W | S t j 	¡ D ]\}}|j}|j|j|j|j|j|jdœ| |< q�dd„ |  	¡ D ƒ}
t
 d|
› �¡ W | S  tyÈ } zt
 d|› �¡ W Y d}~| S d}~ww )uJ   RÃ©cupÃ¨re les positions existantes LIVE depuis Hyperliquid avec PnL exact©ÚLIVE_MANUALÚ	LIVE_AUTOrh   ú-PERPÚ Úsizer   Úraw_position_dataÚunrealizedPnlÚentry_pricer\   éd   ÚsideÚ
mark_price)rÀ   Úpnl_percentÚpnlr»   r¾   Úcurrent_pricec                 S   ó$   g | ]\}}||d  d›d�f‘qS ©rÂ   ú.1fú%r   ©Ú.0ÚkÚvr   r   r   Ú
<listcomp>4  ó   $ z*get_existing_positions.<locals>.<listcomp>u   Positions LIVE rÃ©cupÃ©rÃ©es: c                 S   rÅ   rÆ   r   rÉ   r   r   r   rÍ   B  rÎ   u$   Positions SIMULATION rÃ©cupÃ©rÃ©es: u,   Erreur rÃ©cupÃ©ration positions existantes: N)Úlive_engineÚtrading_moder`   Úget_positionsrl   Úfloatr•   ÚabsÚupperÚitemsr-   rc   Ú	positionsrh   rÀ   rÂ   rÃ   r»   r¾   rÄ   r   Úwarning)Úexisting_positionsÚhl_positionsÚposrh   r»   Úraw_dataÚpnl_usdr¾   Úmargin_usedrÂ   Úpositions_debugÚpos_idr   r   r   r   Úget_existing_positions  sT   


ú€	ñúþ€þrà   c           	   	   C   sX  | |vrdS ||  }|d }|dkr|dkp|dko|dk}|dkr&|dkp-|dko-|dk}|rAt  d| › d|› d	|› d
�¡ dS |sEdS |dk r[t  d| › d|› d|d›d�¡ dS | dd¡}d|  krkdkr|n nt  d| › d|d›d�¡ dS |dk r�t  d| › d|d›d�¡ dS |dkrª|dk rªt  d| › d|d›d|d›d�¡ dS dS ) uJ   Filtre intelligent pour Ã©viter les retournements coÃ»teux et les doublonsFrÀ   ÚLONGrz   ÚSHORTrx   zFILTRE: z signal u    dupliquÃ© - position u    dÃ©jÃ  ouverteTç333333Ã?z confidence z.2%z < 15% requis pour retournementrÂ   r   éþÿÿÿé   z en zone neutre PnL rÇ   u   %, Ã©viter retournementéûÿÿÿz	ACCEPTE: z position perdante z%, autoriser retournementé   rr   z position gagnante z%, besoin confidence z > 20%)r-   rc   r•   r6   )	rh   rŒ   rŠ   rØ   Úexisting_posÚexisting_sideÚis_oppositeÚis_duplicaterÂ   r   r   r   Úshould_filter_opposite_signalI  s:   þþ "rì   c                  C   sn  g } t ƒ }|rt dt|ƒ› d�¡ �zttjƒdkr't dttjƒ› d�¡ tj ¡ D �]r\}}|�rŸt|dƒ�rŸ| 	d¡d }t
|ddƒpLt
|d	dƒ}|j}|j}|d
v �rŸ|dk�rŸt|ƒsbq,t||ƒ}|dk ryt d|› d|d›d�¡ q,|dkr‰d}td|d | ƒ}n|dkr˜d}td|d | ƒ}| dd¡}	t|	|||ƒr¦q,|dkr·d|d  }
||
 }d}n|dkrÇd|d  }
||
 }d}t|	|ƒ}d|› d|d›d�}i }t|dƒrë|j|d< |d |jd!›�7 }t|d"ƒ�rt|d#ƒ�r|j|jk}||d$< |d%|�rd&nd'› �7 }t|d(ƒ�r9t|d)ƒ�r9|jdk�r%|j|j nd}||d*< |d+k�r9|d,|d!›d-�7 }|	||dk�rBd.nd/|||�rMt|d0ƒnd|||t ¡  ¡ d|v �rb| 	d¡d1 nd2d3||| d*d¡d4œ}t|ƒ}||d5< |d6k�r�|  |¡ t d7|	› d8|› d9|d:›�¡ q,t d;|	› d8|› d<|d:›�¡ q,tj  ¡ D ]Ô\}}|�rxt|d=ƒ�rxt
|ddƒ}|�sÌt
t!j"d>i ƒ}||v �rÌ|| j#}|j$}t%|ƒ}|d?k�rÛd}n"|d@k �rãd}n|dAk�rïd}|dB9 }n|dCk �rûd}|dB9 }n�q¥t|ƒ�s�q¥t||||ƒ�r�q¥|dk�r%|dk�r%dD|dB  }
||
 }d}n|dk�r<|dk�r<dE|dB  }
||
 }d}n|}dF}| dd¡}	t|	|ƒ}|  |	||dk�rVd.nd/t|dGƒ||�rdt|d0ƒnd||dH|j$d:›�t ¡  ¡ dIdJdKœ¡ �q¥dLdM„ | D ƒ}dNdM„ | D ƒ}t&| '¡ ƒt&| '¡ ƒ@ D ]‚}|| }|| }|dO |dO k�rtd|dP |dP  dQ ƒ}t(|d |d ƒ}|dO dk�rÍ|dR|d   }n|dS|d   }d|v �rà| dd¡n|}	t|	|ƒ}|  |	|dO |dO dk�röd.nd/||t|d0ƒd|dT|dO › dU|d›d�t ¡  ¡ dVdWdKœ¡ �q”W | S  t)�y6 } zt *dX|› �¡ g W  Y dY}~S dY}~ww )Zuü   OBSOLÃˆTE - GÃ©nÃ¨re des signaux de trading basÃ©s sur les oracles avec filtrage intelligent

    Cette fonction est remplacÃ©e par generate_pragmatic_signals() qui utilise
    le systÃ¨me de signaux pragmatiques avec des scores valides (0.6-0.95)
    zFiltrage intelligent: z positions existantesr   zCache indicateurs techniques: õ	    entrÃ©esrw   rv   rÄ   Úclose_price)rx   rz   ry   r{   rt   úSignal u,    rejetÃ©: alignement timeframe insuffisant (z.1%ú)ry   rx   r�   g      ø?r{   rz   rj   rº   g{®Gázð?g¸…ëQ¸¾?rã   g
×£p=
ï?zTechnical analysis: z signal with z confidencer‹   z, RSI: rÇ   ÚmacdÚmacd_signalr�   z, MACD: ÚbullishÚbearishÚvolumeÚ	volume_mar‘   r’   z
, Volume: zx avgrá   râ   é   r\   Ú30mÚtechnical_indicators)rh   rŒ   rÀ   rŠ   rÄ   Útarget_priceÚstop_loss_pctÚleverageÚ	reasoningÚ	timestampÚ	timeframeÚsourcer†   r“   r‘   Úquality_scoregÍÌÌÌÌÌÜ?u   Signal acceptÃ©: Ú z
 - Score: ú.2fu   Signal rejetÃ©: z - Score insuffisant: Úsentiment_scoreÚprice_cacher¯   gš™™™™™¹¿g{®Gáz¤?gš™™™™™é?g¸…ëQ¸®¿gR¸…ëQð?g\�Âõ(\ï?ru   rå   zSentiment score: rp   Ú	sentiment)rh   rŒ   rÀ   rŠ   rÄ   rú   rû   rü   rý   rþ   rÿ   r   c                 S   ó"   i | ]}|d  dkr|d |“qS )r   rù   rh   r   ©rÊ   Úsr   r   r   Ú
<dictcomp>@  ó   " z0generate_signals_for_api_OLD.<locals>.<dictcomp>c                 S   r  )r   r  rh   r   r  r   r   r   r
  A  r  rŒ   rŠ   çffffffæ?gÍÌÌÌÌÌð?r¨   z$COMBINED: Tech + Sentiment agree on z (z1h-4hÚcombined_tech_sentimentu%   Erreur gÃ©nÃ©ration signaux oracles: N)+rà   r-   r6   rd   r}   r~   rc   rÕ   r   ÚsplitÚgetattrrw   Úsignal_strengthr£   r‰   r—   rl   rì   rµ   r‹   rñ   rò   rö   rõ   Úroundr   r_   Ú	isoformatr•   Úcalculate_signal_quality_scoreÚappendÚsentiment_oracleÚsentiment_cacherž   rŸ   Úpricer  rÓ   ÚsetÚkeysr–   r   re   )ÚsignalsrØ   r…   r†   rh   rÄ   rŒ   rŠ   r“   Úsymbol_cleanÚtarget_multiplierrú   rû   r´   rý   Úsignal_indicatorsr�   r‘   Úsignal_dictr  Úsentiment_datar  r  Útech_signalsÚsentiment_signalsÚtech_sigÚsent_sigÚcombined_confidencer   r   r   r   Úgenerate_signals_for_api_OLD~  sB  






ñ

 €










ô€

ô€ì'ü€þr%  )ÚSimpleTradingEngine)ÚProfitTaker)ÚPragmaticSignalGenerator)r`   )ÚBaseHTTPMiddleware)ÚResponsec                   @   s   e Zd Zdd„ ZdS )ÚBasicAuthMiddlewarec           
      Ã   sª   �g d¢}|j j|v r||ƒI d H S |j d¡}|rLz-| ¡ \}}| ¡ dkrFt |¡ d¡}| d¡\}}	|t	krF|	t
krF||ƒI d H W S W n   Y tdddd	id
�S )N)z/docsz/openapi.jsonz/favicon.icoÚAuthorizationÚbasicúutf-8ú:u   Non autorisÃ©i‘  rC   rD   )ÚcontentrE   rG   )Úurlr   rG   r•   r  ÚlowerÚbase64Ú	b64decodeÚdecoder>   r@   r*  )
ÚselfÚrequestÚ	call_nextÚpublic_pathsÚauthorizationÚschemerB   ÚdecodedrJ   rK   r   r   r   Údispatchy  s*   €€ýzBasicAuthMiddleware.dispatchN)Ú__name__Ú
__module__Ú__qualname__r=  r   r   r   r   r+  x  s    r+  Úappc              
   C  s¤  �t dƒ tjt_tt_dd„ }t dƒ t ¡  t dƒ tr*t dƒ t ¡  t dƒ z7t	 
t t ¡ ¡¡ t	 
t t ¡ ¡¡ t	 
t t ¡ ¡¡ t	 
t t ¡ ¡¡ t	 
t tƒ ¡¡ t dƒ W n ty{ } zt d	|› �¡ W Y d }~nd }~ww d V  t d
ƒ tr‘t dƒ t ¡  t dƒ t dƒ t ¡  t dƒ t ¡ I d H  t ¡ I d H  t ¡ I d H  t ¡ I d H  t	D ]}|rÇ| ¡ sÇ| ¡  q»t	 ¡  t dƒ d S )Nz*DEMARRAGE DU SERVEUR UNIFIE CRYPTO TRADINGc               
   S   s\   zt  ¡  W d S  ty- }  ztd| › �ƒ dd l}| ¡  tdƒ W Y d } ~ d S d } ~ ww ©Nz![CRITICAL] Trading loop crashed: r   z2[CRITICAL] Trading loop will attempt to restart...©rÏ   Útrading_loopr   ÚprintÚ	tracebackÚ	print_exc©r   rF  r   r   r   Úwrapped_trading_loop¢  s   €üz&lifespan.<locals>.wrapped_trading_loopu$   DÃ©marrage du SimpleTradingEngine...u   SimpleTradingEngine dÃ©marrÃ©u   DÃ©marrage du ProfitTaker...ux   ProfitTaker dÃ©marrÃ© avec stop-loss adaptatif (-4% lev 8x+, -5% lev 5-7x, -6% lev 3-4x, -8% lev <3x) + trailing stop 3%u8   Oracles, services et mise Ã  jour des signaux dÃ©marrÃ©su   Erreur dÃ©marrage services: z&ARRET DU SERVEUR UNIFIE CRYPTO TRADINGu   ArrÃªt du ProfitTaker...u   ProfitTaker arrÃªtÃ©u    ArrÃªt du SimpleTradingEngine...u   SimpleTradingEngine arrÃªtÃ©u   Services arrÃªtÃ©s)rE  rž   rŸ   rÏ   Úprice_oracler}   Útechnical_oracleÚstartÚprofit_takerÚoracle_tasksr  ÚasyncioÚcreate_taskr  Útradfi_oracleÚupdate_active_signals_loopr   r-   re   ÚstopÚdoneÚcancelÚclear)rA  rI  r   Útaskr   r   r   Úlifespan•  sT   €
€ÿ€rX  zUnified Crypto Trading Platformz1.0.0)ÚtitleÚversionrX  z/staticzcrypto_trader/web/static)Ú	directoryÚstatic)Únamezcrypto_trader/web/templatesz<============================================================z&CHARGEMENT DE LA CONFIGURATION TRADINGu   Mode configurÃ©: )r`   r-   Ú
SIMULATION)rÐ   Úinitial_balancer¸   ru   )rÐ   r_  r`   c                  C   sÐ  t ddd� z·t ddd� t ¡ } t d| rt| ƒnd› d�dd� t dt| ƒ› d	�¡ | s1g W S d
d„ | D ƒ}|r…t dt|ƒd›dt|ƒd›dt|ƒt|ƒ d›�¡ t	| dd„ dd�dd… }|D ] }t d|d › d|d › d|d d›d| 
dd¡d›d�	¡ qdt ¡ }| 
dd ¡| 
d!d¡tt ¡ ƒd"œ}dd#lm} |tƒ}| | |¡}t d$t| ƒ› d%t|ƒ› d&�¡ |W S  tyç }	 zt d'|	› �¡ ddl}
t d(|
 ¡ › �¡ g W  Y d}	~	S d}	~	ww ))u<   GÃ©nÃ¨re des signaux avec filtre intelligent multi-critÃ¨resu0   ðŸš€ðŸš€ðŸš€ generate_pragmatic_signals() DÃ‰BUTT)Úflushu>   ðŸ”§ Avant appel pragmatic_signal_generator.generate_signals()u   ðŸ”§ AprÃ¨s appel - reÃ§u r   ú signauxu   ðŸ“Š GÃ©nÃ©rÃ©s z signaux brutsc                 S   s   g | ]}|  d d¡‘qS )r˜   r   ©r•   r  r   r   r   rÍ     s    z.generate_pragmatic_signals.<locals>.<listcomp>u   ðŸ”� Scores bruts: min=z.3fz, max=z, avg=c                 S   ó   |   dd¡S )Nr˜   r   rb  ©Úxr   r   r   Ú<lambda>  ó    z,generate_pragmatic_signals.<locals>.<lambda>©ÚkeyÚreverseNr    z   TOP: rh   r  rÀ   z score=r˜   z conf=rŠ   z.0frÈ   ÚtrendÚNEUTRALÚstrength)Ú	btc_trendÚbtc_strengthÚactive_positions)ÚIntelligentSignalFilteru   âœ… Filtre: u    â†’ u    signaux validÃ©su!   â�Œ ERREUR gÃ©nÃ©ration signaux: zTraceback:
)rE  Úpragmatic_signal_generatorÚgenerate_signalsrd   r-   r6   r—   r–   ÚsumÚsortedr•   Úget_btc_macro_trendrÏ   Úget_current_positions_dictÚ+simple_trading_system.signal_quality_filterrq  Úfilter_signalsr   re   rF  Ú
format_exc)Úraw_signalsÚscoresÚtop_signalsÚsigÚ	btc_macroÚmarket_contextrq  Úsignal_filterÚfilteredr   rF  r   r   r   Úgenerate_pragmatic_signals  s>    6>


ý €ürƒ  c               
   Ã   s‚   �	 zt  ¡ } | dkrt d| › d�¡ t d¡I dH  W n" ty? } zt d|› �¡ t d¡I dH  W Y d}~nd}~ww q)	u2   Boucle de mise Ã  jour des prix des signaux actifsTr   u   Prix mis Ã  jour pour z signaux actifséx   Nu$   Erreur mise Ã  jour signaux actifs: rŽ   )Úexecuted_signals_serviceÚupdate_signal_pricesr-   rc   rO  Úsleepr   re   )Úupdated_countr   r   r   r   rR  :  s   €€þúrR  ú/r7  c                 Ã   ó   �t  dd| i¡S )u   Dashboard principal unifiÃ©údashboard.htmlr7  ©Ú	templatesÚTemplateResponse©r7  r   r   r   Ú	dashboardJ  s   €r�  z/oraclesc                 Ã   rŠ  ©Nr‹  r7  rŒ  r�  r   r   r   Úoracles_pageO  ó   €r’  z/tradingc                 Ã   rŠ  r‘  rŒ  r�  r   r   r   Útrading_pageS  r“  r”  z
/portfolioc                 Ã   rŠ  r‘  rŒ  r�  r   r   r   Úportfolio_pageW  r“  r•  z/api/trading/signalsc               
   Ã   s¬   �z=t ƒ } | jdd„ dd� i }d}| D ]}| dd¡}| |d¡d ||< |d	v r.|d7 }qd
t ¡  ¡ t| ƒ||| dœW S  tyU } ztddt	|ƒ› �d�‚d}~ww )u0   API endpoint pour signaux de trading amÃ©liorÃ©sc                 S   rc  )Nr  r   rb  rd  r   r   r   rf  d  rg  z&get_enhanced_signals.<locals>.<lambda>Trh  r   rŒ   ÚHOLDr\   )rx   rz   Úsuccess)r   rþ   Úsignals_countÚtradable_countÚsignal_distributionr  éô  u   Erreur gÃ©nÃ©ration signaux: ©rE   rF   N)
rƒ  Úsortr•   r   r_   r  rd   r   r   Ústr)Úenhanced_signalsÚsignal_typesr™  r‡   Ústyper   r   r   r   Úget_enhanced_signals_  s.   €€
ú	€ÿr¢  z/api/trading/execute-signalÚsignal_datac              
   Ã   sx   �z#|   dd¡}t | |¡}d|d| d › d| d › d�t ¡  ¡ d	œW S  ty; } ztd
dt|ƒ› �d�‚d}~ww )u3   ExÃ©cuter un signal et crÃ©er une position trackÃ©eÚposition_sizeg     @�@r—  rï   rh   r  rŒ   u
    exÃ©cutÃ©)r   Ú	signal_idÚmessagerþ   r›  u   Erreur exÃ©cution signal: rœ  N)	r•   r…  Úexecute_signalr   r_   r  r   r   rž  )r£  r¤  r¥  r   r   r   r   r§  {  s   €
ü€ÿr§  z/api/trading/active-signalsc               
   Ã   sj   �zt  ¡ } t  ¡ }dt ¡  ¡ | t|ƒdd„ |D ƒdœW S  ty4 } ztddt	|ƒ› �d�‚d}~ww )	u,   RÃ©cupÃ©rer tous les signaux actifs avec PnLr—  c                 S   ó   g | ]}|  ¡ ‘qS r   )Ú
model_dump)rÊ   r‡   r   r   r   rÍ   ™  ó    z&get_active_signals.<locals>.<listcomp>)r   rþ   rˆ  Úactive_countr  r›  u&   Erreur rÃ©cupÃ©ration signaux actifs: rœ  N)
r…  r†  Úget_active_signalsr   r_   r  rd   r   r   rž  )rˆ  Úactive_signalsr   r   r   r   r¬  Œ  s   €
û€ÿr¬  z%/api/trading/close-signal/{signal_id}úManual closer¥  Úreasonc              
   Ã   sl   �zt  | |¡}|rdd| › d�t ¡  ¡ dœW S tddd�‚ ty5 } ztdd	t|ƒ› �d�‚d
}~ww )zFermer un signal (position)r—  rï   u    fermÃ©©r   r¦  rþ   é”  u#   Signal non trouvÃ© ou dÃ©jÃ  fermÃ©rœ  r›  zErreur fermeture signal: N)r…  Úclose_signalr   r_   r  r   r   rž  )r¥  r¯  r—  r   r   r   r   r²  Ÿ  s   €

ý€ÿr²  z/api/debug/price_cachec               
   Ã   s†   �z(i } t jrt jjni }| ¡ D ]\}}|j|j|jdœ| |< qdt|ƒ| dœW S  tyB } zdt	|ƒdœW  Y d}~S d}~ww )zDebug du cache de prix)r  r›   rþ   r—  )r   Ú
cache_sizeÚ
cache_datare   )r   re   N)
rž   rŸ   r  rÕ   r  r›   rþ   rd   r   rž  )r´  Úcacherh   r¢   r   r   r   r   Údebug_price_cache±  s"   €ýý€ÿr¶  z/api/debug/liquidityc               
   Ã   sÒ   �zPi } t jD ]/}t|ƒ}tj |¡}|r6t||jƒ}|t jv }|jd|jd›�||t j	|jt j	kdœ| |< qt
t|  ¡ dd„ dd�ƒ}d|t j	tt jƒd	œd
œW S  tyh } ztddt|ƒ› �d�‚d}~ww )u0   Debug des volumes 24h et liquiditÃ© des marchÃ©sú$z,.0f)r›   Úvolume_24h_formattedÚ	is_liquidÚis_high_liquidityÚmin_thresholdÚmeets_volumec                 S   s   | d d S )Nr\   r›   r   rd  r   r   r   rf  à  rg  z!debug_liquidity.<locals>.<lambda>Trh  r—  )r�   Úhigh_liquidity_count)r   Úliquidity_datarX   r›  u   Erreur debug liquiditÃ©: rœ  N)rX   Úwatched_symbolsrm   rž   rŸ   r    r£   r›   rœ   r�   Údictru  rÕ   rd   r   r   rž  )r¾  rh   Úprice_symbolr¢   r¹  Úis_high_liquidÚsorted_datar   r   r   r   Údebug_liquidityÈ  s8   €



ú€
þý	€ÿrÄ  z/api/debug/hyperliquid_metac               
   Ã   sÎ   �t jsddiS zCt j ¡ } | sddiW S d}d| v r-| d D ]}| d¡dkr,|} nq|t|  dg ¡ƒ|  d¡rG|  dg ¡dd… d	œW S g d	œW S  tyf } zdd
t|ƒ› �iW  Y d}~S d}~ww )uP   Debug: afficher les mÃ©ta-informations Hyperliquid pour les contraintes d'ordresre   ú!Client Hyperliquid non disponibleu%   Aucune mÃ©ta-information rÃ©cupÃ©rÃ©eNÚuniverser]  ÚDOGEr    )Ú	doge_infoÚtotal_tokensÚsample_tokensu   Erreur rÃ©cupÃ©ration mÃ©ta: )rÏ   r`   Úget_meta_infor•   rd   r   rž  )Ú	meta_inforÈ  Ú
token_infor   r   r   r   Údebug_hyperliquid_metaî  s0   €

þýý€ÿrÎ  z/api/dashboard/summaryc                  Ã   s  ��zbt ƒ } ddddœ}| D ]}| dd¡}||v r"||  d7  < qtj}d}tj ¡ D ]}t |¡ ||j7 }q-tdd„ tj	D ƒƒ}|| }t
tjƒ}	t
tj	ƒ}
tj	rftdd„ tj	D ƒƒt
tj	ƒ d	 nd}d
}tjdv �r@z²ddl}| ¡ 4 I dH šZ}| d¡4 I dH š;}|jdkr´| ¡ I dH }| d¡dkr¯| dg ¡}t
|ƒ}	tdd„ |D ƒƒ}n	d}	d}nd}	d}W d  ƒI dH  n1 I dH sÈw   Y  W d  ƒI dH  n1 I dH sÝw   Y  z4ddlm} |ƒ }| ¡ }t
|ƒ}
|�rtdd„ |D ƒƒ}|t
|ƒ d	 }tdd„ |D ƒƒ}|| }W n   d}
|}Y d}W n t�y? } zt d|› �¡ d}W Y d}~nd}~ww dt
| ƒ|d |d |d tj�rSdnd|||	|
||dœt ¡  ¡ dœW S  t�yƒ } zdt|ƒt ¡  ¡ d œW  Y d}~S d}~ww )!u   RÃ©sumÃ© dashboard principalr   ©rx   rz   r–  rŒ   r–  r\   c                 s   ó   � | ]}|j V  qd S ©N©rÃ   ©rÊ   rÚ   r   r   r   Ú	<genexpr>  ó   € z(get_dashboard_summary.<locals>.<genexpr>c                 s   ó   � | ]
}|j d krdV  qdS ©r   r\   NrÒ  rÓ  r   r   r   rÔ     ó   € r¿   Ú
simulationr¶   Nú+http://localhost:8888/api/trading/positionséÈ   r   r—  rp  c                 s   s   � | ]	}|  d d¡V  qdS )rÃ   r   Nrb  rÓ  r   r   r   rÔ  /  s   € )ÚPositionPersistenceServicec                 s   rÖ  r×  rÒ  rÓ  r   r   r   rÔ  ?  rØ  c                 s   rÐ  rÑ  rÒ  rÓ  r   r   r   rÔ  A  rÕ  Úpositions_apiu1   Erreur rÃ©cupÃ©ration donnÃ©es live Hyperliquid: Úsimulation_fallbackrx   rz   ÚactiveÚstopped)Útotal_signalsÚbuy_signalsÚsell_signalsÚhold_signalsÚengine_statusÚcurrent_balanceÚ	total_pnlrp  Útotal_tradesÚwin_rateÚdata_source)r   Úsummaryrþ   re   ©r   re   rþ   )Úgenerate_signals_for_apir•   rÏ   ræ  rÖ   ÚvaluesÚupdate_position_pnlrÃ   rt  Úclosed_positionsrd   rÐ   ÚaiohttpÚClientSessionr   ÚjsonÚ+crypto_trader.services.position_persistencerÜ  Úload_closed_positionsr   r-   re   Úrunningr   r_   r  rž  )r  Úsignal_countsr‡   r¡  ræ  Útotal_active_pnlrÚ   Útotal_closed_pnlrç  rp  rè  ré  rê  rñ  ÚsessionÚrespÚpositions_dataÚactive_positions_listrÜ  Úpersistencerð  Úprofitable_tradesr   r   r   r   Úget_dashboard_summary	  sž   €€


,
*ô(ÿ€€þõ
ñ
ý€ÿr   z/api/system/statusc               
   Ã   s  �zdt ƒ } ddddœ}| D ]}| dd¡}||v r!||  d7  < qt ¡ }dt ¡  ¡ dtdd	„ | D ƒƒt ¡  ¡ d
œd|d |d  t ¡  ¡ d
œdœtjrRdndt| ƒ|d |d |d |dœdœW S  t	yƒ } zdt
|ƒt ¡  ¡ dœW  Y d}~S d}~ww )u/   Status du systÃ¨me avec mÃ©triques live tradingr   rÏ  rŒ   r–  r\   Úoperationalrß  c                 S   s   g | ]	}|  d ¡r|‘qS )rÄ   rb  r  r   r   r   rÍ   {  s    z%get_system_status.<locals>.<listcomp>)r   Ú
data_countÚlast_updaterx   rz   )Úbinance_spotÚhyperliquid_futuresrà  )r   r˜  râ  rã  rä  Úlive_trading)r   rþ   ÚoraclesÚtrading_enginere   rì  N)rí  r•   rÏ   Úget_status_dictr   r_   r  rd   rö  r   rž  )r  r÷  r‡   r¡  rå  r   r   r   r   Úget_system_statuse  sH   €€

ý
ýúúñ
ý€ÿr
  z/api/trading/simulationc                  Ã   sÔ   �zQt  ¡ } |  di ¡}d| dd¡t| dd¡ƒ| dd¡ | dd¡| dd	¡d	 d	 d
 | dd¡| dd	¡| dd¡| dd¡| dd¡dœ	t ¡  ¡ dœW S  tyi } ztddt	|ƒ› �d�‚d}~ww )u/   Simulation de trading basÃ©e sur le moteur liveÚmetricsr—  rç  r   Úavg_lossrè  r\   ræ  é'  r¿   Úprofit_factorrp  ré  )	Útotal_potential_profitÚtotal_potential_riskÚnet_potentialÚreturn_percentageÚrisk_reward_ratioÚlive_balancerp  rè  ré  )r   rÙ  rþ   r›  zErreur simulation: rœ  N)
rÏ   r	  r•   rÓ   r   r_   r  r   r   rž  )rå  r  r   r   r   r   Úget_trading_simulation•  s*   €






÷
ó€ÿr  z/api/trading/livec            
   
   Ã   s¶  �zÂt  ¡ } |  di ¡}t jdv rªz~ddl}| ¡ 4 I dH šI}| d¡4 I dH š*}|jdkrH| ¡ I dH }| d¡dkrHt| d	g ¡ƒ}||d	< W d  ƒI dH  n1 I dH sXw   Y  W d  ƒI dH  n1 I dH smw   Y  t j	rŽt j	 
¡ }|rŽ| d
i ¡}|rŽt| dd¡ƒ|d< W n ty© }	 zt d|	› �¡ W Y d}	~	nd}	~	ww d|  d¡t j||  d	g ¡|  dg ¡|  d¡dœW S  tyÚ }	 ztddt|	ƒ› �d�‚d}	~	ww )u"   DonnÃ©es de trading en temps rÃ©elr  r¶   r   NrÚ  rÛ  r   r—  rp  ÚmarginSummaryÚaccountValueræ  u8   Erreur rÃ©cupÃ©ration donnÃ©es live pour /trading/live: rå  Úrecent_tradesrþ   )r   rå  Úcurrent_moder  rp  r  rþ   r›  u   Erreur donnÃ©es live: rœ  )rÏ   r	  r•   rÐ   rñ  rò  r   ró  rd   r`   Úget_account_staterÒ   r   r-   re   r   rž  )
rå  r  rñ  rú  rû  rü  Úactive_positions_countÚaccount_stateÚmargin_summaryr   r   r   r   Úget_live_trading_data³  sN   €


*û(ÿ	
€€ÿ

ù
€ÿr  z/api/system/engine_infoc                   Ã   s   �ddddddddœddœS )	z,Informations sur le moteur de trading actuelr&  z1.0TFzVia Hyperliquid interface)Úposition_openingÚautomatic_closingÚtrailing_stopsÚtake_profitsÚmanual_closingu>   Moteur simplifiÃ© axÃ© sur l'ouverture de positions uniquement)Úengine_typerZ  ÚcapabilitiesÚnoter   r   r   r   r   Úget_engine_infoÞ  s   €ûör'  z/api/trading/positionsc            ,      ƒ   sð  ��zÝddl m}  tjrttjjƒnd}t d|› d�¡ g }tj	dv �rdtj
�rd�ztƒ }| ¡ D �]\}}|‰ |d }|d }|d }|d	 }	| d
|¡}
trqtjrqttjj ¡ ƒ}tj ˆ ¡}|rh|j}
n	t dˆ › d�¡ d}d}|
|kr |dkr | ¡ dkr’|
| | d }||
|  }n||
 | d }|||
  }t|	ƒdkr¨|	n|}|| }d}d}tródtv rótd }t|ttfƒrÊt|ƒ}d}n)t|tƒrÚ| ¡ rÚt|ƒ}d}nt|tƒròd|v ròt|d ƒ}d}| dd¡}n	 |�s�zjtj
jdd�}‡ fdd„|D ƒ}|�rQ|d }t dˆ › d|› �¡ tj
 ¡ }ˆ |v �rC|ˆ  }tdt dt|d ƒƒƒ}t d |› d!ˆ › d"|› d#�¡ nd}t d$|› d!ˆ › �¡ nd}t d%|› d!ˆ › d&�¡ W n  t!�y€ } zd}t d'ˆ › d|› �¡ W Y d(}~nd(}~ww || }d)}d*}| ¡ dk�rŸ|d+|  }|d+||   }n|d+|  }|d+||   }|| } t"ˆ ||ƒ}!||
 }|| }"t d,ˆ › d-|d.›d/|
d0›d1|› d2�	¡ t d3|d0›d4|"d0›�¡ | #i d5d6ˆ › d7tt$ %¡  &¡ ƒ› �“d8ˆ “d| ¡ “dt'|"d9ƒ“d:t'|d9ƒ“d;t'|d<ƒ“d|“d
|
“d	t'|d9ƒ“d=t'| d9ƒ“d|“d>|!“d?t'|d9ƒ“d@dA“dBt'|dƒ“dCt'|dƒ“¡ q2t dDt|ƒ› dE�¡ W n t!�yc } zt (dF|› �¡ W Y d(}~nd(}~ww tj	dv�r¥tj) *¡ D ]}#t +|#¡ �qot,tj) *¡ dGdH„ ddI�D ] }#| #|#j-|#j.|#j/|#j0|#j1|#j2|#j3|#j4|#j5|#j6|#j7dJdKœ¡ �q„ddLl8m9}$ |$j:dd�}%t dMt|%ƒ› dN�¡ t;dOdP„ |%D ƒƒ}&t dQ|&› �¡ |%�rø|%d }'t dR|'j-› dS|'j1› dT|'j2› �¡ |'j<dUk�røt dV|'j1› dW|'j6› �¡ dX|g t$ %¡  =¡ dYœ}(g })t dZt|%ƒ› d[�¡ |%D ]Â}#t d\|#j-› d]|#j<› d^�¡ |#j<dUk�rÓzw|#j-|#j.|#j/|#j1d(u�r:t|#j1ƒnd_|#j2d(u�rFt|#j2ƒnd_|#j3d(u�rRt|#j3ƒnd_|#j4d(u�r^t|#j4ƒnd_t|#j>�ped`ƒt|#j6�pld`ƒ|#j5d(u�rxt|#j5ƒnd+t|#j&ƒt|#j?�p‡t$ %¡  =¡ ƒdaœ}*|) #|*¡ t db|#j-› dc|#j1› �¡ W �q t!�yÒ }+ z&t (dd|#j-› d|+› �¡ t (det@|#ddfƒ› dgt@|#d
dfƒ› �¡ W Y d(}+~+�qd(}+~+ww �q|)d(d… |(dh< |(W S  t!�y÷ } ztAdidjt|ƒ› �dk�‚d(}~ww )lu   Positions ouvertes et fermÃ©esr   )ÚasdictzCache prix: rí   r¶   r¾   r»   rÀ   rÃ   rÄ   u   Aucun prix trouvÃ© pour z dans le cache Hyperliquidrá   r¿   ç{®Gáz„?r    Frü   TÚvalueÚtypeÚunknowné2   ©Úlimitc                    s   g | ]}|  d ¡ˆ kr|‘qS )Úcoinrb  )rÊ   Úf©r  r   r   rÍ   K  s    z!get_positions.<locals>.<listcomp>u   Fill rÃ©cent pour r|   r¤   é   r°   u%   Leverage estimÃ© via max disponible: zx pour z (max=rð   u   Leverage par dÃ©faut: zLeverage fallback: z (pas de fills)u$   Erreur rÃ©cupÃ©ration leverage pour Nr§   g       @r\   zPOSITION SIZE CALC z: contracts=z.4fz	, price=$r  z, leverage=re  z  -> notional=$z, real_size=$ÚidÚHL_rv   rh   rå   Únotional_sizeÚcontract_sizeé   rÂ   ÚdurationrÝ   r   ÚHYPERLIQUIDÚtake_profitÚ	stop_lossu   RÃ©cupÃ©rÃ© z positions Hyperliquidu-   Erreur rÃ©cupÃ©ration positions Hyperliquid: c                 S   s   | j S rÑ  )rþ   )Úpr   r   r   rf  Ÿ  s    zget_positions.<locals>.<lambda>rh  ÚENGINE)r4  rh   rÀ   r»   r¾   rÄ   rÃ   rÂ   rü   r9  rÝ   r   rS   zDB history retrieved: ú
 positionsc                 s   s   � | ]
}|j d krdV  qdS )ÚCLOSEDr\   N)r   rÓ  r   r   r   rÔ  µ  rØ  z get_positions.<locals>.<genexpr>zClosed positions count: zFirst position sample: id=z, entry=z
, current=r@  z#First closed position: entry_price=z, duration=r—  )r   rp  rð  rþ   zProcessing z positions for closed statusú	Position z has status: 'ú'ru   zN/A)r4  rh   rÀ   r¾   Ú
exit_pricerÃ   rÂ   Úclose_reasonr9  rü   rþ   Úclose_timestampzAdded closed position: z with entry_price: z!Error processing closed position zPosition data: entry_price=ÚMISSINGz, current_price=rð  r›  zErreur positions: rœ  )BÚdataclassesr(  rž   rŸ   rd   r  r-   r6   rÏ   rÐ   r`   rà   rÕ   r•   Úlistr  r    r  r×   rÔ   rÓ   Úhl_posÚ
isinstancer±   rÒ   rž  ÚisdigitrÀ  Úget_fill_inforc   ra   r–   r—   r   Úcalculate_position_durationr  r   r_   rþ   r  re   rÖ   rî  rï  ru  r4  rh   rÀ   r»   r¾   rÄ   rÃ   rÂ   rü   r9  rÝ   rô  rT   Úget_position_historyrt  r   r  rD  rE  r  r   ),r(  Úprice_cache_sizerý  rØ   rh   Úpos_datar¾   r»   rÀ   Úunrealized_pnlrÄ   Úcache_symbolsÚcached_priceÚcalculated_pnl_usdÚpnl_percent_baseÚ	final_pnlÚnotional_valueÚreal_leverageÚleverage_foundÚleverage_valÚleverage_typeÚfillsÚsymbol_fillsÚlatest_fillÚavailable_leveragesr²   r   rÝ   Úrisk_pctÚprofit_multiplierr<  r;  rÂ   r9  Úreal_position_sizerÚ   rT   Ú
db_historyÚclosed_countÚ	first_posÚresultrð  Úpos_dictÚ	pos_errorr   r2  r   rÑ   î  sv  €


 €"€þ(ÿþý
ü
û
úùø
	÷

öõô
óò
ñ
ð€ÿô"
üô
 4€þî€ÿrÑ   z)/api/trading/close_position/{position_id}Úposition_idc              
   Ã   s´  �zºt  d| › dtj› �¡ tjdv r|  d¡ry|  d¡}t|ƒdkrs|d }t  d|› �¡ t |¡}| d	¡rWt  d
|› d| dd¡› �¡ d	| dd|› d�¡| dœW S t  d|› d| dd¡› �¡ t	dd| dd¡› �d�‚t	ddd�‚t	ddd�‚tj
 | ¡}|s–t  d| › d�¡ t	ddd�‚t  d|j› d|j› d| › �¡ t |d ¡ d	d|j› d|j› d�| dœW S  t	yÃ   ‚  tyÙ } zt	d!d"t|ƒ› �d�‚d#}~ww )$u   Fermer une position spÃ©cifiquezAPI CLOSE POSITION REQUEST: z	 - Mode: r¶   r5  rv   r¤   r\   z.MANUAL HYPERLIQUID CLOSE: Attempting to close r—  z"MANUAL HYPERLIQUID CLOSE SUCCESS: z - r¦  rº   rA  õ    fermÃ©e©r   r¦  ri  z!MANUAL HYPERLIQUID CLOSE FAILED: re   ÚInconnueé�  zErreur fermeture Hyperliquid: rœ  zFormat d'ID position invalider±  u!   Position Hyperliquid non trouvÃ©ez)MANUAL SIMULATION CLOSE FAILED: Position z
 not foundõ   Position non trouvÃ©ezMANUAL SIMULATION CLOSE: r  z - Position: ÚFERMETURE_MANUELLEr›  zErreur fermeture position: N)r-   ÚcriticalrÏ   rÐ   Ú
startswithr  rd   Ú$close_hyperliquid_position_by_symbolr•   r   rÖ   r×   rh   rÀ   Úclose_positionr   rž  )ri  Úpartsrh   rf  Úpositionr   r   r   r   rs  æ  sH   €




ý ý€ÿrs  z /api/trading/purge_all_positionsc               
   Ã   sÒ   �zHddl m}  d}ttj ¡ ƒD ]}tj |¡}|r%t |d¡ |d7 }q|  ¡ }tj	 
¡  t d|› d|› d�¡ dd	|› d
|› d�||dœW S  tyh } zt d|› �¡ tddt|ƒ› �d�‚d}~ww )z;Purger TOUTES les positions (actives + historique) - DANGERr   rS   ÚPURGEDr\   u   PURGE COMPLÃˆTE: u    positions actives fermÃ©es, u    positions supprimÃ©es de la DBr—  u   Purge complÃ¨te effectuÃ©e: z actives + z historique)r   r¦  Úclosed_activeÚdeleted_historyzErreur purge: r›  rœ  N)rô  rT   rH  rÏ   rÖ   r  r•   rs  Úpurge_all_positionsrð  rV  r-   r×   r   re   r   rž  )rT   rd  ri  ru  Údb_countr   r   r   r   ry    s.   €€
ü€þry  z#/api/trading/position/{position_id}c              
   ƒ   s�   �z(ddl m} | ˆ ¡}|r$‡ fdd„tjD ƒt_ddˆ › d�dœW S td	d
d�‚ ty1   ‚  tyG } ztddt|ƒ› �d�‚d}~ww )z&Supprimer une position de l'historiquer   rS   c                    s   g | ]	}|j ˆ kr|‘qS r   )r4  rÓ  ©ri  r   r   rÍ   H  s    z0delete_position_from_history.<locals>.<listcomp>r—  rA  u    supprimÃ©e©r   r¦  r±  rn  rœ  r›  zErreur suppression: N)rô  rT   Údelete_positionrÏ   rð  r   r   rž  )ri  rT   r—  r   r   r{  r   Údelete_position_from_history=  s    €

ÿ€ÿr~  z/api/trading/refresh_positionsc               
   Ã   sŽ   �z.d} t j ¡ D ]}t  |¡ | d7 } q	trt ¡ }nd}dd| › d|› d�t ¡  ¡ dœW S  t	yF } zt
dd	t|ƒ› �d
�‚d}~ww )u,   Bouton manuel pour rafraÃ®chir les positionsr   r\   r—  u   Prix mis Ã  jour: z positions, ra  r°  r›  u   Erreur rafraÃ®chissement: rœ  N)rÏ   rÖ   rî  rï  r…  r†  r   r_   r  r   r   rž  )rˆ  rÚ   Úsignals_updatedr   r   r   r   Úrefresh_positionsU  s"   €



ý€ÿr€  z/api/trading/force_close_allc                  Ã   sò  ��zTt  d¡ tj ¡ } | sdddœW S g }g }tdt| ƒ› d�ƒ | D ]æ}|d  dd	¡}|d
 }d|› dtt	 	¡ d ƒd › �}zŸt
|ƒI dH }| d¡dkrh| |› d|› �¡ td|› d|› d�ƒ nyzPt|d ƒ}|dk}	d|› d|› �}
tjj||	|d|
d�}|r§| di ¡ d¡r§| |› d|› �¡ td|› d|› d�ƒ n| |› d�¡ td|› d�ƒ W n( tyà } z| |› dt|ƒ› �¡ td|› d|› �ƒ W Y d}~nd}~ww W q% t�y } z| |› dt|ƒ› �¡ td|› d |› �ƒ W Y d}~q%d}~ww d!dl	}| d"¡ tj ¡ }|�r!t|ƒnd!}d#t|ƒ› d$t| ƒ› d%�}|�r<|d&t|ƒ› �7 }|d!k�rI|d'|› d(�7 }|�sNdnd)||||d*œW S  t�yx } zt  d+|› �¡ d,t|ƒdœW  Y d}~S d}~ww )-zRForcer la fermeture de TOUTES les positions en utilisant l'endpoint qui fonctionneuC   API FORCE CLOSE ALL POSITIONS REQUEST - DÃ©but de fermeture massiver—  u   Aucune position Ã  fermerr|  z
[FORCE CLOSE ALL] u    positions Ã  fermerrh   r¹   rº   rÀ   r5  rv   iè  l    d(	 Nr   r  u   [FORCE CLOSE ALL] âœ… rj  r»   râ   ÚFORCE_CLOSE_T)rh   Úis_buyr»   Úreduce_onlyÚ	order_tagÚfilledu    fermÃ©e (direct)z: Ordre non rempliu   [FORCE CLOSE ALL] â�Œ u    Ã©chec directr|   z erreur directe: z	 erreur: r   r\   u
   FermÃ©es: r‰  r?  u    | Ã‰checs: z | z
 restantesÚpartial)r   r¦  ÚclosedÚfailedÚ	remainingzErreur force_close_all: re   )r-   rp  rÏ   r`   rÑ   rE  rd   rl   r±   Útimers  r•   r  rÓ   Úplace_market_orderr   rž  r‡  re   )rÙ   rð  Úfailed_positionsru  rh   rÀ   ri  rf  r»   r‚  Úforce_close_tagÚorder_resultÚe2r   Útime_moduler‰  Úremaining_countr¦  r   r   r   Úforce_close_all_positionsn  s„   €

 û€ €þ€ €þ


û€þr’  z/api/trading/control/{action}Úactionc                 Ã   s   �zö| dkr"t jsdt _dd„ }t |ƒ ¡adddœW S dd	dœW S | d
kr0t  ¡  dddœW S | dkrïd}d}z�trÂt jrÂt j ¡ }|r•|D ]M}z(t j 	|d ¡}| 
d¡r\|d7 }n|d7 }t d|d › d| 
d¡› �¡ W qG ty” } z|d7 }t d|d › d|› �¡ W Y d}~qGd}~ww ddl}| d¡ t j ¡ }	|	r©t|	ƒnd}
|
dkr¸|› d|
› d�}nd|› d|› d�}nd}W n# tyè } zt d|› �¡ |› dt|ƒ› �}W Y d}~nd}~ww d|dœW S tdd| › �d �‚ t�y } ztd!d"t|ƒ› �d �‚d}~ww )#u   ContrÃ´le du moteur de tradingrL  Tc               
   Ó   sd   �z
t  ¡ I d H  W d S  ty1 }  ztd| › �ƒ dd l}| ¡  tdƒ W Y d } ~ d S d } ~ ww rB  rC  rH  r   r   r   rI  Ð  s   €€üz,control_engine.<locals>.wrapped_trading_loopr—  u   Moteur dÃ©marrÃ©r|  r6   u   Moteur dÃ©jÃ  en coursrS  u   Moteur arrÃªtÃ©Ú	close_allr   rh   r\   u   Ã‰chec fermeture r|   re   zErreur fermeture Nrå   u    positions fermÃ©es, z positions restantesu   Toutes les positions fermÃ©es: u    rÃ©ussies, u    Ã©chouÃ©esu<   Aucune position Ã  fermer (mode simulation ou pas de client)z)Erreur lors de la fermeture Hyperliquid: u1    positions locales fermÃ©es, erreur Hyperliquid: rm  zAction inconnue: rœ  r›  u   Erreur contrÃ´le: )rÏ   rö  rO  rP  Úengine_taskrS  rM  r`   rÑ   rs  r•   r-   re   r   rŠ  r‡  rd   rž  r   )r“  rI  rd  Úfailed_countrÖ   rÚ   rf  r   rŠ  Úremaining_positionsr‘  r¦  r   r   r   Úcontrol_engineÇ  sh   €	



 €&€þ

€€þ€ÿr˜  z/api/trading/set_mode/{mode}Úmodec              
   Ã   s’   �z0g d¢}| |vrt dd| › d|› �d�‚| dv r!t | t¡ nt | d¡ dd	| › �tjd
œW S  tyH } zt ddt|ƒ› �d�‚d}~ww )zChanger le mode de trading©r^  r·   r¸   rm  zMode invalide: z. Modes valides: rœ  r¶   Nr—  u   Mode de trading changÃ© vers )r   r¦  r  r›  zErreur changement mode: )r   rÏ   Úset_trading_moder`   rÐ   r   rž  )r™  Úvalid_modesr   r   r   r   r›    s    €ý€ÿr›  z/api/trading/pending_ordersc               
   Ã   sF   �z
dt tj ¡ ƒiW S  ty" }  ztddt| ƒ› �d�‚d} ~ ww )u6   RÃ©cupÃ©rer tous les ordres en attente de confirmationÚpending_ordersr›  u   Erreur rÃ©cupÃ©ration ordres: rœ  N)rH  rÏ   r�  rî  r   r   rž  )r   r   r   r   Úget_pending_orders/  s   €€ÿrž  z%/api/trading/confirm_order/{order_id}Úorder_idc              
   Ã   sœ   �z5| t jvrtddd�‚t j|  }t  | ¡}| d¡r*dd| › d�| d¡dœW S d	d
| d	d¡› �dœW S  tyM } ztddt|ƒ› �d�‚d}~ww )u*   Confirmer et exÃ©cuter un ordre en attenter±  õ   Ordre non trouvÃ©rœ  r—  úOrdre u    confirmÃ© et exÃ©cutÃ©ri  rk  re   u   Erreur exÃ©cution: úErreur inconnuer|  r›  zErreur confirmation: N)rÏ   r�  r   Úexecute_pending_orderr•   r   rž  )rŸ  Úorderrf  r   r   r   r   Úconfirm_pending_order7  s$   €




ýþ€ÿr¥  z$/api/trading/reject_order/{order_id}c              
   Ã   sv   �z"| t jvrtddd�‚t j | ¡}dd|d › d|d › d	�d
œW S  ty: } ztddt|ƒ› �d�‚d}~ww )zRejeter un ordre en attenter±  r   rœ  r—  r¡  rh   r  rÀ   u    rejetÃ©r|  r›  zErreur rejet: N)rÏ   r�  r   Úpopr   rž  )rŸ  r¤  r   r   r   r   Úreject_pending_orderR  s   €
þ€ÿr§  z/api/trading/execute_signalÚrequest_datac              
   Ã   s  �zi|   d¡}|   d¡}|r|r|dkrdddœW S tƒ }d}|D ]}|d |kr3|d |kr3|} nq!|sCdd|› d	|› d
�dœW S t |¡}|  d¡rad|  d¡d|› d	|› �|  d¡dœW S d|  dd¡dœW S  ty† } zddt|ƒ› �dœW  Y d}~S d}~ww )zP
    Convertit un signal en ordre en attente dans le moteur de trading live
    rh   rŒ   r–  FzSignal invalide ou HOLD©r—  re   Nrï   r  u%    non trouvÃ© dans les oracles actuelsr—  TrŸ  u   Ordre en attente crÃ©Ã© pour r¤  )r—  rŸ  r¦  r¤  re   r¢  zErreur serveur: )r•   rí  rÏ   Ú create_pending_order_from_signalr   rž  )r¨  rh   rŒ   Úcurrent_signalsÚmatching_signalr‡   rf  r   r   r   r   Úexecute_signal_to_pendingc  s:   €

€

ü
þ €ÿr­  )Úanalyze_signal_with_positionsÚget_portfolio_contextr¾   Úcurrent_sizec              
   C   s  ze| › d|› d|› �}t  ¡ }|tvr|t|< W dS t| }||  ¡ }|dk r4t|d ƒ}|› d�W S |dk rOt|d ƒ}t|d d ƒ}|› d|› d�W S t|d ƒ}	t|d d ƒ}|	› d|› d�W S  tyƒ }
 zt d	| › d
|
› �¡ W Y d}
~
dS d}
~
ww )uK   
    Calcule la durÃ©e d'une position - version simplifiÃ©e avec cache
    rv   Ú0mrZ   rŽ   Úmi€Q ÚhÚju   Erreur calcul durÃ©e position r|   NÚErreur)r   r_   Úposition_first_seenÚtotal_secondsr±   r   r-   re   )rh   r¾   r°  Úposition_keyÚcurrent_timeÚ
start_timeÚduration_secondsÚminutesr]   Údaysr   r   r   r   rM  ”  s.   €þrM  z/api/trading/portfolio_contextc               
   Ã   s  �zæg } t r�t jr�zyt j ¡ }|r�|D ]m}|d  dd¡}| di ¡}t| dd¡ƒ}|d }t|d ƒ}| d	i ¡}d
}	t|tƒrKt	| dd
¡ƒ}	nt|t	tfƒrVt	|ƒ}	|| }
|	dkrb|
|	 n|
}|dkrn|| d nd}|  
||d  ¡ ||||	dœ¡ qW n tyœ } zt d|› �¡ W Y d}~nd}~ww | rÙt| ƒ}dddddœdddddœg}g }|D ]}t| |ƒ}| 
|||d |d  dœ¡ qµd|| |t ¡  ¡ dœW S dddig d t ¡  ¡ d!œW S  t�y	 } zt d"|› �¡ d#t|ƒd$œW  Y d}~S d}~ww )%u<   RÃ©cupÃ©rer le contexte du portfolio pour l'analyse de biaisrh   r¹   rº   r¼   r½   r   r¾   r»   rü   r\   r*  r¿   rÀ   )rh   rÀ   rÂ   r»   r¾   rü   u/   Erreur rÃ©cupÃ©ration positions pour contexte: Nr¥   rx   g333333ã?zTechnical bullish)rh   rŒ   rŠ   rý   r¦   rz   r  zBearish momentumrŠ   )ÚoriginalÚenhancedÚconfidence_changer—  )r   Úportfolio_contextrÖ   Úsample_enhancementsrþ   r   Úno_positionsz$Aucune position ouverte pour analyse)r   rÁ  rÖ   r¦  rþ   zErreur contexte portfolio: re   r|  )rÏ   r`   rÑ   rl   r•   rÒ   rÓ   rJ  rÀ  r±   r  rÔ   r   r-   r×   r¯  r®  r   r_   r  re   rž  )Úhyperliquid_positionsrÙ   rÚ   rh   rÛ   rQ  r¾   r»   Úleverage_infoÚactual_leveragerW  rÝ   rÂ   r   rÁ  Úsample_signalsÚenhanced_samplesr‡   r¿  r   r   r   Úget_portfolio_context_api¹  s‚   €




ú€€ÿþ

ý
û	
û€þrÉ  z/api/trading/settingsc               
   Ã   s  �zdddl } di d| j“d| j“d| j“d| j“d| j“d	| j“d
| j“d| j“d| j“d| j	“d| j
“d| j“d| j“d| j“d| j“d| j“d| j“trQtjndtrYttjƒndtr_tjnddœdœW S  ty† } zt d|› �¡ dt|ƒdœW  Y d}~S d}~ww )u0   RÃ©cupÃ©rer la configuration de trading actueller   Nr—  rÐ   Úauto_trading_enabledÚsimulation_initial_balanceÚposition_size_percentÚmax_simultaneous_positionsÚmin_confidence_thresholdÚprofit_target_multiplierÚtrailing_stop_distanceÚsignal_refresh_intervalÚenable_binance_oracleÚenable_hyperliquid_oracleÚenable_sentiment_oracleÚenable_safety_checksÚmax_daily_loss_percentÚemergency_stopÚ	log_levelÚlog_to_fileÚUNKNOWN)ræ  rp  Útrading_mode_actual)r   rX   Úlive_engine_settingsu#   Erreur rÃ©cupÃ©ration paramÃ¨tres: re   r|  )Útrading_configÚTRADING_MODEÚAUTO_TRADING_ENABLEDÚSIMULATION_INITIAL_BALANCEÚMAX_SIMULTANEOUS_POSITIONSÚMIN_CONFIDENCE_THRESHOLDÚPROFIT_TARGET_MULTIPLIERÚTRAILING_STOP_DISTANCEÚSIGNAL_REFRESH_INTERVALÚENABLE_BINANCE_ORACLEÚENABLE_HYPERLIQUID_ORACLEÚENABLE_SENTIMENT_ORACLEÚENABLE_SAFETY_CHECKSÚMAX_DAILY_LOSS_PERCENTÚEMERGENCY_STOPÚ	LOG_LEVELÚLOG_TO_FILErÏ   ræ  rd   rÖ   rÐ   r   r-   re   rž  )rÝ  r   r   r   r   Úget_trading_settings  sb   €þýúùø	÷ôóðïîíêéèåäýà&€þrî  rX   c              
   Ã   sâ   �zNddl }d| v rg d¢}| d |vrdd|› �dœW S trId| v r*| d d	 t_d
| v r3| d
 t_d| v r>| d d	 t_d| v rI| d d	 t_ddddœW S  typ } zt d|› �¡ dt	|ƒdœW  Y d}~S d}~ww )õ*   Mettre Ã  jour la configuration de tradingr   NrÐ   rš  re   zMode invalide. Modes valides: r|  rÌ  g      Y@rÍ  rÎ  rÐ  r—  u$   ParamÃ¨tres mis Ã  jour avec succÃ¨su2   RedÃ©marrage nÃ©cessaire pour certains paramÃ¨tres)r   r¦  r&  u!   Erreur mise Ã  jour paramÃ¨tres: )
rÝ  rÏ   r¤  Úmax_positionsÚmin_confidencerÐ  r   r-   re   rž  )rX   rÝ  rœ  r   r   r   r   Úupdate_trading_settings8  s2   €
ý€þrò  z/api/trading/cleanup_ordersc               
   Ã   sN   �zt  ¡ } d| › d�| dœW S  ty& } ztddt|ƒ› �d�‚d}~ww )u)   Nettoyer manuellement les ordres expirÃ©sr—  u    ordres expirÃ©s supprimÃ©s)r   r¦  Úexpired_countr›  zErreur nettoyage: rœ  N)rÏ   Úcleanup_expired_ordersr   r   rž  )ró  r   r   r   r   rô  _  s   €ý€ÿrô  z/api/trading/historyÚallr-  r/  c                 Ã   sJ  ��zg }| dv r®t jdkr®tj|d�}|D ]’}d|v r0t|d ttfƒr0t |d ¡ 	¡ |d< d|v rOt|d ttfƒrOt |d ¡ 	¡ |d< |d |d< n
| 
dt ¡ ¡|d< | 
d	¡d
uru| 
d¡d
uru|d	 }|d }|| |d	< | 
d¡r™| 
d¡r™tj|d |d | 
dd¡|d d�}|d |d< nd|d< | 
d¡r¤dnd|d< q| |¡ | dv rðg }t j ¡ D ]1\}	}t|dƒrê|jdkrêd|	› �|j|jd|j|jt|dt ¡ ƒdt|ddƒddœ
}
| |
¡ q¹| |¡ |jdd„ dd� |d
|… }dt|ƒ| t j|dœW S  t�y$ } zd t|ƒd!œW  Y d
}~S d
}~ww )"uÖ   
    RÃ©cupÃ¨re l'historique de trading :
    - mode='simulation' : historique du moteur seulement
    - mode='hyperliquid' : historique Hyperliquid seulement  
    - mode='all' : historique combinÃ© (dÃ©faut)
    )rõ  Úhyperliquidr^  r.  Ú	open_timeÚopen_timestampÚ
close_timerE  rþ   rÃ   NÚfeesr¾   rC  r»   r   rÀ   )r¾   rÄ   r»   rÀ   rÂ   r@  ÚOPENr   )rõ  rÙ  Úeng_r>  Úrealized_pnl)
r4  rh   rÀ   Ú	operationr»   r  rþ   ÚfeerÃ   r   c                 S   s   | d S )Nrþ   r   rd  r   r   r   rf  ¼  s    z%get_trading_history.<locals>.<lambda>Trh  )r—  Úcountr™  rÐ   ÚtradesFr©  )rÏ   rÐ   r`   rN  rJ  r±   rÒ   r   r   r  r•   rŠ  Úcalculate_position_pnlÚextendrÖ   rÕ   r   r   rh   rÀ   r»   r¾   r  r  r�  rd   r   rž  )r™  r/  rf  rÄ  ru  Úpnl_brutrú  Úpnl_dataÚengine_tradesrß   Úengine_trader   r   r   r   Úget_trading_historyr  sr   €
ü

ö
€
û€ÿr  z/api/portfolioc                  Ã   s0  �zgt  ¡ } t ¡ }| di ¡}d|  dd¡|  dd¡|  dd¡|  dd¡|  dd¡|  d	d
¡|  dg ¡|  di ¡dœ| dd¡| dd¡| dd¡| dd¡| dd¡| dg ¡| dg ¡dœt ¡  ¡ dœW S  ty— } z#dt	|ƒdddddg i ddœddddddœt ¡  ¡ dœW  Y d}~S d}~ww )u;   DonnÃ©es du portfolio rÃ©el depuis Hyperliquid + simulationr  r—  Úaccount_valuer   Úavailable_balancerÝ   rQ  rp  Úaccount_addressrº   rÖ   Úbalances)r	  r
  rÝ   rQ  r  r  rÖ   r  ræ  r  rç  rè  ré  r  )ræ  rç  rè  ré  rp  Úactive_positions_datar  )r   Úreal_portfolioÚsimulation_enginerþ   re   z Failed to fetch Hyperliquid data)r	  r
  rÝ   rQ  r  rÖ   r  re   )ræ  rç  rè  ré  rp  )r   re   r  r  rþ   N)
r`   Úget_portfolio_summaryrÏ   r	  r•   r   r_   r  r   rž  )Úportfolio_datarå  Úengine_metricsr   r   r   r   Úget_portfolio_dataÐ  s^   €







ø






ù
	ëøû
ì€ÿr  z /api/debug/hyperliquid_positionsc               
   Ã   s†   �z&t r#t  ¡ } | | rt| ƒnd| rdd„ | pg D ƒdœW S g dœW S ddiW S  tyB } zddt|ƒ› �iW  Y d}~S d}~ww )	z9Endpoint de debug pour voir les positions Hyperliquid rawr   c                 S   s$   g | ]}t | d d¡ƒdkr|‘qS )Úszir   )rÒ   r•   )rÊ   r=  r   r   r   rÍ   	  rÎ   z/debug_hyperliquid_positions.<locals>.<listcomp>)rÖ   r   Únon_zerore   rÅ  u!   Erreur rÃ©cupÃ©ration positions: N)r`   rÑ   rd   r   rž  )rÖ   r   r   r   r   Údebug_hyperliquid_positions	  s   €ýý
€ÿr  z/api/debug/trading_logsr¿   Úlinesc              
   Ã   sÊ   �zHd}t j |¡sddiW S t|dddd��}| ¡ }t|ƒ| kr)||  d… n|}W d  ƒ n1 s5w   Y  t|ƒt|ƒd	d
„ |D ƒdœW S  tyd } zddt|ƒ› �iW  Y d}~S d}~ww )z;Endpoint pour consulter les derniers logs du trading engineúlogs/trading_engine.logre   õ   Fichier de log non trouvÃ©Úrr.  Úignore)ÚencodingÚerrorsNc                 S   r¨  r   ©Ústrip©rÊ   Úliner   r   r   rÍ   +	  rª  z$get_trading_logs.<locals>.<listcomp>)Útotal_linesÚshowingr   zErreur lecture logs: )r   r   r   ÚopenÚ	readlinesrd   r   rž  )r  Úlog_filer1  Ú	all_linesÚrecent_linesr   r   r   r   Úget_trading_logs	  s"   €
 þý€ÿr)  z/api/debug/engine_statec                   Ã   s<   �t jt jdut jrtt jƒjndt jtt jƒtt jƒdœS )u!   Debug: Ã‰tat du moteur de tradingN)rÐ   Úhyperliquid_client_attachedÚhyperliquid_client_typeÚcurrent_balance_simulationÚpositions_countÚclosed_positions_count)	rÏ   rÐ   r`   r+  r>  ræ  rd   rÖ   rð  r   r   r   r   Údebug_engine_state0	  s   €úr/  z/api/debug/hyperliquid_testc               
   Ã   s¦   �z2t js
ddiW S t j ¡ } | r/|  di ¡}|r!t| dd¡ƒnd}dt|  ¡ ƒ||dœW S ddiW S  tyR } zdd	l}t	|ƒ| 
¡ d
œW  Y d	}~S d	}~ww )z5Debug: Tester directement l'API Hyperliquid du moteurre   u"   Pas de client Hyperliquid attachÃ©r  r  r   T)r—  Úaccount_state_keysr  Úbalance_parsedzaccount_state is NoneN)re   rF  )rÏ   r`   r  r•   rÒ   rH  r  r   rF  rž  rz  )r  r  Úbalancer   rF  r   r   r   Údebug_hyperliquid_test<	  s*   €


ü
þ€þr3  z/api/trading/configÚconfig_datac              
   Ã   s¶  �zÂi }d| v rt dtdt| d ƒƒƒt_tj|d< d| v r0t dtdt| d ƒƒƒt_tj|d< d| v rFt dtd	t| d ƒƒƒt_tj|d< d
| v r\t dtdt| d
 ƒƒƒt_tj|d
< d| v rrt dtdt| d ƒƒƒt_	tj	|d< z<ddl
}| ¡ D ]1\}}|dkr‡||_q{|dkr‘|d |_q{|dkr›|d |_q{|d
kr¥|d |_q{|dkr¬||_q{W n	 ty·   Y nw dd|t ¡  ¡ dœW S  tyÚ } ztddt|ƒ› �d�‚d}~ww )rï  rð  r\   r3  Úposition_size_pctr§   g      Ð?rñ  r)  r¨   rÐ  r”   rs   rÏ  r�   g      @r   Nr¿   r—  u   Configuration mise Ã  jour)r   r¦  Úupdated_paramsrþ   r›  u   Erreur mise Ã  jour config: rœ  )r–   r—   r±   rÏ   rð  rÒ   r5  rñ  rÐ  rÏ  rÝ  rÕ   rá  râ  rä  rã  ÚImportErrorr   r_   r  r   r   rž  )r4  r6  rÝ  Úparamr*  r   r   r   r   Úupdate_trading_configV	  sZ   €




€öþ
ü€ÿr9  z	/api/logsc              
   Ã   s   �z_ddl }d}|j |¡sdg ddœW S t|ddd	��}| ¡ }W d  ƒ n1 s+w   Y  t|ƒ| kr=||  d… n|}d
d„ |D ƒ}d|t|ƒ|j |¡rW|j |¡ndt ¡  	¡ dœW S  t
y } zdg t|ƒt ¡  	¡ dœW  Y d}~S d}~ww )uD   RÃ©cupÃ¨re les derniÃ¨res lignes du fichier de log du trading enginer   Nr  Fr  )r—  r   r¦  r  r.  )r  c                 S   s   g | ]
}|  ¡ r|  ¡ ‘qS r   r  r   r   r   r   rÍ   ¥	  s    zget_logs.<locals>.<listcomp>T)r—  r   r"  Ú	file_sizerþ   )r—  r   re   rþ   )r   r   r   r$  r%  rd   Úgetsizer   r_   r  r   rž  )r  r   r&  r1  r'  r(  Úclean_linesr   r   r   r   Úget_logs�	  s8   €ý
ÿ
û
ü€ÿr=  Ú__main__zSERVEUR UNIFIE CRYPTO TRADINGzURL: http://r/  zAuthentification: z / u   FonctionnalitÃ©s:u$      - Dashboard avec signaux paginÃ©su%      - Moteur de trading live intÃ©grÃ©z'   - Portfolio Hyperliquid + Simulationu      - Suivi PnL temps rÃ©elu      - API complÃ¨te unifiÃ©ez,DATES DE DERNIERE MODIFICATION DES FICHIERS:r#   r$   r%   r&   r'   r(   r)   r*   zunified_trading_server:appF)ÚhostÚportÚreloadrÑ  )r®  )rõ  r-  )r¿   )ŸÚ__doc__Úfastapir   r   r   r   Úfastapi.responsesr   Úfastapi.staticfilesr   Úfastapi.templatingr   r	   Úfastapi.securityr
   r   Ú
contextlibr   ÚuvicornrO  Ú	threadingr0   rŠ  r   rH   r   Útypingr   Ú	getLoggerr>  r-   rž  r   r:   r±   Úgetenvr;   r=   r>   r@   ÚsecurityrO   Ú1crypto_trader.oracles.technical_indicators_oraclerP   Ú&crypto_trader.oracles.sentiment_oraclerQ   Ú#crypto_trader.oracles.tradfi_oraclerR   rô  rT   Úcrypto_trader.models.indicatorsrU   Ú$crypto_trader.services.price_servicerV   Ú/crypto_trader.services.executed_signals_servicerW   Úcrypto_trader.configrX   r}   r  rQ  rž   r…  rb   r^   rg   rm   rÒ   r‰   rÀ  rš   Úboolr£   rµ   rà   rì   r%  Ú+simple_trading_system.simple_trading_enginer&  Ú"simple_trading_system.profit_takerr'  Ú'simple_trading_system.pragmatic_signalsr(  r`   rÝ  Ústarlette.middleware.baser)  Ústarlette.responsesr*  r3  r+  rX  rA  Úadd_middlewareÚmountr�  rE  rÞ  Úvalidate_configrr  rà  rÏ   rM  Úcooldown_managerÚprofit_taker_taskrN  rƒ  Úset_signals_providerrR  r•   r�  r’  r”  r•  r¢  Úpostr§  r¬  r²  r¶  rÄ  rÎ  r   r
  r  r  r'  rÑ   rs  ry  Údeleter~  r€  r’  r˜  r›  rž  r¥  r§  r­  r¶  Úposition_bias_analyzerr®  r¯  rM  rÉ  rî  rò  rô  r  r  r  r)  r/  r3  Úputr9  r=  Úrunr   r   r   r   Ú<module>   sz  
&


$/55 pK



-



%

[
/

*

 x5
 

XL
+%
N
/&
]
:


6
)ê