
    i34                     J   U d Z ddlZddlZddlmZ ddlmZmZmZ ddlZ ej                  d      Z
 G d d      Zdaee   ed<   defd	Zed
k(  rS e       Z
e
j!                  dddddddddddddddd	       e
j#                  ddddddddddddddd         ed!       yy)"u-  
TRADE LOGGER - Système de logs structurés pour analyse de performance
=====================================================================
Capture tous les événements de trading avec leurs métriques pour 
permettre l'analyse et l'optimisation des paramètres dynamiques.

Créé le: 03/01/2026
    N)datetime)DictAnyOptionalTradeLoggerc                      e Zd ZdZddefdZdeeef   ddfdZdeeef   ddfd	Z	d
eeef   ddfdZ
deeef   ddfdZdeeef   ddfdZdedeeef   ddfdZddedefdZddedefdZdededefdZdeeef   fdZy)r   u@   Enregistre tous les trades et signaux avec métriques complèteslog_dirc                 h   || _         t        j                  |d       t        j                  j	                  |d      | _        t        j                  j	                  |d      | _        t        j                  j	                  |d      | _        t        j                  j	                  |d      | _        y )NT)exist_okzsignals_log.jsonlztrades_log.jsonlzperformance_log.jsonlzdaily_summary.json)	r	   osmakedirspathjoinsignals_filetrades_fileperformance_filedaily_summary_file)selfr	   s     ./trade_logger.py__init__zTradeLogger.__init__   sy    
Gd+ GGLL2EF77<<1CD "W6M N"$'',,w8L"M    signal_datareturnNc                 :   |j                  dt        j                               j                         dd|}| j	                  | j
                  |       t        j                  d      j                  d|j                  d       d|j                  d              y	)
u|  
        Log un signal d'achat détecté par l'IA
        
        Args:
            signal_data: {
                'timestamp': datetime,
                'symbol': str,
                'signal_type': 'BUY'|'SELL',
                'ai_score': float,
                'pattern': str,
                'smart_signal': str,
                'smart_eligible': bool,
                'features': {
                    'rsi': float,
                    'ema_9': float,
                    'ema_21': float,
                    'ema_diff': float,
                    'momentum_3': float,
                    'momentum_5': float,
                    'momentum_10': float,
                    'bb_position': float,
                    'volatility_score': float
                },
                'dynamic_sltp': {
                    'sl_pct': float,
                    'tp_pct': float,
                    'rr_ratio': float,
                    'base_sl': float,
                    'base_tp': float,
                    'volatility_adjustment': float,
                    'confidence_adjustment': float
                },
                'market_conditions': {
                    'regime': str,
                    'btc_trend': str,
                    'volatility_index': float
                },
                'executed': bool,
                'execution_reason': str (si executed=False)
            }
        	timestampSIGNALr   typer   u   📝 Signal logged: symbolz	 - Score=ai_scoreN)	getr   now	isoformat_append_to_jsonlr   logging	getLoggerdebug)r   r   	log_entrys      r   
log_signalzTradeLogger.log_signal   s    V %hllnEOOQ
 
	 	d//;-(..1EkooV^F_E``ijujyjy  {E  kF  jG  0H  	Ir   
trade_datac                    |j                  dt        j                               j                         d|d    dt	        t        j                         j                                d|}| j                  | j                  |       t        j                  d      j                  d|d    d|d	   d
d|d   dd|d   dd	       y)a  
        Log l'ouverture d'une position
        
        Args:
            trade_data: {
                'timestamp': datetime,
                'symbol': str,
                'side': 'BUY',
                'entry_price': float,
                'quantity': float,
                'order_size_usd': float,
                'stop_loss': float,
                'take_profit': float,
                'sl_pct': float,
                'tp_pct': float,
                'rr_ratio': float,
                'is_dynamic_sltp': bool,
                'ai_score': float,
                'pattern': str,
                'reason': str,
                'features': dict,
                'market_conditions': dict
            }
        r   
TRADE_OPENr   _r   r   trade_idr   u   💰 Trade ouvert: z @ entry_pricez.6fz	 (SL/TP: sl_pct.2fz%/tp_pctz%)Nr!   r   r"   r#   intr   r$   r   r%   r&   info)r   r*   r(   s      r   log_trade_openzTradeLogger.log_trade_openR   s   4 $X\\^DNNP %h/0#hlln6N6N6P2Q1RS
 	
	 	d..	:-(--0CJxDXCYY\]ghu]vwz\{  |E  FP  QY  FZ  [^  E_  _a  bl  mu  bv  wz  a{  {}  /~  	r   
close_datac                    |j                  dt        j                               j                         d|d    d|j                  dt	        t        j                         j                                      d|}| j                  | j                  |       |j                  dd      dkD  rd	nd
}t        j                  d      j                  | d|d    d|j                  dd      dd|j                  dd       d       y)af  
        Log la fermeture d'une position
        
        Args:
            close_data: {
                'timestamp': datetime,
                'symbol': str,
                'side': 'SELL',
                'entry_price': float,
                'exit_price': float,
                'quantity': float,
                'duration_minutes': float,
                'pnl_pct': float,
                'pnl_usd': float,
                'exit_reason': 'TP_HIT'|'SL_HIT'|'MANUAL'|'ROTATION'|'TECHNICAL_EXIT',
                'was_dynamic_sltp': bool,
                'original_sl_pct': float,
                'original_tp_pct': float,
                'max_price': float,
                'max_profit_pct': float,
                'min_price': float,
                'max_drawdown_pct': float,
                'pattern': str,
                'ai_score': float
            }
        r   TRADE_CLOSEr   r-   open_timestampr.   pnl_pctr   u   ✅u   ❌r   u    Trade fermé: z - P&L: r2   z% (exit_reasonUNKNOWN)Nr4   )r   r8   r(   emojis       r   log_trade_closezTradeLogger.log_trade_closeu   s=   8 $X\\^DNNP!%h/0*..AQSVW_WcWcWeWoWoWqSr2s1tu
 	
	 	d..	: $	159u-(--zRZG[F\\deoesest}  @A  fB  CF  eG  GJ  KU  KY  KY  Zg  ir  Ks  Jt  tu  /v  	wr   metricsc           	      D   |j                  dt        j                               j                         dd|}| j	                  | j
                  |       t        j                  d      j                  d|j                  dd      dd	|j                  d
d      dd       y)u  
        Log les métriques de performance globales (toutes les heures)
        
        Args:
            metrics: {
                'timestamp': datetime,
                'total_trades': int,
                'winning_trades': int,
                'losing_trades': int,
                'win_rate': float,
                'avg_profit_pct': float,
                'avg_loss_pct': float,
                'profit_factor': float,
                'total_pnl_pct': float,
                'total_pnl_usd': float,
                'sharpe_ratio': float,
                'max_drawdown_pct': float,
                'avg_trade_duration_min': float,
                'dynamic_sltp_performance': {
                    'trades_count': int,
                    'win_rate': float,
                    'avg_profit': float,
                    'avg_rr_achieved': float
                },
                'fixed_sltp_performance': {
                    'trades_count': int,
                    'win_rate': float,
                    'avg_profit': float
                },
                'best_patterns': list,
                'worst_patterns': list,
                'best_cryptos': list,
                'worst_cryptos': list
            }
        r   PERFORMANCE_SNAPSHOTr   r   u$   📊 Performance snapshot: Win rate=win_rater   z.1fz% | Total P&L=total_pnl_pctr2   %N)	r!   r   r"   r#   r$   r   r%   r&   r6   )r   rB   r(   s      r   log_performance_metricsz#TradeLogger.log_performance_metrics   s    J ![(,,.AKKM*
 
	 	d33Y?-(--0TU\U`U`akmnUopsTt  uC  DK  DO  DO  P_  ab  Dc  dg  Ch  hi  /j  	kr   summaryc           	      2   t        | j                  dd      5 }t        j                  ||ddt               ddd       t        j                  d      j                  d	|j                  d
d       d|j                  dd      dd       y# 1 sw Y   VxY w)u  
        Met à jour le résumé quotidien (remplace le fichier)
        
        Args:
            summary: {
                'date': str,
                'total_signals': int,
                'signals_executed': int,
                'execution_rate': float,
                'trades_opened': int,
                'trades_closed': int,
                'win_rate': float,
                'total_pnl_pct': float,
                'best_trade': dict,
                'worst_trade': dict,
                'avg_sl_pct': float,
                'avg_tp_pct': float,
                'avg_rr_ratio': float,
                'dynamic_sltp_usage': float (%)
            }
        wutf-8encoding   F)indentensure_asciidefaultNr   u   📅 Daily summary updated: trades_closedr   z trades | P&L: rF   r2   rG   )	openr   jsondumpstrr%   r&   r6   r!   )r   rI   fs      r   update_daily_summaryz TradeLogger.update_daily_summary   s    , $))3A 	MQIIgqL	M 	-(--0LW[[YhjkMlLmm|  ~E  ~I  ~I  JY  [\  ~]  ^a  }b  bc  /d  	e	M 	Ms   BBfilepathdatac                 (   	 t        |dd      5 }t        j                  ||dt               |j	                  d       ddd       y# 1 sw Y   yxY w# t
        $ r4}t        j                  d      j                  d	| d
|        Y d}~yd}~ww xY w)z/Ajoute une ligne JSON au fichier (JSONL format)arL   rM   F)rQ   rR   
Nr   u   ❌ Erreur écriture log : )	rT   rU   rV   rW   write	Exceptionr%   r&   error)r   rZ   r[   rX   es        r   r$   zTradeLogger._append_to_jsonl   s    	`hg6 !		$sC    	`m,225NxjXZ[\Z]3^__	`s3   A /AA AA A 	B*BBlimitc                 :    | j                  | j                  |      S )u!   Récupère les N derniers signaux)_read_jsonl_tailr   r   rd   s     r   get_recent_signalszTradeLogger.get_recent_signals   s    $$T%6%6>>r   c                 :    | j                  | j                  |      S )u    Récupère les N derniers trades)rf   r   rg   s     r   get_recent_tradeszTradeLogger.get_recent_trades   s    $$T%5%5u==r   c                    t         j                  j                  |      sg S 	 t        |dd      5 }|j	                         }ddd       g }| d D ]5  }	 |j                  t        j                  |j                                      7 |S # 1 sw Y   KxY w#  Y JxY w# t        $ r6}t        j                  d      j                  d| d|        g cY d}~S d}~ww xY w)u.   Lit les N dernières lignes d'un fichier JSONLrrL   rM   Nr   u   ❌ Erreur lecture r_   )r   r   existsrT   	readlinesappendrU   loadsstripra   r%   r&   rb   )r   rZ   rd   rX   linesresultlinerc   s           r   rf   zTradeLogger._read_jsonl_tail   s    ww~~h'I	hg6 &!& Fufg MM$**TZZ\":; M& &  	m,225H
RTUVTW3XYI	sL   B BB 2BB BB BB 	C(+CCCc                    | j                  d      }|D cg c]+  }|j                  d      dk(  s|j                  d      s*|- }}|D cg c]+  }|j                  d      dk(  s|j                  d      r*|- }}d } ||      } ||      }d}|d   dk7  r|d   |d   z
  t        |d         z  dz  }|||d	S c c}w c c}w )
a\  
        Analyse la performance des SL/TP dynamiques vs fixes
        
        Returns:
            {
                'dynamic': {'trades': int, 'win_rate': float, 'avg_profit': float, 'avg_rr': float},
                'fixed': {'trades': int, 'win_rate': float, 'avg_profit': float},
                'improvement': float (%)
            }
        i  r   r:   was_dynamic_sltpc                 H   | sdddddS | D cg c]  }|j                  dd      dkD  s| }}| D cg c]  }|d   	 }}t        |       t        |      t        |       z  dz  t        |      t        |      z  t        d | D              t        |       z  dS c c}w c c}w )Nr   )tradesrE   
avg_profitavg_rrr<   d   c              3   f   K   | ])  }|j                  d d      |j                  dd      z   + yw)original_tp_pctr   original_sl_pct   N)r!   ).0ts     r   	<genexpr>zKTradeLogger.analyze_sltp_performance.<locals>.calc_stats.<locals>.<genexpr>&  s/     l\]aee$5q9AEEBSUV<WWls   /1)r!   lensum)
trade_listr   winningprofitss       r   
calc_statsz8TradeLogger.analyze_sltp_performance.<locals>.calc_stats  s    "#!qQQ",HQi0Ca0GqHGH-78q|8G8 j/L3z?:S@!'lS\9lakllors}o~~	  I8s   BBBr   ry   r{   )dynamicfixedimprovement_pct)rj   r!   abs)	r   rx   r   dynamic_tradesfixed_tradesr   dynamic_statsfixed_statsimprovements	            r   analyze_sltp_performancez$TradeLogger.analyze_sltp_performance  s     ''-%+lquuV}/MRSRWRWXjRk!ll#)naQUU6]m-KTUTYTYZlTmnn	 #>2 .|$)),7+l:SSWZ[fgs[tWuuy||K % *
 	
1 mns"   B>B>B>C&C8C)
trade_logs)r{   )__name__
__module____qualname____doc__rW   r   r   r   r)   r7   rA   rH   rY   r$   r5   listrh   rj   rf   r    r   r   r   r      s'   JN N1Id38n 1I 1If!c3h !D !F&w$sCx. &wT &wP+ktCH~ +k$ +kZeDcN et e6` `DcN `t `? ?d ?>s >T > S T *)
$sCx. )
r   _trade_loggerr   c                  .    t         
t               a t         S )z+Retourne l'instance globale du trade logger)r   r   r   r   r   get_trade_loggerr   :  s     #r   __main__BTCUSDTBUYU   SQUEEZE_BREAKOUTACHATT-   g      g?)rsiema_diff
momentum_3g      @g      @g333333@)r1   r3   rr_ratio)	r   signal_typer    patternsmart_signalsmart_eligiblefeaturesdynamic_sltpexecutedg     @gMbP?g     F@g    `l@g    J@z	IA Signal)r   sider0   quantityorder_size_usd	stop_losstake_profitr1   r3   r   is_dynamic_sltpr    r   reasonu7   ✅ Test logging OK - Fichiers créés dans trade_logs/)r   rU   r   r   typingr   r   r   r%   r&   loggerr   r   __annotations__r   r   r)   r7   printr   r   r   <module>r      s    	  & & 			=	)b
 b
L	 (,x$ ++  zF %
 

 # * % " 

CDW r   