o
    li`                     @   s   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Z
ejejejedZ					dd
ededede	e dedejfddZdd
ededejfddZddede	e fddZdS )uY   
Binance 历史K线数据下载器
用于回测时从Binance公开API下载1H K线数据
    N)datetimetimezone)Optionalz%https://api.binance.com/api/v3/klineshistorical_data1h
2017-08-01Tsymbolinterval
start_dateend_datesavereturnc              
   C   s.  t t|djtjd d }|r%t t|djtjd d }nt ttj d }g }|}td|  d| d| d ||k r| |||dd}	zt	j
t|	d	d
}
|
  |
 }W n ty } ztd| d td W Y d}~qCd}~ww |sn"|| |d d d }tdt| ddd td ||k sGtdt| d|   |st S tj|g dd}tj|d ddd|d< d D ]}|| t||< q|g d!  }|jdd"djdd#}|rtjtdd$ tj t|  d%| d&}|j!|d'd( td)|  |S )*u^  
    从Binance下载历史K线数据

    Args:
        symbol: 交易对, 如 "BTCUSDT"
        interval: K线周期, 默认 "1h"
        start_date: 起始日期 "YYYY-MM-DD"
        end_date: 结束日期, 默认到当前
        save: 是否保存为CSV
    Returns:
        DataFrame with columns: timestamp, open, high, low, close, volume
    z%Y-%m-%d)tzinfoi  zDownloading  z from z ...)r   r	   	startTimeendTimelimit   )paramstimeoutz  Request error: z, retrying in 5s ...   N      z  ... z bars downloaded)endg?z

  Total: z
 bars for )	open_timeopenhighlowclosevolume
close_timequote_volumetradestaker_buy_voltaker_buy_quote_volignore)columnsr   msT)unitutc	timestamp)r   r   r   r    r!   )r,   r   r   r   r    r!   )subset)drop)exist_ok_.csvF)indexz  Saved to )"intr   strptimereplacer   r+   r,   nowprintrequestsgetBINANCE_KLINE_URLraise_for_statusjson	Exceptiontimesleepextendlenpd	DataFrameto_datetimeastypefloatcopydrop_duplicatessort_valuesreset_indexosmakedirsDATA_DIRpathjointo_csv)r   r	   r
   r   r   start_tsend_tsall_datacurrentr   respdataedfcolrN    rZ   +/opt/langlang_ai/data/binance_downloader.pydownload_klines   sl   


r\   c                 C   s`   t jt|  d| d}t j|std| dtj|dgd}tj|d dd|d< |S )	u   从本地CSV加载K线数据r0   r1   zNo data file: z. Run download first.r,   )parse_datesT)r+   )	rK   rN   rO   rM   existsFileNotFoundErrorrB   read_csvrD   )r   r	   rN   rX   rZ   rZ   r[   load_klinese   s   ra   coins_configc                 C   s0   |   D ]\}}t|d|j| td qdS )u#   下载所有配置币种的1H数据r   r   N)itemsr\   
data_startr>   r?   )rb   r   r   cfgrZ   rZ   r[   download_all_coinso   s   rf   )r   r   NT)r   )N)__doc__rK   r>   r8   pandasrB   r   r   typingr   r:   rN   rO   dirname__file__rM   strboolrC   r\   ra   dictrf   rZ   rZ   rZ   r[   <module>   s8    
S
