
    i3                        d Z ddlZddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
mZmZmZ dZdZ ee      j"                  dz  Z ee      j"                  d	z  Zd
ddddddddddddddddddZ G d d      Zd ZdedededefdZdee   fdZd-dedededededee   fd Zd!ede
eef   fd"Zd.ded#ee   d$ee   de
eef   fd%Zd&e
eef   d'efd(Zd)e
eef   de
eef   fd*Z d+ Z!e"d,k(  r e!        yy)/u  
📊 Script de Téléchargement des Données Historiques
====================================================
Télécharge et stocke les données OHLCV (klines) des 62 cryptos
depuis l'API Binance pour optimiser les analyses du bot.

Données collectées:
- Klines 1h: 30 jours d'historique (720 bougies)
- Klines 4h: 90 jours d'historique (540 bougies) 
- Klines 1d: 365 jours d'historique (365 bougies)

Usage:
    python fetch_historical_data.py
    python fetch_historical_data.py --interval 1h --days 60
    N)datetime	timedelta)Path)DictListOptionalAnyzhttps://api.binance.comzhttps://testnet.binance.visionhistorical_datazwatchlist.json     )dayslimit   Z      im  i  )1m5m15m1h4h1dc                   (    e Zd ZdZdZdZdZdZdZdZ	y)	Colorsz[92mz[94mz[93mz[91mz[96mz[0mz[1mN)
__name__
__module____qualname__GREENBLUEYELLOWREDCYANENDBOLD     ./fetch_historical_data.pyr   r   1   s%    EDF
CD
CDr%   r   c                  `    t        dt        j                   dt        j                   d       y)zAffiche le header
u  ╔══════════════════════════════════════════════════════════════╗
║     📊 TÉLÉCHARGEMENT DES DONNÉES HISTORIQUES BINANCE        ║
╚══════════════════════════════════════════════════════════════╝N)printr   r#   r"   r$   r%   r&   print_headerr*   >   sE    	  A BH  BL  BL  AM M r%   currenttotalsymbolintervalc                     t        | |z  dz        }d}t        || z  |z        }d|z  d||z
  z  z   }t        dt        j                   d| d| dt        j                   d	| d
| ddd       y)zAffiche la progressiond   r   u   █u   ░[z] %z - z () T)endflushN)intr)   r   r!   r"   )r+   r,   r-   r.   pctbar_lenfilledbars           r&   print_progressr=   F   s    
w#%
&CG7"U*+F
&.5Gf$45
5C	Bv{{m1SEC5&**S8*A
NTV^bcr%   returnc                      t         j                         rAt        t         d      5 } t        j                  |       }|j                  dg       cddd       S g S # 1 sw Y   g S xY w)z1Charge la liste des cryptos depuis watchlist.jsonrsymbolsN)WATCHLIST_FILEexistsopenjsonloadget)fdatas     r&   load_watchlistrJ   N   sX    .#& 	+!99Q<D88Ir*	+ 	+ I	+ Is   'AA"
start_timeend_timeuse_testnetc           
         |rt         nt        }| d}g }|}||k  r}| |||dd}		 t        j                  ||	d      }
|
j	                          |
j                         }|s	 |S |j                  |       |d   d   dz   }t        j                  d	       ||k  r}|S # t        j                  j                  $ r=}t        d
t        j                   d|  d| t        j                          Y d}~|S d}~ww xY w)u   
    Récupère les klines (candlesticks) depuis Binance
    
    Returns:
        Liste de klines: [open_time, open, high, low, close, volume, close_time, ...]
    z/api/v3/klinesr   )r-   r.   	startTimeendTimer   r   )paramstimeout      g?r(   u   ❌ Erreur API pour : N)TESTNET_URLBASE_URLrequestsrG   raise_for_statusrE   extendtimesleep
exceptionsRequestExceptionr)   r   r    r"   )r-   r.   rK   rL   rM   baseurl
all_klinescurrent_startrQ   responseklineses                r&   
get_klinesrg   V   s    &;8DF.
!CJM
(
" &
	||CCH%%']]_F  f% #2JqMA-M JJsO/ (
": 	 ""33 	Bvzzl"6vhbFJJ<PQ		s   :B #1B C692C11C6klinec                 R   | d   t        j                  | d   dz        j                         t        | d         t        | d         t        | d         t        | d         t        | d         | d   t        | d	         t	        | d
         t        | d         t        | d         dS )u0   Parse une kline brute en dictionnaire structurér   r   rU               rT   r      	   
   )	timestampr   rD   highlowclosevolume
close_timequote_volumetradestaker_buy_basetaker_buy_quote)r   fromtimestamp	isoformatfloatr8   )rh   s    r&   parse_kliner~      s     1X**58d?;EEGeAheAhU1XuQxa/AheAheAh-a/ r+ r%   	intervalsdays_overridec           
         | t        j                         j                         i d}t        t        j                         j	                         dz        }|D ]  }|t
        vr|xs t
        |   d   }t        t        j                         t        |      z
  j	                         dz        }t        | |||      }|sht        |      t        j                  |d   d   dz        j                         t        j                  |d   d   dz        j                         |D 	cg c]  }	t        |	       c}	d|d   |<    |S c c}	w )	uX  
    Télécharge les données historiques pour un symbole
    
    Args:
        symbol: Paire de trading (ex: BTCUSDT)
        intervals: Liste des intervalles à télécharger
        days_override: Nombre de jours à télécharger (override la config par défaut)
    
    Returns:
        Dictionnaire avec les données par intervalle
    )r-   
fetched_atr   r   r   )r   r   rS   )count
start_dateend_datere   r   )r   nowr|   r8   rq   	INTERVALSr   rg   lenr{   r~   )
r-   r   r   rI   rL   r.   r   rK   re   ks
             r&   fetch_symbol_datar      s*    lln..0D 8<<>++-45H 9$;	( 3F ;(,,.9$+??JJLtST
FHj(CV&44VAYq\D5HISSU$226":a=43GHRRT39:a;q>:	+Dh'" K ;s   #ErI   filenamec                     t         j                  d       t         |z  }t        |dd      5 }t        j                  | |dd       d	d	d	       |S # 1 sw Y   |S xY w)
u,   Sauvegarde les données dans un fichier JSONT)exist_okwzutf-8)encodingrj   F)indentensure_asciiN)
OUTPUT_DIRmkdirrD   rE   dump)rI   r   filepathrH   s       r&   	save_datar      s[    d#H$H	hg	. 9!		$!%89 O9 Os   AAall_datac                    t        j                         j                         t        |       i ddd}| j	                         D ]  \  }}di i}|j                  di       j	                         D ]N  \  }}|j                  dd      }||j                  d      |j                  d      d|d   |<   |dxx   |z  cc<   P ||d	   |<    t        |d   d
z  dz  d      |d<   |S )u3   Crée un fichier de résumé avec les métadonnéesr   )
created_attotal_symbolsrA   total_klinesfile_size_estimate_mbr   r   r   r   )r   startr6   r   rA   i  i   rj   r   )r   r   r|   r   itemsrG   round)r   summaryr-   rI   symbol_infor.   interval_datar   s           r&   create_summaryr      s    lln..0X!"G !( 1
 (,xxR'@'F'F'H 	-#Hm!%%gq1E&**<8$((42K$X.
 N#u,#	- &1	6"1  (-W^-Ds-Jk-Z\]'^G#$Nr%   c                  f
   t        j                  d      } | j                  ddg dd       | j                  dt        d	d
       | j                  ddd	d       | j                  ddd       | j	                         }t                |j                  r|j                  }n
t               }|s-t        t        j                   dt        j                          y	t        t        j                   dt        j                   dt        |              t        t        j                   dt        j                   ddj                  |j                                |j                   r9t        t        j                   dt        j                   d|j                           t                i }g }t#        j"                         }t%        |d      D ]  \  }}t'        |t        |      |dj                  |j                               	 t)        ||j                  |j                         }|d   r!|||<   |j*                  s!t-        || d       n|j/                  |       t#        j2                  d        t                |j*                  r;t-        |d       }
t        dt        j4                   d!|
 t        j                          t7        |      }t-        |d"      }t#        j"                         |z
  }t        d#j                  g dt        j8                   d$t        j                   d%t        j4                   d&t        j                   d't        |       dt        |       dt        j                   d(t        j                   d)|d*   d+dt        j                   d,t        j                   d-|d.    d/t        j                   d0t        j                   d)|d1d2t        j                   d3t        j                   d4t:         dt        j                   d5t        j                   d-| d             |rMt        t        j<                   d6t        |       d7t        j                          |D ]  }t        d8|         t        dt        j>                   d9t        j                   d       y	# t0        $ rN}	t        dt        j                   d| d|	 t        j                          |j/                  |       Y d	}	~	d	}	~	ww xY w):zFonction principaleu-   Télécharge les données historiques Binance)descriptionz--intervals+)r   r   r   u+   Intervalles à télécharger (ex: 1h 4h 1d))nargsdefaulthelpz--daysNu?   Nombre de jours d'historique (override les valeurs par défaut))typer   r   z	--symbolsu?   Symboles spécifiques à télécharger (par défaut: watchlist)z--single-file
store_truez%Tout sauvegarder dans un seul fichier)actionr   u,   ❌ Aucun symbole trouvé dans la watchlist!u   📋 Symboles à traiter: u   📊 Intervalles:z, u   📅 Jours d'historique:rU   /r   z_historical.jsonr(   u   ❌ Erreur pour rV   g?zall_historical_data.jsonu"   ✅ Fichier combiné sauvegardé: zhistorical_data_summary.jsonr5   u  ╔══════════════════════════════════════════════════════════════╗
║                    📊 TÉLÉCHARGEMENT TERMINÉ                  ║
╚══════════════════════════════════════════════════════════════╝z

u   ✅ Symboles traités:z      u   📈 Total klines:z
          r   ,u   💾 Taille estimée:z        r   z MB
u   ⏱️  Temps écoulé:z.1fzs
u   📁 Dossier de sortie:z     u   📋 Fichier résumé:u   ⚠️  Symboles échoués (z):z   - u1   💡 Les données sont prêtes pour l'analyse IA!) argparseArgumentParseradd_argumentr8   
parse_argsr*   rA   rJ   r)   r   r    r"   r   r   joinr   r   r\   	enumerater=   r   single_filer   append	Exceptionr]   r   r   r#   r   r   r!   )parserargsrA   r   failed_symbolsrK   ir-   rI   rf   combined_filer   summary_fileelapsedss                  r&   mainr      s   $$1`aF
S:LJ  L
sD^  `
3^  `
D  F DN ||,, "HUV	V[[M26::,aG~
NO	V[[M*6::,a		$..8Q7R
STyy5fjj\499+NO	G HNJw* 	6q#g,0HI	*$VT^^TYYGDK #'  ''dvh.>$?@%%f- 	

3), 
G !(,FG6<<. B=/RXR\R\Q]^_ X&GW&DEL iikJ&G	    A BH  BL  BL  AMM
 
 %
 &,ZZL
 17
 8;8}o
 FG
 HK7|n
U    !'

| ,6 7>n6Ma5PQ  # $*::, /7 8??V7W6XY  % &,ZZL 1; <C3-H  % &,ZZL 16 7A\B  $ %+JJ< 08 9E~F  ;C<O;PPRSYS]S]R^_` 	AE!+	 
Bv{{mLVZZLXZ
[\O  	*Bvzzl"26("QC

|LM!!&))	*s   AS	T0"AT++T0__main__)F)N)#__doc__rE   r\   rY   r   r   r   pathlibr   typingr   r   r   r	   rX   rW   __file__parentr   rB   r   r   r*   r8   strr=   rJ   boolrg   r~   r   r   r   r   r   r$   r%   r&   <module>r      s        (  , , %. (^""%66
h&&)99
 t
$
%&
&
&
&	 dC d dS dC dS	 *s *c *s *c *X\ *imnris *Xt S#X "%c %d3i %QT %aefiknfnao %NDcN c T#s(^ S#X D[]z zF r%   