o
    ‡i°C  ã                	   @   sz  d Z ddlZddlZej ej ej ej e¡¡¡¡ ddlZ	ddl
ZddlmZmZmZ ddlmZmZ ddlZddlZddlZddlmZ ddlmZmZ ejejdd� e e¡ZeG d	d
„ d
ƒƒZeG dd„ dƒƒZ G dd„ dƒZ!edkr»e "d¡ e "d¡ e "d¡ e!dddd�Z#e#j$dddd�Z%e%dur´eddddddd�Z&e# 'e%de&¡Z(e(r´e# )e(¡ e "d ¡ dS dS )!u`   
Martingale Backtester
Backtest la stratÃ©gie martingale avec donnÃ©es rÃ©elles de Binance/Pyth
é    N)ÚListÚDictÚOptional)Ú	dataclassÚasdict)Údatetime)ÚMartingaleStrategyÚMartingaleSignalz%(levelname)s - %(message)s)ÚlevelÚformatc                   @   sŠ   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< eed< eed< eed< eed< eed< dS )ÚMartingaleTradeu    Trade exÃ©cutÃ© dans le backtestÚ
entry_timeÚ	exit_timeÚsideÚentry_priceÚ
exit_priceÚ	stop_lossÚtake_profitÚposition_size_usdÚleverageÚmartingale_levelÚpnl_pctÚpnl_usdÚexit_reasonÚsignal_scoreÚduration_minutesN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__ÚfloatÚint© r$   r$   úQ/var/www/html/HyperOracle/crypto_trader/martingale_degen/martingale_backtester.pyr      s"   
 r   c                   @   s¾   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< ee	 ed< dS )ÚBacktestResultsu   RÃ©sultats du backtestÚsymbolÚ	timeframeÚ
start_dateÚend_dateÚinitial_capitalÚfinal_capitalÚtotal_return_pctÚtotal_tradesÚwinning_tradesÚlosing_tradesÚwin_rateÚavg_win_pctÚavg_loss_pctÚlargest_win_pctÚlargest_loss_pctÚprofit_factorÚmax_drawdown_pctÚmax_consecutive_lossesÚmax_martingale_level_reachedÚtotal_fees_usdÚtradesN)
r   r   r   r   r    r!   r"   r#   r   r   r$   r$   r$   r%   r&   .   s.   
 r&   c                   @   s¾   e Zd ZdZ				d%dedededefd	d
„Z			d&dedededee	j
 fdd„Zdede	j
dededee f
dd„Zde	j
dededefdd„Zdefdd„Zd'ded!efd"d#„Zd$S )(ÚMartingaleBacktesteru%   Backtester pour stratÃ©gie martingaleç     @�@çü©ñÒMb@?é<   r+   Útrading_fee_pctÚslippage_pctÚtimeout_minutesc                 C   sb   || _ || _|| _|| _t d¡ t d|› �¡ t d|d › d�¡ t d|d › d�¡ d S )Nu   âœ… Backtester initialisÃ©z   Capital: $z
   Frais: éd   ú%z   Slippage: )r+   r@   rA   rB   ÚloggerÚinfo)Úselfr+   r@   rA   rB   r$   r$   r%   Ú__init__K   s   
zMartingaleBacktester.__init__ÚBTCUSDTÚ1méè  r'   ÚintervalÚlimitÚreturnc              
   C   sN  z‹t  d|› d|› d|› d�¡ d}|||dœ}tj||dd�}| ¡  | ¡ }tj|g d	¢d
�}tj|d dd�|d< dD ]}	||	  	t
¡||	< q>|g d¢  ¡ }t  dt|ƒ› d�¡ t  d|jd d › d|jd d › �¡ t  d|jd d d›d|jd d d›�¡ |W S  ty¦ }
 zt  d|
› �¡ W Y d}
~
dS d}
~
ww )u  
        RÃ©cupÃ¨re les donnÃ©es depuis Binance API

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

        Returns:
            DataFrame avec OHLCV
        u(   ðŸ“¥ TÃ©lÃ©chargement donnÃ©es Binance: ú ú (z bougies)...z%https://api.binance.com/api/v3/klines©r'   rL   rM   é   )ÚparamsÚtimeout)Ú	timestampÚopenÚhighÚlowÚcloseÚvolumeÚ
close_timeÚquote_volumer;   Útaker_buy_baseÚtaker_buy_quoteÚignore)ÚcolumnsrU   Úms)Úunit)rV   rW   rX   rY   rZ   )rU   rV   rW   rX   rY   rZ   u   âœ… u    bougies rÃ©cupÃ©rÃ©esu      PÃ©riode: r   u    â†’ éÿÿÿÿz
   Prix: $rY   ú.2fu    â†’ $u%   â�Œ Erreur tÃ©lÃ©chargement Binance: N)rE   rF   ÚrequestsÚgetÚraise_for_statusÚjsonÚpdÚ	DataFrameÚto_datetimeÚastyper"   ÚcopyÚlenÚilocÚ	ExceptionÚerror)rG   r'   rL   rM   ÚurlrS   ÚresponseÚklinesÚdfÚcolÚer$   r$   r%   Úfetch_binance_data\   s0   ý*.€þz'MartingaleBacktester.fetch_binance_dataÚsignalru   Ú	start_idxÚcapitalc                 C   sh  |j |krt d|d›d|j d›�¡ dS |j| d }|j}|jdkr,|d| j 9 }n|d| j 9 }|j | j }t|d t	|| j
 d t|ƒƒƒD ]~}|j| }	|	d }
|	d	 }|	d
 }|jdkr�||jkrw|jd| j  }d}|	d } nb|
|jkrŒ|jd| j  }d}|	d } nMn*|
|jkr¢|jd| j  }d}|	d } n7||jkr·|jd| j  }d}|	d } n"|| | j
krÈ|}d}|	d } nqJ|jd d
 }d}|jd d }|jdkrå|| | }n|| | }|j | |j }|j | j }||| 8 }||j  }tt |¡t |¡  ¡ d ƒ}tt|ƒt|ƒ|j|||j|j|j |j|j|d |||j|d�S )u  
        Simule un trade depuis un signal

        Args:
            signal: Signal martingale
            df: DataFrame avec OHLCV
            start_idx: Index de dÃ©part
            capital: Capital disponible

        Returns:
            MartingaleTrade ou None
        õ   âš ï¸�  Capital insuffisant: $rd   ú < $NrU   ÚLONGé   rW   rX   rY   ÚSLÚTPÚTIMEOUTrc   ÚEODr?   rC   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rE   Úwarningro   r   r   rA   r@   ÚrangeÚminrB   rn   r   r   r   r#   ri   rk   Útotal_secondsr   r    r   r   )rG   ry   ru   rz   r{   r   r   Ú	entry_feeÚiÚcurrentrW   rX   rY   r   r   r   r   r   Úexit_feeÚdurationr$   r$   r%   Úsimulate_trade•   sŒ   

&



ü

ü

 ñz#MartingaleBacktester.simulate_tradeÚstrategyc           "      C   s*  t  d¡ t  d|› �¡ t  d¡ | j}g }|g}d}d}d}	d}
d}d}|t|ƒ| j k �r|dkr=|d8 }|d7 }q&|jd|d …  ¡ }| |¡}|sT|d7 }q&|j|krmt  	d|d	›d
|jd	›�¡ t  	d¡ n¬|  
||||¡}|�r| |¡ ||j7 }| |¡ |
|j| j d 7 }
|jdk}| |¡ |r d}n	|d7 }t||ƒ}t|	|jƒ}	t  dt|ƒ› d|j› d|jd	›d|rÄdnd› d|j› d|jd›d|jd›d|j› d|d	›�¡ ||d t |j¡k jd }|d }d}|| jd k �rt  	d|d	›�¡ t  	d¡ nn|d7 }|t|ƒ| j k s0|�s#t  	d¡ dS dd „ |D ƒ}d!d „ |D ƒ}t|ƒt|ƒ }td"d#„ |D ƒƒ}ttd$d#„ |D ƒƒƒ}|�rZt d%d „ |D ƒ¡nd}|�rit d&d „ |D ƒ¡nd}|�rwtd'd „ |D ƒƒnd}|�r…td(d „ |D ƒƒnd}|dk�r�|| ntd)ƒ}t |¡}|  ¡  ¡ }|| | d* }| ¡ }|| j | j d* } t!dBi d+|“d,d-“d.t"|jd d ƒ“d/t"|jd0 d ƒ“d1| j“d2|“d3| “d4t|ƒ“d5t|ƒ“d6t|ƒ“d7|“d8|“d9|“d:|“d;|“d<|“d=|“d>|“d?|	“d@|
“dA|“Ž}!|  #|!¡ |!S )Cuß   
        Execute le backtest

        Args:
            df: DataFrame avec donnÃ©es OHLCV
            symbol: Symbole tradÃ©
            strategy: StratÃ©gie martingale

        Returns:
            BacktestResults
        úQ
================================================================================u   ðŸš€ DÃ‰MARRAGE BACKTEST: úP================================================================================r   é2   r   Nr|   rd   r}   u       GAME OVER - Capital Ã©puisÃ©!é   z
[z] z @ $z | u   âœ…u   â�ŒrO   z | PnL: ú+.2fz% ($z) | Level: z | Capital: $rU   é   gš™™™™™¹?u   âš ï¸�  Capital critique: $u      ARRÃŠT DU BACKTESTu   âš ï¸�  Aucun trade exÃ©cutÃ©c                 S   s   g | ]	}|j d kr|‘qS ©r   ©r   ©Ú.0Útr$   r$   r%   Ú
<listcomp>x  ó    z5MartingaleBacktester.run_backtest.<locals>.<listcomp>c                 S   s   g | ]	}|j d kr|‘qS r•   r–   r—   r$   r$   r%   rš   y  r›   c                 s   ó   � | ]}|j V  qd S ©Nr–   r—   r$   r$   r%   Ú	<genexpr>}  ó   € z4MartingaleBacktester.run_backtest.<locals>.<genexpr>c                 s   rœ   r�   r–   r—   r$   r$   r%   rž   ~  rŸ   c                 S   ó   g | ]}|j ‘qS r$   ©r   r—   r$   r$   r%   rš   €  ó    c                 S   r    r$   r¡   r—   r$   r$   r%   rš   �  r¢   c                 S   r    r$   r¡   r—   r$   r$   r%   rš   ƒ  r¢   c                 S   r    r$   r¡   r—   r$   r$   r%   rš   „  r¢   ÚinfrC   r'   r(   rJ   r)   r*   rc   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r$   )$rE   rF   r+   rn   rB   ro   rm   Úgenerate_signalr   r„   r�   Úappendr   r@   Úupdate_after_tradeÚmaxr   r   r   r   r   ri   rk   r   ÚindexÚsumÚabsÚnpÚmeanr†   r"   ÚSeriesÚ	expandingr&   r    Úprint_results)"rG   ru   r'   rŽ   r{   r;   Úequity_curveÚconsecutive_lossesr8   Úmax_martingale_levelÚ
total_feesr‰   ÚcooldownÚwindowry   ÚtradeÚwonÚexit_idxr/   r0   r1   Ú
total_winsÚtotal_lossesÚavg_winÚavg_lossÚlargest_winÚlargest_lossr6   Úequity_seriesÚrunning_maxÚdrawdownÚmax_drawdownÚtotal_returnÚresultsr$   r$   r%   Úrun_backtest  sþ   











ÿÿþþýüÿ	
ýÀC

ÿþýüûúùø	÷
öõôóòñðïîíìë
z!MartingaleBacktester.run_backtestrÄ   c                 C   sÔ  t  d¡ t  d¡ t  d¡ t  d¡ t  d|jd›�¡ t  d|jd›�¡ t  d|jd	›d
�¡ t  d|jd›�¡ t  d¡ t  d|j› �¡ t  d|j› d|jd d›d�¡ t  d|j	› �¡ t  d¡ t  d|j
d	›d
�¡ t  d|jd	›d
�¡ t  d|jd	›d
�¡ t  d|jd	›d
�¡ t  d|jd›�¡ t  d¡ t  d|jd›d
�¡ t  d|j› �¡ t  d|j› �¡ t  d¡ |jdkrØt  d |jd›d
�¡ nt  d!|jd›d
�¡ t  d"¡ d#S )$u   Affiche les rÃ©sultatsr�   u#   ðŸ“Š RÃ‰SULTATS BACKTEST MARTINGALEr�   u   
ðŸ’° PERFORMANCE:z   Capital initial:      $z,.2fz   Capital final:        $z   Retour total:         r“   rD   z   Frais totaux:         $rd   u   
ðŸ“ˆ TRADES:z   Total:                z   Gagnants:             rP   rC   z.1fz%)z   Perdants:             u
   
ðŸ’µ PNL:z   Gain moyen:           z   Perte moyenne:        z   Plus gros gain:       z   Plus grosse perte:    z   Profit factor:        u   
âš ï¸�  RISQUE:z   Max drawdown:         z   Max pertes consec.:   z   Max martingale level: r   u   âœ… STRATÃ‰GIE PROFITABLE: +u   â�Œ STRATÃ‰GIE PERDANTE: zQ================================================================================
N)rE   rF   r+   r,   r-   r:   r.   r/   r1   r0   r2   r3   r4   r5   r6   r7   r8   r9   )rG   rÄ   r$   r$   r%   r¯   ¬  s6   




"



z"MartingaleBacktester.print_resultsúmartingale_results.jsonÚfilenamec                 C   sV   t |ƒ}t|dƒ�}tj||dd� W d  ƒ n1 sw   Y  t d|› �¡ dS )u!   Sauvegarde les rÃ©sultats en JSONÚwr’   )ÚindentNu   ðŸ’¾ RÃ©sultats sauvegardÃ©s: )r   rV   rh   ÚdumprE   rF   )rG   rÄ   rÇ   ÚoutputÚfr$   r$   r%   Úsave_resultsÒ  s
   ÿz!MartingaleBacktester.save_resultsN)r=   r>   r>   r?   )rI   rJ   rK   )rÆ   )r   r   r   r   r"   r#   rH   r    r   ri   rj   rx   r	   r   r�   r   r&   rÅ   r¯   rÍ   r$   r$   r$   r%   r<   H   sd    ûþýü
ûüþýü
û9þýüû
ú{þýü
û &r<   Ú__main__r�   u'   ðŸŽ² MARTINGALE BACKTESTER - DEGEN MODEr=   r>   r?   )r+   r@   rB   rI   rJ   rK   rQ   g      $@r”   rC   gú~j¼t“h?g      @)Úbase_position_sizer²   Úbase_leverageÚmax_leverageÚstop_loss_pctÚtake_profit_ratiou   
âœ… Backtest terminÃ©!)*r   ÚsysÚosÚpathr¥   ÚdirnameÚabspathÚ__file__Úpandasri   Únumpyr«   Útypingr   r   r   Údataclassesr   r   Úloggingre   rh   r   Úmartingale_strategyr   r	   ÚbasicConfigÚINFOÚ	getLoggerr   rE   r   r&   r<   rF   Ú
backtesterrx   ru   rŽ   rÅ   rÄ   rÍ   r$   r$   r$   r%   Ú<module>   sf   $
   


ýýú

Û