
    iE                     8   d Z ddlZddlZddlmZmZ ddlZddlmZm	Z	m
Z
mZ ddlZ ej                  e      Z G d d      Zedk(  rS e       Zej%                  d      Zed	   r e ej*                  ed
             y edej-                  d              yy)z~
Module d'analyse technique approfondie pour crypto-monnaies
Analyse RSI, Bollinger Bands, EMA, Momentum et positions actives
    N)datetime	timedelta)DictListOptionalTuplec                      e Zd ZdZd ZdedefdZdededede	fdZ
dd	e	e   d
edefdZdd	e	e   d
ededefdZd	e	e   defdZd d	e	e   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e   fdZdedededededededededefdZy)!TechnicalAnalyzerz(Analyseur technique pour crypto-monnaiesc                     d| _         y )Nzhttps://api.binance.com/api/v3)binance_api)selfs    ./technical_analyzer.py__init__zTechnicalAnalyzer.__init__   s
    ;    symbolreturnc                     	 |j                  d      s| d}|j                         }| j                  |dd      }| j                  |dd      }|r|sdd| dS t        |d   d	         }| j	                  |D cg c]  }t        |d	          c}d
      }| j                  |D cg c]  }t        |d	          c}d      }| j                  |D cg c]  }t        |d	          c}      }| j                  |D cg c]  }t        |d	          c}d      }	t        |dd D cg c]  }t        |d          c}      }
t        |dd D cg c]  }t        |d          c}      }|
|z
  }|dkD  r||z
  |z  dz  nd}| j                  |      }| j                  ||||||	|
||	      }d|t        j                         j                         t        |d      t        |
d      t        |d      t        |d      dt        |d      | j!                  |      t        |d   d      t        |d   d      t        |d   d      t        |d   d	      | j#                  |d         t        |d   d      t        |d   d      t        |d   d	      |d   t        |	d      t        |	dz  d	      d||d S c c}w c c}w c c}w c c}w c c}w c c}w # t$        $ r3}t&        j)                  d!| d"|        dt+        |      dcY d}~S d}~ww xY w)#u   
        Analyse technique complète d'un symbole
        
        Args:
            symbol: Symbole crypto (ex: BTCUSDT)
            
        Returns:
            Dict avec toutes les données d'analyse
        USDT1hd   5mFu,   Impossible de récupérer les données pour )successerror      )period      iN   r   2   T   )currenthigh_24hlow_24hposition_in_rangeuppermiddlelowerpositionema9ema21diff_pcttrend   )rsirsi_zonebb_upper	bb_middlebb_lowerbb_positionbb_zoner+   r,   ema_diff_pct	ema_trendmomentummomentum_pct)r   r   	timestampprice
indicatorsr*   
predictionzErreur analyse : )endswithr'   _get_klinesfloat_calculate_rsi_calculate_bollinger_bands_calculate_ema_calculate_momentummaxmin_get_position_data_generate_predictionr   now	isoformatround_get_rsi_zone_get_bb_zone	Exceptionloggerr   str)r   r   	klines_1h	klines_5mcurrent_pricekr0   bb_dataema_datar9   r$   r%   	range_24hr&   position_datar>   es                    r   analyze_symbolz TechnicalAnalyzer.analyze_symbol   s8   H	??6*"84\\^F ((s;I((s;II$KF8T  ")B-"23M%%I&FquQqT{&Fr%RC55I6VquQqT{6V_a5bG**+KAE!A$K+KLH//i0Pqt0PYZ/[H 34AAE!A$KABH	#$@151;@AG 7*IQZ]^Q^-'"9Y!F!Ldf !33F;M 22sGXx'=J   %\\^557$]A6 %h 2$Wa0)./@!)D	 !a= $ 2 23 7 %gg&6 :!&wx'8!!< %gg&6 :#()<a#@#001DE!(6"2A6"8G#4a8$)(:*>$B!)'!2 %h 2$)(S.!$< *(5 ) 'G6V+K0P B@T  	LL?6("QC89 Q 	ss   AK  K :J3K 'J8<K J=)K ?KK )K>K K&EK 3K 	L(LLLintervallimitc                    	 | j                    d}|||d}t        j                  ||d      }|j                          |j	                         S # t
        $ r'}t        j                  d| d|        g cY d}~S d}~ww xY w)u.   Récupère les klines (chandeliers) de Binancez/klines)r   r]   r^   
   )paramstimeoutu   Erreur récupération klines r?   N)r   requestsgetraise_for_statusjsonrP   rQ   r   )r   r   r]   r^   urlra   responser[   s           r   rA   zTechnicalAnalyzer._get_klinesm   s    	%%&g.C $F
  ||CCH%%'==?" 	LL81#FGI	s   AA 	A?A:4A?:A?pricesr   c                 N   t        |      |dz   k  ryt        j                  |      }t        j                  |dkD  |d      }t        j                  |dk  | d      }t        j                  || d       }t        j                  || d       }|dk(  ry||z  }ddd|z   z  z
  }	|	S )z(Calcule le RSI (Relative Strength Index)   g      I@r   Ng      Y@r   )lennpdiffwheremean)
r   ri   r   deltasgainslossesavg_gainavg_lossrsr0   s
             r   rC   z TechnicalAnalyzer._calculate_rsi}   s    v;!#!VQ/&1*vgq1775&?+7766'(+,q= SAF^$
r   std_devc                     t        |      |k  rdddddS || d }t        j                  |      }t        j                  |      }|||z  z   }|||z  z
  }|d   }	||k7  r|	|z
  ||z
  z  }
nd}
||||
dS )zCalcule les Bollinger Bandsr         ?)r'   r(   r)   r*   Nr   )rl   rm   rp   std)r   ri   r   rw   recent_pricesr(   rz   r'   r)   rU   r*   s              r   rD   z,TechnicalAnalyzer._calculate_bollinger_bands   s    v;!aSIIwx('ff]#'C-('C-(r
 E>%-%%-@HH  	
 	
r   c                     t        |      dk  rdddddS d } ||d      } ||d      }|dk7  r||z
  |z  dz  nd}|dkD  rd	}n
|d
k  rd}nd}||||dS )zCalcule EMA 9 et EMA 21   r   NEUTRE)r+   r,   r-   r.   c                 4    t        j                  | | d        S )N)rm   rp   )datar   s     r   emaz-TechnicalAnalyzer._calculate_ema.<locals>.ema   s    774>**r   	   r   皙?HAUSSIERgBAISSIERrl   )r   ri   r   r+   r,   r-   r.   s          r   rE   z TechnicalAnalyzer._calculate_ema   s    v;q8LL	+ 61~FB5:aZTE\U*S0Qc>E_EE  	
 	
r   c                 \    t        |      |dz   k  ry|d   ||dz       z
  ||dz       z  }|S )u#   Calcule le momentum sur N périodesrk           r   r   )r   ri   r   r9   s       r   rF   z%TechnicalAnalyzer._calculate_momentum   sC    v;!#2J&(!44{8KKr   r0   c                 4    |dk  ry|dk  ry|dk  ry|dk  ryy	)
u   Détermine la zone RSI   SURVENTE-   
ZONE ACHAT7   r~   F   
ZONE VENTESURACHAT )r   r0   s     r   rN   zTechnicalAnalyzer._get_rsi_zone   s-    82X2X2Xr   r5   c                 4    |dk  ry|dk  ry|dk  ry|dk  ryy	)
u   Détermine la zone BBr   zSOUS BANDE BASSE皙?r   333333?zZONE NEUTRE      ?r   zAU-DESSUS BANDE HAUTEr   )r   r5   s     r   rO   zTechnicalAnalyzer._get_bb_zone   s1    %33 3*r   c           
         	 ddl }|j                  j                  |j                  j                  t              d      }|j                  j                  |      sddiS t        |d      5 }t        j                  |      }ddd       |j                  d      s| d}|j                         }|v r||   }|j                  dd      }|j                  d	d
      }d}		 |rft        j                  |j                  dd            }
t        t        j                          |
j                  d      z
  j#                         dz        }	d|||	|j                  dd      |j                  dd      |j                  dd      dS ddiS # 1 sw Y   xY w#  Y OxY w# t$        $ r)}t&        j)                  d| d|        ddicY d}~S d}~ww xY w)u9   Récupère les données de position active si elle exister   Nzpositions.jsonactiveFrr   entry_pricer;    Zz+00:00)tzinfo<   Tquantity	stop_losstake_profit)r   r   
entry_timeduration_minutesr   r   r   zErreur lecture position r?   )ospathjoindirname__file__existsopenrf   loadr@   r'   rd   r   fromisoformatreplaceintrK   total_secondsrP   rQ   r   )r   r   r   positions_filef	positionsposr   r   r   entry_dtr[   s               r   rI   z$TechnicalAnalyzer._get_position_data   s   -	%WW\\"''//(*CEUVN77>>.1 %((nc* )a IIaL	) ??6*"84\\^F "'!ggmQ7 WW["5
 $% !#+#9#9*:L:LSRZ:[#\+.AQAQY]AQA^0^/m/m/ort/t+u(
 ##.",(8 #
A 6!$a!8#&77=!#<  e$$C) )(  	%LL3F82aSABe$$	%s\   AF F *F AF A(F 9F  F F	F FF 	G
!G?G
G
rU   rW   rX   r9   r$   r%   rZ   c
                    d}
|	j                  d      r|	d   }|dkD  r||z
  |z  dz  nd}
d}g }|dk  r!|dz  }|j                  dd|d|d	d
d       nq|dk  r!|dz  }|j                  dd|d|d	dd       nK|dkD  r!|dz  }|j                  dd|d|d	dd       n%|dkD  r |dz  }|j                  dd|d|d	dd       |d   }|dk  r!|dz  }|j                  dd|d|ddd       nq|dk  r!|dz  }|j                  dd|d|dd d       nK|d!kD  r!|dz  }|j                  dd|d"|ddd       n%|d#kD  r |dz  }|j                  dd|d$|dd d       |d%   d&k(  r'|dz  }|j                  dd'|d(   d)|d(   dd*d       n.|d%   d+k(  r&|dz  }|j                  dd'|d(   d,|d(   dd*d       |dz  }|d-kD  r!|d.z  }|j                  dd/|d0|dd*d       nq|d1kD  r!|dz  }|j                  dd/|d2|dd*d       nK|d3k  r!|d.z  }|j                  dd/|d4|dd*d       n%|d5k  r |dz  }|j                  dd/|d6|dd*d       |dk  r |dk  r|d7z  }|j                  d8d9d:d;d       |d7kD  rd<}d=}|	j                  d      sd>nd?}nc|d.kD  rd@}dA}|	j                  d      sd>nd?}nD|dBkD  rd7}dC}dD}n8|dEkD  rdF}dG}|	j                  d      rdHndI}nd}dJ}|	j                  d      rdHndK}|dLz  }|dMz  }|dk  r|dNk  rd-}dO}dP}n|dk  s|dk  rdN}d!}dQ}ndR}d-}dS}||||d|z
  |t        |dT      t        |dT      |||dU|	j                  d      rt        |
dV      dWS d:dWS )Xu7   Génère une prédiction basée sur l'analyse techniquer   r   r   r   r   BULLISHRSIzRSI survente (z.1fz-) - Fort potentiel de rebond (75% historique))type	indicatorvaluemessager      zRSI zone achat (z) - Bon moment pour entrerr   BEARISHzRSI surachat (z) - Risque de correctionr   zRSI zone vente (z) - Prudencer*      BBzPrix sous bande basse (z.2fu!   ) - Retour à la moyenne probabler   r`   zPrix dans zone achat BB ()r   zPrix au-dessus bande haute (r   zPrix dans zone vente BB (r.   r   EMAr-   u   Tendance haussière (z%)r   u   Tendance baissière (ry   r   MOMENTUMzFort momentum positif (g?zMomentum positif (g      u   Fort momentum négatif (gɿu   Momentum négatif (r!   WARNINGzRSI+MOMENTUMNuJ   ⚠️ RSI survente + momentum négatif = CHUTE EN COURS - Ne pas acheter!K   z
ACHAT FORTACHETER	CONSERVERA   ACHATir~   ATTENDREi#   VENTEVENDREzNE PAS ACHETERzVENTE FORTEu   ÉVITERg=
ףp=?g\(\?g333333?       @z
2-6 heuresz4-12 heuresr   z6-24 heuresr"   )tpslexpected_gain_minexpected_gain_max	timeframer    )scorerecommendationactionprobability_upprobability_downsignalstargetsposition_pnl)rd   appendrM   )r   r   rU   r0   rW   rX   r9   r$   r%   rZ   pnl_pctr   r   r   bb_posr:   r   r   r   	tp_target	sl_targetr   r   r   s                           r   rJ   z&TechnicalAnalyzer._generate_prediction  sh    X&'6KMX[\_3{BSHbcG  8RKENN!"+C94ab	  2XRKENN!"-c#Y6PQ	  2XRKENN!"+C94LM	  2XRKENN!"-c#YlC	  $A:RKENN!!4VCL@ab	  c\RKENN!!6vcl!D	  c\RKENN!!9&Efg	  c\RKENN!!6vcl!D	  G
*RKENN!"!*-28J3G2LBO	  g*,RKENN!"!*-28J3G2LBO	   #~#RKENN!'%4\#4FbI	  CRKENN!'%/S/AD	  D RKENN!'%5l35GrJ	  D RKENN!'%0c0B"E	  81RKENN!+g	  2:N)N&3&7&7&AY{FRZN$N&3&7&7&AY{FS[N%NFS[N$N!.!2!28!<XBRFN*N!.!2!28!<X)F "E)	!D(	 8 # #$I2X# # #%I # #%I ,, #n 4Iq)Iq)%6%6& 2?1B1B81LE'1-
 	
 SW
 	
r   N)r   )r   r   )r   )__name__
__module____qualname____doc__r   rR   r   r\   r   r   rA   rB   rC   rD   rE   rF   rN   rO   r   rI   rJ   r   r   r   r
   r
      sW   2<RS RT Rh#  S T  T%[ # u (
e 
c 
Y^ 
im 
6
T%[ 
T 
6$u+ s 5  3 + +# +/% /%$ /%bJ
3 J
u J
5 J
$(J
48J
DIJ
%*J
5:J
KOJ
TXJ
r   r
   __main__BTCUSDTr   r    )indentzErreur: r   )r   rc   numpyrm   r   r   rf   typingr   r   r   r   logging	getLoggerr   rQ   r
   analyzerr\   resultprintdumpsrd   r   r   r   <module>r      s   
   (  . . 			8	$Q
 Q
h z "H$$Y/Fijdjj*+G,-./ r   