o
    ‚ ßh3^  ã                   @   sø   d Z ddlZddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
 ddlZddlZddlZddlZej d¡ ddlmZ G dd	„ d	ƒZddlZd
dlmZ zd
dlmZ d
dlmZ d
dlmZ W n eyr   dZdZdZY nw G dd„ dƒZdS )u?   
Trading Engine SimplifiÃ© - Ouverture de positions uniquement
é    N)Údatetime)ÚThreadÚLock)ÚDictÚListÚOptionalz..)ÚHyperliquidClientc                   @   s   e Zd Zddd„ZdS )ÚPositionÚ ç        é   c           	      K   s@   || _ || _|| _|| _|| _| ¡ D ]
\}}t| ||ƒ qd S )N)ÚsymbolÚsideÚsizeÚentry_priceÚleverageÚitemsÚsetattr)	Úselfr   r   r   r   r   ÚkwargsÚkÚv© r   úV/var/www/html/HyperOracle/crypto_trader/simple_trading_system/simple_trading_engine.pyÚ__init__   s   ÿzPosition.__init__N)r
   r
   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r	      s    r	   r   )ÚPositionRetriever)ÚTrendDetector)ÚCooldownManager)ÚBTCCorrelationManagerc                   @   s°   e Zd ZdZd#dd„Zdd„ Zd	d
„ Zdd„ Zdefdd„Z	de
e fdd„Zdefdd„Zdedefdd„Zdd„ Zdedee fdd„Zdd„ Zdd„ Zdd „ Zd!d"„ ZdS )$ÚSimpleTradingEngineuC   Trading engine simplifiÃ© qui ne gÃ¨re que l'ouverture de positionsÚ
SIMULATIONéè  Nc                 C   s4  || _ || _|| _|| _ttddƒ| _d| _ttddƒ| _ttddƒ| _	i | _
tƒ | _d| _|  ¡  d | _|r=tr=t|ƒnd | _trGtd	d
�nd | _trR|rRt|ƒnd | _| jr]| j ¡  | j d¡ | j d|› �¡ | j d| j› �¡ | j d| jrdnd› �¡ | j d¡ | j d| jr“dnd› �¡ d S )NÚMAX_SIMULTANEOUS_POSITIONSé   gš™™™™™¹?ÚMAX_LEVERAGEé   ÚHYPERLIQUID_FEE_RATEgü©ñÒMb@?Fé   )Údefault_cooldown_minutesz%=== SIMPLE TRADING ENGINE STARTED ===zMode: zMax positions: zTrend detection: ÚENABLEDÚDISABLEDu,   Cooldown protection: ENABLED (15min dÃ©faut)zBTC Correlation weighting: )Útrading_modeÚinitial_balanceÚcurrent_balanceÚhyperliquid_clientÚgetattrÚtrading_configÚmax_positionsÚposition_size_pctÚmax_leverageÚhyperliquid_fee_rateÚ	positionsr   ÚlockÚrunningÚsetup_loggerÚsignals_providerr   Útrend_detectorr    Úcooldown_managerr!   Úcorrelation_managerÚstart_background_updatesÚloggerÚinfo)r   r.   r/   r1   r   r   r   r   ,   s0   
 zSimpleTradingEngine.__init__c                 C   s®   t  d¡| _| j t j¡ d}tj |¡st |¡ t  	tj 
|d¡¡}| t j¡ t  ¡ }| t j¡ t  d¡}| |¡ | |¡ | jjsU| j |¡ | j |¡ dS dS )u    Configure le systÃ¨me de loggingr"   Úlogszsimple_trading.logz&%(asctime)s - [%(name)s] - %(message)sN)ÚloggingÚ	getLoggerrA   ÚsetLevelÚINFOÚosÚpathÚexistsÚmakedirsÚFileHandlerÚjoinÚStreamHandlerÚ	FormatterÚsetFormatterÚhandlersÚ
addHandler)r   Úlogs_dirÚfile_handlerÚconsole_handlerÚ	formatterr   r   r   r;   U   s    



þz SimpleTradingEngine.setup_loggerc                 C   s
   || _ dS )z"Injecter le fournisseur de signauxN)r<   )r   Úprovider_funcr   r   r   Úset_signals_providerp   s   
z(SimpleTradingEngine.set_signals_providerc                 C   s2   | j s| j d¡ g S | j d| j › �¡ |   ¡ S )u)   RÃ©cupÃ¨re les signaux depuis le provideru*   âš ï¸�  Aucun signals_provider configurÃ©!u   âœ… Appel signals_provider: )r<   rA   ÚwarningrB   ©r   r   r   r   Úget_signalst   s
   zSimpleTradingEngine.get_signalsÚreturnc                 C   s&   | j dv r| jrt | j¡S t| jƒS )uC   RÃ©cupÃ¨re le nombre de positions actuelles (mÃ©thode centralisÃ©e)©ÚLIVE_MANUALÚ	LIVE_AUTO)r.   r1   r   Úget_positions_countÚlenr8   rZ   r   r   r   Úget_current_positions_count|   s   
z/SimpleTradingEngine.get_current_positions_countc                 C   s*   | j dv r| jrt | j¡S t| j ¡ ƒS )uC   RÃ©cupÃ¨re la liste des positions actuelles (mÃ©thode centralisÃ©e)r]   )r.   r1   r   Úget_hyperliquid_positionsÚlistr8   ÚvaluesrZ   r   r   r   Úget_current_positions_listƒ   s   z.SimpleTradingEngine.get_current_positions_listc                 C   s�   i }|   ¡ }|D ]=}t|dƒr|j|j|j|jdœ||j< q| dd¡ dd¡}| dd¡| dd¡| di ¡ d	d
¡| dd¡dœ||< q|S )uM   Retourne un dictionnaire des positions actuelles pour analyse de corrÃ©lationr   )r   r   r   r   r
   ú-PERPr   r   r   r   Úvaluer   r   )	rf   Úhasattrr   r   r   r   r   ÚgetÚreplace)r   Úpositions_dictÚpositions_listÚposr   r   r   r   Úget_current_positions_dictŠ   s    
ü


üz.SimpleTradingEngine.get_current_positions_dictÚsignalc              
   C   sà  |  d¡}|  d¡}|  ¡ }|| jkr&| j d|› d|› d| j› d�¡ dS ttdd	ƒ}|  d
d¡}||k rI| j d|› d|d›d|› d�¡ dS |  ¡ }|D ]&}t|dƒrZ|j	}	n
|  dd¡ 
dd¡}	|	|kru| j d|› d�¡  dS qO| jrÊ| jdv rÊz-| j |¡\}
}|
s›| j d|› d|› d|› �¡ W dS | j d|› d|› d|› �¡ W n tyÉ } z| j d|› d|› �¡ W Y d}~nd}~ww | j�rz*| j |¡\}
}|
së| j d|› d|› d|› �¡ W dS | j d|› d|› �¡ W n t�y } z| j d|› d|› �¡ W Y d}~nd}~ww | j�rnz1|  ¡ }| j ||¡\}
}|
�s?| j d|› d|› d|› �¡ W dS | j d|› d|› �¡ W d S  t�ym } z| j d|› d|› �¡ W Y d}~d S d}~ww d S )!u<   VÃ©rifie si on peut ouvrir une position basÃ©e sur le signalr   r   zREJECT z: Max positions atteint (ú/ú)FÚMIN_SIGNAL_QUALITY_SCOREgÍÌÌÌÌÌä?Úquality_scorer   u   : Score qualitÃ© insuffisant (ú.2fz < r
   rg   u   : Position dÃ©jÃ  ouverter]   Ú u'   : BloquÃ© par dÃ©tection de tendance - zACCEPT u   : Tendance validÃ©e - u    Erreur dÃ©tection tendance pour ú: Nu   : BloquÃ© par cooldown - zCooldown OK pour u#   Erreur vÃ©rification cooldown pour u   : BloquÃ© par corrÃ©lation - u   CorrÃ©lation OK pour u'   Erreur vÃ©rification corrÃ©lation pour T)rj   rb   r4   rA   rB   r2   r3   rf   ri   r   rk   r=   r.   Úshould_allow_signalrY   Ú	ExceptionÚerrorr>   Úcan_open_positionÚdebugr?   ro   Úshould_open_position)r   rp   r   r   Úcurrent_positions_countÚmin_quality_scorert   Úcurrent_positionsrn   Ú
pos_symbolÚallowedÚreasonÚer   r   r   r}   ¢   sx   


""
þ"€ý€ýû
€ûz(SimpleTradingEngine.should_open_positionc                 C   sv  |s
| j  d¡ dS | j  d¡ | j  d¡ | j  d¡ |D �]}zòt|dƒr_|j}|j ¡ }t|jƒ}tt|j	ƒƒ}t
|jƒ}t|jƒ}|dkrT|| | d | }	nk|| | d | }	n`| dd¡ d	d¡}| d
d¡ ¡ }t| dd¡ƒ}tt| dd¡ƒƒ}t
| di ¡ dd¡ƒ}z| j |¡}|sš|}W n   |}Y |dkr½|dkr½| jr½| jj|||||d�}
|
d }	nd}	|dkrÐd|d›�}d|d›�}nd|d›�}d|d›�}|	dkrâdnd}|	dkrêdnd}| j  |d›d|d›d|d›d|d›d |d!›d"|d#›d$|› |	d%›d&|› �¡ W q t�y2 } z| j  d'|› d(|› �¡ W Y d}~qd}~ww | j  d¡ dS ))uE   Affiche le dÃ©tail des positions actives (compatible simulation/live)zStatus: 0/5 positions activesNzP================================================================================zPOSITIONS ACTIVES:r   ÚLONGéd   r
   rg   r   r   r   r   r   rh   r   )r   Úcurrent_pricer   r   r   Úpnl_percent_leveragedr$   ú$z,.2fz.5fú+ÚUPÚDOWNz<6rv   z<5z
 | Entry: z<12z -> Current: ú	 | Size: z<8.3fú | Leverage: z>2z	x | PnL: z>6.2fz% zErreur affichage position rw   )rA   rB   ri   r   r   ÚupperÚfloatr   Úabsr   Úintr   r‡   rj   rk   r1   Úget_current_market_priceÚcalculate_position_pnlry   rY   )r   r8   rn   r   r   r   r   r   r‡   Úpnl_percentÚpnl_dataÚ	entry_strÚcurrent_strÚpnl_signÚ	pnl_colorr„   r   r   r   Úlog_detailed_positionsð   s~   





€û
&ÿÿþþþ$€ÿz*SimpleTradingEngine.log_detailed_positionsc                 C   sZ  �z|  d¡}|  d¡}|r|s| j d|› �¡ W dS t|  dd¡| jƒ}| jdv rH| jrH| j ¡ }|rDd|v rDt|d   d	d
¡ƒ}n| j	}n| j	}zd
dl
m}m}m}	 |}
|}|	}W n
   d}
d}d}Y |
r¤|du r‡|| j }| j d|d›d|d›d| j› d�¡ n|}| j d|d›�¡ ||k r£|}| j d|d›�¡ n|| j }| j d|d›d| jd › d|d›d�¡ | jrúz| j ||¡}| j d|› d|d›d|d›d�¡ W n tyù } z| j d|› �¡ |}W Y d}~nd}~ww |}|  dd
¡}|d
k�r| j d |› d!|› �¡ W dS || | }|}|| }d"}||k �rE| j d#|› d$|d›d%|› d&|d'›d(|d)›d�¡ W dS d*| }|d+k�r]|d|  }|d|d,   }n|d|  }|d|d,   }t|› d-|› d-tt ¡ ƒ› �||||||||t ¡  ¡ d.|| jd/�}| jdv �rÄ| j�rÄ|d+k}| jj||||d0|› d-|› �d1�}|  d2¡�sÄ| j d3|› d!|  d4¡› �¡ W dS | j� || j|j< | jd5k�rÛ|  j	|8  _	W d  ƒ n	1 �sæw   Y  | j�rõ| j  |¡ | j d6|› d7|› d8|d9›d:|d)›d;|› d<�¡ |W S  t�y, } z| j d=|› �¡ W Y d}~dS d}~ww )>u0   Ouvre une nouvelle position basÃ©e sur un signalr   r   z)Signal invalide - manque symbol ou side: Nr   r   r]   ÚmarginSummaryÚaccountValuer   )ÚUSE_FIXED_POSITION_SIZEÚFIXED_POSITION_SIZE_USDÚMIN_POSITION_SIZE_USDFg      4@zPosition sizing fixe auto: $ru   z (balance $z / z positions)u"   Position sizing fixe configurÃ©: $u   Position ajustÃ©e au minimum: $zPosition sizing en %: $z (r†   z% de $rr   u   Position ajustÃ©e pour z: $z -> $u    (corrÃ©lation)u)   Erreur calcul pondÃ©ration corrÃ©lation: r‡   zPrix invalide pour rw   g      >@u   ðŸš« REJECT z: Position trop petite $z < $z (Size=z.3fz @ $z.4fg333333Ã?r…   é   Ú_ÚOPEN)Úidr   r   r   r   r‡   r   Ú	stop_lossÚtake_profitÚ	timestampÚstatusÚmargin_usedr.   ÚOPEN_)r   Úis_buyr   r   Ú	order_tagÚsuccessu   Ã‰chec ouverture rz   r#   zOPENED: rv   r�   z.6fz | Entry: $rŽ   ÚxzErreur ouverture position: )!rj   rA   rz   Úminr6   r.   r1   Úget_account_stater�   r0   r3   rž   rŸ   r    r4   rB   rY   r5   r?   Úget_position_weightry   r	   r’   Útimer   ÚnowÚ	isoformatÚplace_market_orderr9   r8   r¤   r>   Úrecord_position_open)r   rp   r   r   r   Úaccount_stateÚavailable_balancerž   rŸ   r    Ú	use_fixedÚ
fixed_sizeÚmin_sizeÚbase_position_valueÚposition_valuer„   r   r   r©   Úfinal_position_valueÚmin_position_valueÚrisk_pctr¥   r¦   Úpositionr«   Úresultr   r   r   Úopen_position;  sÎ   



(€
*(€þ

2

óû€ý0€þz!SimpleTradingEngine.open_positionc              
   C   s(  | j  d¡ | jr’zc| jdkr3|  ¡ }| j  dt|ƒ› d�¡ |D ]}|  |¡r2|  |¡ t 	d¡ q!|  
¡ }|  ¡ }t| dƒrH|  jd7  _nd| _| jd dkrX|  |¡ n| j  d	|› d
| j› d�¡ t 	d¡ W n  tyŒ } z| j  d|› �¡ t 	d¡ W Y d}~nd}~ww | js	dS dS )z3Boucle principale de trading - Ouverture uniquementu%   DÃ©marrage de la boucle de trading...r_   u   ðŸ”� RÃ©cupÃ©rÃ©s z signaux du providerr   Ú_status_counteré   r   zStatus: rq   z positions activesr(   zErreur dans trading_loop: r&   N)rA   rB   r:   r.   r[   ra   r}   rÃ   r²   Úsleeprb   rf   ri   rÄ   r›   r4   ry   rz   )r   Úsignalsrp   Úpositions_countr€   r„   r   r   r   Útrading_loopÇ  s4   



€
€þàz SimpleTradingEngine.trading_loopc                 C   s@   | j sd| _ t| jd�| _d| j_| j ¡  | j d¡ dS dS )u   DÃ©marre le trading engineT)Útargetu   Trading engine dÃ©marrÃ©N)r:   r   rÉ   Útrading_threadÚdaemonÚstartrA   rB   rZ   r   r   r   rÍ   ï  s   
ûzSimpleTradingEngine.startc                 C   s.   d| _ t| dƒr| jjdd� | j d¡ dS )u   ArrÃªte le trading engineFrË   r&   )Útimeoutu   Trading engine arrÃªtÃ©N)r:   ri   rË   rM   rA   rB   rZ   r   r   r   Ústopø  s   
zSimpleTradingEngine.stopc              
   C   s¼   z2|   ¡ }|| j| j| j| j| jdœ}|| j| jd| jdu| jdudœ}| jr0| j ¡ }||d< |W S  t	y] } z| j
 d|› �¡ dt|ƒdœ| jd	dt|ƒd
œW  Y d}~S d}~ww )z/Retourne le statut du trading engine pour l'API)Úactive_positionsr4   r5   Úbalancer.   r:   r"   N)Úmetricsr.   r:   Úengine_typeÚcooldown_enabledÚtrend_detection_enabledÚcooldown_statszErreur get_status_dict: r   )rÐ   rz   F)rÒ   r.   r:   rÓ   rz   )rb   r4   r5   r0   r.   r:   r>   r=   Úget_cooldown_statusry   rA   rz   Ústr)r   rÐ   rÒ   r¨   rÖ   r„   r   r   r   Úget_status_dictÿ  s<   úú

û€þz#SimpleTradingEngine.get_status_dict)r#   r$   N)r   r   r   Ú__doc__r   r;   rX   r[   r’   rb   r   r   rf   ro   Úboolr}   r›   r   r	   rÃ   rÉ   rÍ   rÏ   rÙ   r   r   r   r   r"   )   s"    
)NK (	r"   )rÚ   rD   r²   r   Ú	threadingr   r   Útypingr   r   r   rH   ÚsysrI   Úappendr1   r   r	   r3   Úposition_utilsr   r=   r   r>   r    r?   r!   ÚImportErrorr"   r   r   r   r   Ú<module>   s2    
ü