1. 分析 symbol, starting_date, 和ending_date参数
2. 获取在开始日期发生的第一笔交易,以获取第一笔trade_id。
3. 循环获取每个请求1,000笔交易(Binance API限制),直到达到ending_date。
4. 最后将数据保存到磁盘。对于示例,我们将其保存为CSV,但是您还有其他选择。
symbol=sys.argv[1]starting_date=datetime.strptime(sys.argv[2],'%m/%d/%Y')ending_date=datetime.strptime(sys.argv[3],'%m/%d/%Y')+timedelta(days=1)-timedelta(microseconds=1)
new_ending_date=from_date+timedelta(seconds=60)r=requests.get('https://api.binance.com/api/v3/aggTrades',params={"symbol":symbol,"startTime":get_unix_ms_from_date(from_date),"endTime":get_unix_ms_from_date(new_ending_date)})response=r.json()iflen(response)>0:returnresponse[0]['a']else:raiseException('notradesfound')
defget_unix_ms_from_date(date):returnint(calendar.timegm(date.timetuple())*1000+date.microsecond/1000)
[{"a":26129,//AggregatetradeId"p":"0.01633102",//Price"q":"4.70443515",//Quantity"f":27781,//FirsttradeId"l":27781,//LasttradeId"T":1498793709153,//Timestamp"m":true,//Wasthebuyerthemaker?"M":true//Wasthetradethebestpricematch?}]
defget_trades(symbol,from_id):r=requests.get("https://api.binance.com/api/v3/aggTrades",params={"symbol":symbol,"limit":1000,"fromId":from_id})returnr.json()
from_id=get_first_trade_id_from_start_date(symbol,from_date)current_time=0df=pd.DataFrame()whilecurrent_time<get_unix_ms_from_date(to_date):trades=get_trades(symbol,from_id)from_id=trades[-1]['a']current_time=trades[-1]['T']print(f'fetched{len(trades)}tradesfromid{from_id}@{datetime.utcfromtimestamp(current_time/1000.0)}')df=pd.concat([df,pd.DataFrame(trades)])#dontexceedrequestlimitstime.sleep(0.5)
使用from_id参数获取交易
使用从最新交易中获取的信息来更新from_id和current_time参数
打印一个nice的调试消息
pd.concat与我们DataFrame中的先前交易取得的交易
leep,使Binance不会给我们一个难看的429 HTTP响应
deftrim(df,to_date):returndf[df['T']<=get_unix_ms_from_date(to_date)]
df.drop_duplicates(subset='a',inplace=True)df=trim(df,to_date)
filename=f'binance__{symbol}__trades__from__{sys.argv[2].replace("/","_")}__to__{sys.argv[3].replace("/","_")}.csv'df.to_csv(filename)
df=pd.read_csv(file_name)values=df.to_numpy()last_id=values[0][1]forrowinvalues[1:]:trade_id=row[1]iflast_id+1!=trade_id:print('last_id',last_id)print('trade_id',trade_id)print('inconsistentdata')exit()last_id=trade_idprint('dataisOK!')
Thiago Candido
作者:链三丰,来源:区块链研究实验室
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。