
    i,                         d 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	 e	j                  d      Z G d d      ZdadefdZy)	u   
Time Pattern Analyzer - Détection de patterns horaires et journaliers
Exploite les régularités temporelles du marché crypto
    N)DictListOptional)datetime	timedeltaTimePatternAnalyzerc                       e Zd ZdZd ZddedefdZdede	fdZ
d	ede	fd
Zd	edefdZdefdZde	fdZdedede	de	fdZddedee   fdZddedee   fdZdefdZy)r   z<Analyse des patterns temporels (heures, jours de la semaine)c                 r    i | _         i | _        g dg dg dddgd| _        t        j	                  d       y )N)            )               r   r   r      )
best_hoursworst_hours	best_days
worst_daysu%   ✅ Time Pattern Analyzer initialisé)hourly_performancedaily_performanceknown_patternsloggerinfo)selfs    ./time_pattern_analyzer.py__init__zTimePatternAnalyzer.__init__   s=    "$!# +'"a&	
 	;<    Nsymbolreturnc                 x   t        j                         }|j                  }|j                         }||ddddg d}| j	                  |      }||d<   || j
                  d   v r|d   j                  d| d       n)|| j
                  d	   v r|d   j                  d
| d       | j                  |      }||d<   || j
                  d   v r(|d   j                  d| j                  |       d       n%|| j
                  d   v r|d   j                  d       d|cxk  rdk  rn n|dz  }|d   j                  d       |dk\  s|dk  r|dz  }|d   j                  d       |dk(  r|dk\  r|dz  }|d   j                  d       |dk(  r|dk\  r|dz  }|d   j                  d       ||z   }||d<   |dkD  |d <   |S )!z
        Analyse les patterns temporels actuels
        
        Returns:
            Dict avec bonus/malus selon l'heure et le jour
        r   F)current_hourcurrent_weekday
hour_score	day_scorecombined_scoreis_favorable_timerecommendationsr(   r   r,   u   ✅ Heure favorable (zh UTC)r   u   ⚠️ Heure creuse (r)   r   u   ✅ Jour favorable ()r   u%   ⚠️ Weekend - volatilité réduiter   r   r   u%   📈 US Market Open - forte activité      r   u&   🌏 Asian Hours - liquidité réduiter   r   u    ⚠️ Fin de semaine - prudencer      u*   ✅ Ouverture hebdomadaire - opportunitésr*   r+   )	r   utcnowhourweekday_score_hourr   append_score_weekday_weekday_name)	r   r#   nowr2   r3   analysisr(   r)   r*   s	            r    analyze_time_patternsz)TimePatternAnalyzer.analyze_time_patterns    s#    ooxx++- !&!&!
 %%d+
!+4&&|44&'..1FtfF/STT((77&'..1FtfF/ST ''0	 )d))+66&'..1EdFXFXY`FaEbbc/de++L99&'..1VX
 !OJ&'../VW 2:!OJ&'../WX a<DBJNI&'../QR a<DBJNI&'../[\ $i/%3!"(6(:$%r"   r2   c                     d|cxk  rdk  ry d|cxk  rdk  ry d|cxk  rdk  ry	 |d
k\  s|dk  ryd|cxk  rdk  ry y	y	)u   
        Score l'heure actuelle (-10 à +10)
        
        Basé sur patterns empiriques du marché crypto:
        - Pics d'activité: 14h-17h UTC (US markets)
        - Creux: 2h-5h UTC (nuit US)
        r   r   
   r/      r         r      r   r   i )r   r2   s     r    r4   zTimePatternAnalyzer._score_hourd   sq       ??    2: >>  r"   r3   c                 0    |dv ry|dk(  ry|dk(  ry|dv ryy)u   
        Score le jour de la semaine (-10 à +10)
        
        0=Lundi, 1=Mardi, 2=Mercredi, 3=Jeudi, 4=Vendredi, 5=Samedi, 6=Dimanche
        r   r/   r   r   r   )r   r   irB   )r   r3   s     r    r6   z"TimePatternAnalyzer._score_weekday   s7     i a< a< fr"   c                 0    g d}d|cxk  r	dk  r||   S  dS )zRetourne le nom du jour)LundiMardiMercrediJeudiVendrediSamediDimancher   r   InconnurB   )r   r3   dayss      r    r7   z!TimePatternAnalyzer._weekday_name   s%    X !W 1 1tG}@ 1y@r"   c                 ,    | j                         }|d   S )u   
        Détermine si c'est un bon moment pour trader
        
        Returns:
            True si conditions temporelles favorables
        r+   r:   r   r9   s     r    should_trade_nowz$TimePatternAnalyzer.should_trade_now   s     --/+,,r"   c                 ,    | j                         }|d   S )u   
        Retourne un bonus de score basé sur le timing (-10 à +10)
        
        Returns:
            Bonus à ajouter au score d'une opportunité
        r*   rO   rP   s     r    get_time_bonusz"TimePatternAnalyzer.get_time_bonus   s     --/())r"   
entry_timeprofitduration_hoursc                 l   |j                   }|j                         }|| j                  vrdddd| j                  |<   | j                  |   }|dxx   dz  cc<   |dxx   |z  cc<   |dxx   |dkD  rdndz  cc<   |d   |d   z  |d<   |d   |d   z  dz  |d	<   || j                  vrdddd| j                  |<   | j                  |   }|dxx   dz  cc<   |dxx   |z  cc<   |dxx   |dkD  rdndz  cc<   |d   |d   z  |d<   |d   |d   z  dz  |d	<   t        j                  d
| d| d|        y)u%  
        Apprend des trades passés pour améliorer les statistiques horaires/journalières
        
        Args:
            symbol: Symbole tradé
            entry_time: Heure d'entrée
            profit: Profit réalisé (%)
            duration_hours: Durée du trade en heures
        r   )total_tradestotal_profitwinsrX   r   rY   rZ   
avg_returnd   win_rateu   📊 Stats mises à jour - u    à zh, jour N)r2   r3   r   r   r   debug)	r   r#   rT   rU   rV   r2   r3   statsdaily_statss	            r    learn_from_tradez$TimePatternAnalyzer.learn_from_trade   s    $$& t... ! !-D##D) ''-n"n'ffqja/#N3eN6KKl"6]U>-BBcIj $000 ! !/D""7+ ,,W5N#q(#N#v-#FFQJqA5$/$?+nB]$]L!#.v#6^9T#TX["[J26($tfHWIVWr"   
min_tradesc                 T   | j                   s| j                  d   S g }| j                   j                         D ],  \  }}|d   |k\  s|d   |d   z  }|j                  ||f       . |s| j                  d   S |j	                  d d       |dd	 D cg c]  \  }}|	 c}}S c c}}w )
u  
        Retourne les meilleures heures pour trader (basé sur historique)
        
        Args:
            min_trades: Minimum de trades pour considérer l'heure
            
        Returns:
            Liste des heures (0-23) triées par performance
        r   rX   r[   r]   c                     | d   S Nr   rB   xs    r    <lambda>z<TimePatternAnalyzer.get_best_trading_hours.<locals>.<lambda>   s
    qt r"   TkeyreverseNr   )r   r   itemsr5   sort)r   rb   valid_hoursr2   r_   score_s          r    get_best_trading_hoursz*TimePatternAnalyzer.get_best_trading_hours   s     &&&&|442288: 	2KD%^$
2l+eJ.??""D%=1	2
 &&|44 	^T:$/O4q444   B$c                 T   | j                   s| j                  d   S g }| j                   j                         D ],  \  }}|d   |k\  s|d   |d   z  }|j                  ||f       . |s| j                  d   S |j	                  d d       |dd	 D cg c]  \  }}|	 c}}S c c}}w )
u   
        Retourne les meilleurs jours pour trader
        
        Returns:
            Liste des jours (0-6) triés par performance
        r   rX   r[   r]   c                     | d   S re   rB   rf   s    r    rh   z;TimePatternAnalyzer.get_best_trading_days.<locals>.<lambda>  s
    ad r"   Tri   Nr   )r   r   rl   r5   rm   )r   rb   
valid_daysdayr_   ro   rp   s          r    get_best_trading_daysz)TimePatternAnalyzer.get_best_trading_days   s     %%&&{33
00668 	0JC^$
2l+eJ.??!!3,/	0
 &&{33ND9",Ra.1Q111rr   c           	      r   t        | j                        t        | j                        | j                         | j	                         i i d}| j                  j                         D ]Q  \  }}|d   dk\  s|d   t        |j                  dd      d      t        |j                  dd      d      d	|d
   |<   S | j                  j                         D ]`  \  }}|d   dk\  s|d   t        |j                  dd      d      t        |j                  dd      d      d	|d   | j                  |      <   b |S )u   
        Retourne un résumé des statistiques temporelles
        
        Returns:
            Dict avec stats globales
        )total_hours_trackedtotal_days_trackedr   r   hourly_statsr`   rX   r   r[   r   r   r]   r   )tradesr[   r]   r{   r`   )	lenr   r   rq   rw   rl   roundgetr7   )r   summaryr2   r_   rv   s        r    get_statistics_summaryz*TimePatternAnalyzer.get_statistics_summary  s@    $'t'>'>#?"%d&<&<"=557335
  2288: 	KD%^$)#N3"'		,(BA"F %eii
A&> B1'-	 00668 	JC^$)#N3"'		,(BA"F %eii
A&> BC&t'9'9#'>?	 r"   )N)r<   )__name__
__module____qualname____doc__r!   strr   r:   intfloatr4   r6   r7   boolrQ   rS   r   ra   r   rq   rw   r   rB   r"   r    r   r      s    F=BC B4 BH  <c e 0AS AS A
-$ -* *,Xs ,X ,X!&,X8=,X\5 5d3i 542 2T#Y 2," "r"   r$   c                  .    t         
t               a t         S )z4Retourne l'instance globale du time pattern analyzer)_time_pattern_analyzerr   rB   r"   r    get_time_pattern_analyzerr   9  s     %!4!6!!r"   )r   numpynptypingr   r   r   r   r   logging	getLoggerr   r   r   r   rB   r"   r    <module>r      sP   
  ' ' ( 			0	1e eR	  "#6 "r"   