o
    [`ïhî�  ã                   @   s’   d Z ddlZddlZddlmZ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zddlmZ W n ey?   dZY nw G dd„ dƒZdS )	u€   
ProfitTaker Worker - Gestion des fermetures de positions
ResponsabilitÃ© : Fermer les positions selon diffÃ©rentes stratÃ©gies
é    N)ÚdatetimeÚ	timedelta)ÚThreadÚLock)ÚDictÚListÚOptional)ÚCooldownManagerc                   @   s4  e Zd ZdZd8dd„Zdd„ Zdd„ Zd	d
„ Zd9dede	e
 fdd„Zde	e
 fdd„Zde	e
 de
ee
f fdd„Zde
ee
f de	e
 de
ee
f fdd„Zdd„ Zd:dedede
fdd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zded*ed+edefd,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zde
fd6d7„ZdS );ÚProfitTakeru2   Worker spÃ©cialisÃ© dans la fermeture de positionsNc                 C   sZ   || _ d| _trtdd�nd | _i | _tƒ | _d| _d| _|  	¡  |  
¡  | j d¡ d S )NFé   )Údefault_cooldown_minutesé
   zposition_peaks.jsonz#=== PROFIT TAKER WORKER STARTED ===)Úhyperliquid_clientÚrunningr	   Úcooldown_managerÚactive_positionsr   ÚlockÚcheck_intervalÚ
peaks_fileÚsetup_loggerÚ
load_peaksÚloggerÚinfo)Úselfr   © r   úM/var/www/html/HyperOracle/crypto_trader/simple_trading_system/profit_taker.pyÚ__init__   s   zProfitTaker.__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¡}| |¡ | |¡ ddl}|jtj 
|d¡ddd	�|_| jjsg| j |¡ | j |¡ dS dS )
u    Configure le systÃ¨me de loggingr
   Úlogszprofit_taker.logz&%(asctime)s - [%(name)s] - %(message)sr   NÚazutf-8)Úencoding)ÚloggingÚ	getLoggerr   ÚsetLevelÚINFOÚosÚpathÚexistsÚmakedirsÚFileHandlerÚjoinÚStreamHandlerÚ	FormatterÚsetFormatterÚcodecsÚopenÚstreamÚhandlersÚ
addHandler)r   Úlogs_dirÚfile_handlerÚconsole_handlerÚ	formatterr-   r   r   r   r   0   s$   



þzProfitTaker.setup_loggerc              
   C   s²   z;t j | j¡r2t| jdƒ�}t |¡| _W d  ƒ n1 sw   Y  tdt	| jƒ› d�ƒ W dS i | _tdƒ W dS  t
yX } ztd|› �ƒ i | _W Y d}~dS d}~ww )u/   Charge les peaks sauvegardÃ©s depuis le fichierÚrNu   âœ… Peaks restaurÃ©s: u    positions sauvegardÃ©esu3   â„¹ï¸�  Pas de peaks sauvegardÃ©s, dÃ©marrage freshu!   âš ï¸�  Erreur chargement peaks: )r$   r%   r&   r   r.   ÚjsonÚloadÚsaved_peaksÚprintÚlenÚ	Exception)r   ÚfÚer   r   r   r   O   s   ÿ€þzProfitTaker.load_peaksc              
   C   s”  z­i }t   ¡ }|d }tj | j¡r6zt| jdƒ�}t |¡}W d  ƒ n1 s)w   Y  W n   i }Y g }| ¡ D ]\}}| 	dd¡}||k rO| 
|¡ q<|D ]}||= qR| j�( | j ¡ D ]\}}	|	 	dtdƒ¡|	d |	d	 |	d
 |dœ||< qaW d  ƒ n1 s†w   Y  t| jdƒ�}tj||dd� W d  ƒ W dS 1 s¦w   Y  W dS  tyÉ }
 z| j d|
› �¡ W Y d}
~
dS d}
~
ww )zDSauvegarde les peaks actuels dans le fichier (garde l'historique 6h)i`T  r6   NÚ	timestampr   Úpeak_pnl_percentú-infÚsymbolÚsideÚentry_price)r@   rB   rC   rD   r?   Úwé   )ÚindentzErreur sauvegarde peaks: )Útimer$   r%   r&   r   r.   r7   r8   ÚitemsÚgetÚappendr   r   ÚfloatÚdumpr<   r   Úerror)r   Úpeaks_to_saveÚcurrent_timeÚcutoff_timer=   Úkeys_to_removeÚkeyÚdatar?   Úposr>   r   r   r   Ú
save_peaks]   sJ   ÿ€
€ûÿÿ
&ÿ €ÿzProfitTaker.save_peaksé   Úlookback_hoursÚreturnc              
   C   sò   | j s| j d¡ g S zPtt ¡ t|d�  ¡ d ƒ}| j jdd�}|s-| j 	d¡ g W S g }|D ]}t| 
dd¡ƒ}||krD| |¡ q1| j 	dt|ƒ› d	t|ƒ› d
|› d�¡ |W S  tyx } z| j d|› �¡ g W  Y d}~S d}~ww )u'   RÃ©cupÃ¨re les fills depuis Hyperliquidú!Client Hyperliquid non disponible)Úhourséè  )Úlimitu   Aucun fill rÃ©cupÃ©rÃ©rH   r   u   RÃ©cupÃ©rÃ©s ú/z fills depuis Úhu   Erreur rÃ©cupÃ©ration fills: N)r   r   ÚwarningÚintr   Únowr   r?   Úget_fill_infor   rJ   rK   r;   r<   rN   )r   rX   Ú
start_timeÚ	all_fillsÚfiltered_fillsÚfillÚ	fill_timer>   r   r   r   Úget_fills_from_hyperliquid†   s,   
€(€þz&ProfitTaker.get_fills_from_hyperliquidc              
   C   s„   | j sg S z| j  ¡ }|r| j dt|ƒ› d�¡ |W S | j d¡ g W S  tyA } z| j d|› �¡ g W  Y d}~S d}~ww )u5   RÃ©cupÃ¨re les positions actuelles depuis Hyperliquidu   RÃ©cupÃ©rÃ©es z% positions actives depuis Hyperliquidz&Aucune position active sur Hyperliquidu!   Erreur rÃ©cupÃ©ration positions: N)r   Úget_positionsr   r   r;   r<   rN   )r   Ú	positionsr>   r   r   r   Ú&get_current_positions_from_hyperliquid§   s   
€þz2ProfitTaker.get_current_positions_from_hyperliquidÚfillsc                 C   sÌ  i }|D ]¨}z‹|  dd¡ dd¡}|  d¡dks|  d¡dkr!dnd}|  dd¡}d	|v }tt|  d
d¡ƒƒ}t|  dd¡ƒ}	t|  dd¡ƒ}
|› d|› �}||vr_||g g dddddœ||< |ry|| d  ||	|
dœ¡ || d  |7  < n|| d  ||	|
dœ¡ || d  |7  < W q ty¬ } z| j d|› �¡ W Y d}~qd}~ww | 	¡ D ]2\}}|d }|rãt
dd„ |D ƒƒ}t
dd„ |D ƒƒ}|dkrÕ|| nd|d< |d |d  |d< q±|S )u*   Reconstitue les trades Ã  partir des fillsÚcoinÚ ú-PERPÚdirz	Open LongzClose ShortÚLONGÚSHORTÚOpenÚszr   ÚpxrH   Ú_)rB   rC   ÚopensÚclosesÚtotal_openedÚtotal_closedÚavg_open_priceÚcurrent_sizerx   )ÚsizeÚpricerH   rz   ry   r{   zErreur traitement fill: Nc                 s   s    � | ]}|d  |d  V  qdS )r~   r   Nr   ©Ú.0Úor   r   r   Ú	<genexpr>ð   s   € z<ProfitTaker.reconstruct_trades_from_fills.<locals>.<genexpr>c                 s   s   � | ]}|d  V  qdS )r~   Nr   r€   r   r   r   rƒ   ñ   s   € r|   r}   )rJ   ÚreplaceÚabsrL   ra   rK   r<   r   rN   rI   Úsum)r   rm   Útradesrg   rB   rC   Ú	directionÚ
is_openingr~   r   r?   Ú	trade_keyr>   Ú
trade_datarx   Útotal_valueÚ
total_sizer   r   r   Úreconstruct_trades_from_fillsº   sb   $
øýý€€þ€z)ProfitTaker.reconstruct_trades_from_fillsÚreconstructed_tradesÚcurrent_positionsc                 C   s¬  i }|D �]Î}d|v r@|  di ¡}|  dd¡ dd¡}t|  dd¡ƒ}|dkr)dnd}t|ƒ}	t|  d	d¡ƒ}
t|  d
d¡ƒ}n,|  dd¡ dd¡}|  dd¡ ¡ }tt|  dd¡ƒƒ}	t|  dd¡ƒ}
t|  dd¡ƒ}|	dkrqq|› d|› �}|  |g g |	ddœ¡}d}z| jr™| j |¡}|s™t|  dd¡ƒ}W n   t|  dd¡ƒ}Y d|v r¶|  di ¡  di ¡}n|  di ¡}t|tƒrÇ|  dd¡nd}d}|
dkrû|dkrÖd}n|dkrÝd}n	|dkräd}nd}|dkró|
d|d   }n|
d|d   }|||
|	||t	|ƒ||  dg ¡|  d g ¡d!|v �r|  d!¡n|  di ¡  d"¡t
 ¡  ¡ |td#ƒd$œ}|d dk�r]|d% dk�r]| jj|d |d% |d& |d |d d'�}|d( |d)< |d* |d*< nd|d)< d|d*< |d) }| j  |¡}|�r{|  d&d¡dk�rÀ| j  |i ¡}|  d+td#ƒ¡}|  dd¡}|dk�r±t||d  ƒd,k �r±|}| j d-|› d.|d/›d0�¡ ntd#ƒ}| j d1|› d2�¡ n|  d+td#ƒ¡}t||ƒ|d+< |||< q|S )3uÏ   
        NOUVELLE LOGIQUE: Partir directement des positions Hyperliquid pour Ã©viter les dÃ©calages
        Les fills servent uniquement pour l'historique, pas pour dÃ©terminer les positions actives
        Úpositionrn   ro   rp   Úszir   rr   rs   ÚentryPxÚunrealizedPnlrB   rC   r~   rD   Úunrealized_pnlg�íµ ÷Æ°>rw   )rx   ry   rz   r{   ÚleverageÚvalueé   Nr   gš™™™™™Ù?é   g333333ã?é   g      ð?g      ø?éd   rx   ry   Úliquidation_pxÚliquidationPxrA   )rB   rC   rD   r}   Úcurrent_pricer•   r–   Útarget_priceÚopens_historyÚcloses_historyÚliquidation_priceÚlast_updatedÚraw_hyperliquid_datar@   rž   r}   )rD   rž   r~   rC   r–   Úpnl_percent_leveragedÚpnl_percentÚ
pnl_dollarr@   g{®Gáz„?ú	Position u%    - Peak restaurÃ© depuis sauvegarde: ú.2fú%u"   Nouvelle position dÃ©tectÃ©e pour u    - Peak rÃ©initialisÃ©)rJ   r„   rL   r…   Úupperr   Úget_current_market_priceÚ
isinstanceÚdictra   r   rb   Ú	isoformatÚcalculate_position_pnlr   r9   r   r   Úmax)r   r�   r�   r   rU   Úposition_inforB   r’   rC   r~   rD   r•   rS   r‹   Úcurrent_market_priceÚleverage_datar–   rŸ   Úbase_tp_percentÚposition_dataÚpnl_dataÚcurrent_pnlÚexisting_positionÚsaved_peak_dataÚ
saved_peakÚsaved_entryÚprevious_peakr   r   r   Úsync_with_current_positions÷   s¶   
ü€

$
òû 
z'ProfitTaker.sync_with_current_positionsc                 C   s>  �z | j dd�}|  ¡ }|  |¡}| j dt|ƒ› d�¡ |  ||¡}| j� || _W d  ƒ n1 s4w   Y  | j dt|ƒ› �¡ |rù| j d¡ | j d¡ | j d¡ | 	¡ D ]“\}}|d	 }|d
 }|d }	|d }
|d }|d }|d }|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}|t
dƒkr¶d}n|dkr¼dnd}|› |d›d�}| j |d›d|d ›d!|d"›d#|d"›d$|d%›d&|d'›d(|› |d›d)|› d|› �¡ q\| j d¡ W dS | j d*¡ W dS  t�y } z| j d+|› �¡ W Y d}~dS d}~ww ),u)   Met Ã  jour le repo des positions activeséH   )rX   zReconstruits z trades depuis les fillsNu!   Positions actives mises Ã  jour: zP================================================================================zPOSITIONS ACTIVES:rB   rC   rD   rž   r}   r¦   r@   r–   r\   ú$z,.2fz.5fr   ú+ro   ÚUPÚDOWNrA   z  N/A  z>6.2frª   z<6ú z<5z
 | Entry: z<12z -> Current: z	 | Size: z<8.3fz | Leverage: z>2z	x | PnL: z
% | Peak: u!   Aucune position active dÃ©tectÃ©eu   Erreur mise Ã  jour positions: )ri   rl   rŽ   r   r   r;   r¾   r   r   rI   rL   r<   rN   )r   rm   r�   r�   r   rS   rU   rB   rC   ÚentryÚcurrentr~   Úpnl_pctÚpeak_pnlr–   Ú	entry_strÚcurrent_strÚpnl_signÚ	pnl_colorÚpeak_displayÚ	peak_signr>   r   r   r   Úupdate_active_positions„  sj   
ÿ&ÿÿþþþ
þ €ÿz#ProfitTaker.update_active_positionsÚ	STOP_LOSSrB   Úreasonc              
   C   s  zç| j s
dddœW S | j  ¡ }d}|D ]}| dd¡ dd¡}||kr1t| dd	¡ƒd	kr1|} nq|s>dd
|› d�dœW S | dd¡ ¡ }|dk}tt| dd	¡ƒƒ}	| j d|› d|› d|	› d|› �¡ | j j	|||	dd|› d|› �d�}
|
 d¡rÏ| j d
|› d|› �¡ | j
r’| j
 ||¡ | j�$ t| j ¡ ƒD ]}| j| d |kr±|| jv r±| j|= q�W d  ƒ n1 s¼w   Y  |  ¡  dd
|› d�dœW S | j d|› d|
 d¡› �¡ d|
 dd¡dœW S  t�y } zd|› d|› �}| j |¡ d|dœW  Y d}~S d}~ww )z8Ferme une position par symbole via le client HyperliquidFrZ   )ÚsuccessrN   NrB   ro   rp   r~   r   r¨   u    non trouvÃ©erC   rs   zFermeture position rÄ   z: Size=z	, Reason=TÚCLOSE_rw   )rB   Úis_buyr~   Úreduce_onlyÚ	order_tagrÒ   u    fermÃ©e avec succÃ¨s: u    fermÃ©e)rÒ   Úmessageu   Ã‰chec fermeture ú: rN   zErreur inconnuezErreur fermeture position )r   rj   rJ   r„   rL   r«   r…   r   r   Úplace_market_orderr   Úrecord_position_closer   Úlistr   Úkeysr9   rV   rN   r<   )r   rB   rÑ   Úhl_positionsÚtarget_positionrU   Ú
pos_symbolÚposition_siderÔ   r~   ÚresultrS   r>   Ú	error_msgr   r   r   Úclose_position_by_symbolÈ  s\   
€$û

€ýÿ€ýz$ProfitTaker.close_position_by_symbolc                 C   s   dS )uK   ANCIENNE VERSION -12% - REMPLACÃ‰E PAR VERSION ADAPTATIVE - NE PAS UTILISERNr   ©r   r   r   r   Ú&check_stop_loss_conditions_old_version  s   z2ProfitTaker.check_stop_loss_conditions_old_versionc                 C   s(  | j �; g }| j ¡ D ]+\}}|d }|d }| dd¡}| d¡}|d }|r6| j d|› d|d	›d
�¡ qW d  ƒ n1 sAw   Y  |D ]I\}}	z'|  ||	¡}
|
 d¡rc| j d|› d�¡ n| j d|› d|
 d¡› �¡ W qH t	y‘ } z| j d|› d|› �¡ W Y d}~qHd}~ww dS )u<   VÃ©rifie si les positions ont atteint leur target price (TP)rB   rC   rž   r   rŸ   r¦   zTARGET PRICE DISABLED: u+    gÃ©rÃ© uniquement par trailing stop (PnL: r©   ú%)NrÒ   zTARGET PRICE EXECUTED: u    fermÃ©e avec succÃ¨s sur TPzTARGET PRICE FAILED: ú - rN   zErreur target price rØ   )
r   r   rI   rJ   r   Údebugrã   ÚcriticalrN   r<   )r   Úpositions_to_closerS   r‘   rB   rC   rž   rŸ   r¸   rÑ   rá   r>   r   r   r   Úcheck_target_price_conditions  s2   
€öý
€$€ÿùz)ProfitTaker.check_target_price_conditionsc                 C   sb  d}| j �N g }| j ¡ D ]>\}}|d }|d }| dd¡}|| }|dkrK||k rK| j d|› d|d›d	|› d
|d›d|d›d�¡ | ||f¡ qW d  ƒ n1 sVw   Y  |D ]Q\}}	z/|  |d|	d›�¡}
|
 d¡r€| j d|› d|	d›d�¡ n| j 	d|› d|
 d¡› �¡ W q] t
y® } z| j 	d|› d|› �¡ W Y d}~q]d}~ww dS )u,   VÃ©rifie et ferme les positions trop petitesç      $@rB   r}   rž   r   zSMALL POSITION DETECTED: z Value=$r©   z < $z (Size=z.3fz @ $z.4fú)NzSMALL_POSITION_$ú.1frÒ   zSMALL POSITION CLOSED: u    fermÃ©e avec succÃ¨s (Value=$zSMALL POSITION CLOSE FAILED: rç   rN   z!Erreur fermeture petite position rØ   )r   r   rI   rJ   r   r`   rK   rã   ré   rN   r<   )r   ÚMIN_POSITION_VALUE_USDrê   rS   r‘   rB   r}   rž   Úposition_value_usdr—   rá   r>   r   r   r   Úcheck_small_position_conditions'  s4   2€õý
€$€ÿùz+ProfitTaker.check_small_position_conditionsc                 C   sÂ  | j �w g }| j ¡ D ]g\}}|d }|d }|d }| dd¡}d}|dkr*d}	n|d	kr1d
}	n	|dkr8d}	nd}	|tdƒkrr||krr|||	 krr|| }
| j d|› d|› d|d›d|d›d|
d›d|	d›d�¡ | ||f¡ qW d  ƒ n1 s}w   Y  |D ]Z\}}z8|  |d|› d�¡}| d¡r°| j 	d|› d|› d�¡ | j
r¯| j
 |d¡ n| j d|› d | d!¡› �¡ W q„ tyÞ } z| j d"|› d#|› �¡ W Y d}~q„d}~ww dS )$uD   VÃ©rifie les conditions de trailing stop adaptatif selon le leverager¦   r@   rB   r–   r˜   g       @g      4@g      @rì   g      @g      @g      @rA   u   ðŸ”» TRAILING STOP: z Lzx | PnL=r©   z	% | Peak=z
% | Recul=z% > z.0frª   NÚTRAILING_STOP_LEVÚxrÒ   zTRAILING STOP EXECUTED: u     fermÃ©e avec succÃ¨s (Leverage zx)ÚTRAILING_STOPzTRAILING STOP FAILED: rç   rN   zErreur trailing stop rØ   )r   r   rI   rJ   rL   r   r`   rK   rã   ré   r   rÚ   rN   r<   )r   rê   rS   r‘   r¸   rÈ   rB   r–   Úmin_profit_activationÚtrailing_distanceÚdrawdownrá   r>   r   r   r   Úcheck_trailing_stop_conditionsG  sN   :€áý%
€€$€ÿöz*ProfitTaker.check_trailing_stop_conditionsc                 C   s„  | j �I g }| j ¡ D ]9\}}|d }|d }|d }| dd¡}|  |||¡}|rD| j d|› d|› d|d	›d
�¡ | ||||f¡ qW d  ƒ n1 sOw   Y  |D ]i\}}}}zEd|› d|› d|d›d
�}	|  ||	¡}
|
 d¡r‘| j 	d|› d|› d|d	›d�¡ | j
r�| j
 |d¡ n| j d|› d|
 d¡› �¡ W qV ty¿ } z| j d|› d|› �¡ W Y d}~qVd}~ww dS )uR   DÃ©tecte les vÃ©ritables inversions de tendance basÃ©es sur des signaux contrairesrB   rC   r¦   r–   r˜   zREAL TREND REVERSAL DETECTED: rÄ   z) | Strong opposite signal detected | PnL=r©   rª   NÚREAL_TREND_REVERSAL_Ú_LÚx_rî   rÒ   zREAL TREND REVERSAL CLOSE: õ    fermÃ©e complÃ¨tement (PnL=ræ   ÚTREND_REVERSALz"REAL TREND REVERSAL CLOSE FAILED: rç   rN   z!Erreur fermeture vraie inversion rØ   )r   r   rI   rJ   Ú_detect_real_trend_reversalr   r`   rK   rã   ré   r   rÚ   rN   r<   )r   rê   rS   r‘   rB   rC   Úpnlr–   Úreversal_detectedrÑ   rá   r>   r   r   r   Úcheck_trend_reversal_conditions{  s<   "€õý
"€€$€ÿõz+ProfitTaker.check_trend_reversal_conditionsÚcurrent_siderÿ   c                 C   sF  zƒddl m} |ƒ }| ¡ }d}|D ]}| d¡|kr|} nq|s%W dS | dd¡}	| dd¡}
|d	kr9|	d
kp@|d
ko@|	d	k}|r�|
dkr^| j d|› d|› d|	› d|
d›d�	¡ W dS |
dkr�|dkr�| j d|› d|› d|	› d|
d›d|d›d�¡ W dS W dS  ty¢ } z| j d|› d|› �¡ W Y d}~dS d}~ww )u›   
        DÃ©tecte un vrai retournement de tendance basÃ© sur des signaux contraires
        Returns True si un signal contraire fort est dÃ©tectÃ©
        r   )ÚPragmaticSignalGeneratorNrB   FrC   ro   Ú
confidencerr   rs   g      T@zStrong opposite signal: rÄ   z -> z signal at rî   z% confidenceTg      N@g      Àz$Moderate opposite signal with loss: z% confidence, PnL=r©   rª   u"   Erreur dÃ©tection vraie inversion rØ   )Ú'simple_trading_system.pragmatic_signalsr  Úgenerate_signalsrJ   r   r   r<   rN   )r   rB   r  rÿ   r  Ú
signal_genÚall_signalsÚsignalÚsigÚsignal_sideÚsignal_confidenceÚis_opposite_signalr>   r   r   r   rþ   œ  s<   þÿ(0€þz'ProfitTaker._detect_real_trend_reversalc                 C   s´  | j �a g }| j ¡ D ]Q\}}|d }|d }|d }| dd¡}|dkr(d}n|dkr/d	}n	|d
kr6d}nd}||kr\| j d|› d|› d|d›d|› d|› d�¡ | ||||f¡ qW d  ƒ n1 sgw   Y  |D ]i\}}}}zEd|› d|› d|d›d�}	|  ||	¡}
|
 d¡r©| j d|› d|› d|d›d�¡ | j	r¨| j	 
|d¡ n| j d|› d|
 d ¡› �¡ W qn ty× } z| j d!|› d"|› �¡ W Y d}~qnd}~ww dS )#uA   SystÃ¨me de stop-loss sÃ©parÃ© du trend reversal - moins agressifrB   rC   r¦   r–   r˜   é   g      Àr™   g       Àrš   g      (Àg      .ÀzSTOP LOSS TRIGGERED: rÄ   z | PnL=r©   z% | Leverage=zx | Threshold=rª   NÚ
STOP_LOSS_rú   rû   rî   rÒ   zSTOP LOSS CLOSE: rü   ræ   rÐ   zSTOP LOSS CLOSE FAILED: rç   rN   zErreur fermeture stop-loss rØ   )r   r   rI   rJ   r   r`   rK   rã   ré   r   rÚ   rN   r<   )r   rê   rS   r‘   rB   rC   rÿ   r–   Ústop_loss_thresholdrÑ   rá   r>   r   r   r   Úcheck_stop_loss_conditionsË  sH   .€ìý
"€€$€ÿõz&ProfitTaker.check_stop_loss_conditionsc              
   C   sÞ   | j  d¡ | jrmz>|  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  t	| dƒs.d| _
t ¡ | j
 dkr@|  ¡  t ¡ | _
t | j¡ W n  tyg } z| j  d|› �¡ t d¡ W Y d}~nd}~ww | js	dS dS )z Boucle principale du ProfitTakeru&   DÃ©marrage de la boucle ProfitTaker...Ú_last_peak_saver   é   zErreur dans profit_taker_loop: r™   N)r   r   r   rÏ   r  rë   r  rñ   rø   Úhasattrr  rH   rV   Úsleepr   r<   rN   )r   r>   r   r   r   Úprofit_taker_loopõ  s,   

€þßzProfitTaker.profit_taker_loopc                 C   s@   | j sd| _ t| jd�| _d| j_| j ¡  | j d¡ dS dS )u   DÃ©marre le ProfitTakerT)Útargetu   ProfitTaker dÃ©marrÃ©N)r   r   r  Úworker_threadÚdaemonÚstartr   r   rä   r   r   r   r    s   
ûzProfitTaker.startc                 C   s.   d| _ t| dƒr| jjdd� | j d¡ dS )u   ArrÃªte le ProfitTakerFr  r™   )Útimeoutu   ProfitTaker arrÃªtÃ©N)r   r  r  r)   r   r   rä   r   r   r   Ústop'  s   
zProfitTaker.stopc                 C   sJ   | j � t| jƒdd„ | j ¡ D ƒdœW  d  ƒ S 1 sw   Y  dS )u*   Retourne un rÃ©sumÃ© des positions activesc                 S   s0   i | ]\}}||d  |d |d |d dœ“qS )rB   rC   r¦   r}   )rB   rC   r¦   r}   r   )r�   rS   rU   r   r   r   Ú
<dictcomp>3  s    û
üz5ProfitTaker.get_positions_summary.<locals>.<dictcomp>)Útotal_positionsrk   N)r   r;   r   rI   rä   r   r   r   Úget_positions_summary.  s   ûþ$ÿz!ProfitTaker.get_positions_summary)N)rW   )rÐ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   rV   ra   r   r   ri   rl   ÚstrrŽ   r¾   rÏ   rã   rå   rë   rñ   rø   r  rL   Úboolrþ   r  r  r  r  r  r   r   r   r   r
      s0    
)!*= D= 4!/*)	r
   )r#  r    rH   r   r   Ú	threadingr   r   Útypingr   r   r   r$   r7   r   r	   ÚImportErrorr
   r   r   r   r   Ú<module>   s    ÿ