如何在一个请求中从Binance API获取所有或多个对的历史kline?

问题描述

我有一个交易机器人,可以交易多对(30-40)。它使用之前的5m蜡烛作为价格输入。因此,我一对一获得了500万条历史记录。目前,整个周期大约需要10分钟,因此500万支蜡烛每10m需更新一次,这是不好的。

关于如何加快速度的任何想法?

解决方法

我认为最适合您的选择是websocket连接。您无法例如每次接收kline数据一次。 5分钟,但是您可以收到蜡烛中的所有更改,就像在图形中看到的一样。 Binance API仅提供此功能,但与websocket连接配合使用时,将非常快,而不是10分钟。

在接收数据后,您只需要指定关闭蜡烛的时间即可,您可以从json数据(“ t”和“ T”)中的时间戳中进行操作。 [documentation here]

您必须安装websockets库。

pip install websockets

这是一些示例代码,它如何工作。

import asyncio
import websockets


async def candle_stick_data():
    url = "wss://stream.binance.com:9443/ws/" #steam address
    first_pair = 'bnbbtc@kline_1m' #first pair
    async with websockets.connect(url+first_pair) as sock:
        pairs = '{"method": "SUBSCRIBE","params": ["xrpbtc@kline_1m","ethbtc@kline_1m" ],"id": 1}' #other pairs

        await sock.send(pairs)
        print(f"> {pairs}")
        while True:
            resp = await sock.recv()
            print(f"< {resp}")

asyncio.get_event_loop().run_until_complete(candle_stick_data())

输出:

< {"e":"kline","E":1599828802835,"s":"XRPBTC","k":{"t":1599828780000,"T":1599828839999,"i":"1m","f":76140140,"L":76140145,"o":"0.00002346","c":"0.00002346","h":"0.00002346","l":"0.00002345","v":"700.00000000","n":6,"x":false,"q":"0.01641578","V":"78.00000000","Q":"0.00182988","B":"0"}}
< {"e":"kline","E":1599828804297,"s":"BNBBTC","f":87599856,"L":87599935,"o":"0.00229400","c":"0.00229610","h":"0.00229710","l":"0.00229400","v":"417.88000000","n":80,"q":"0.95933156","V":"406.63000000","Q":"0.93351653","E":1599828804853,"s":"ETHBTC","f":193235180,"L":193235214,"o":"0.03551300","c":"0.03551700","h":"0.03551800","l":"0.03551300","v":"21.52300000","n":35,"q":"0.76437246","V":"11.53400000","Q":"0.40962829","E":1599828806303,"L":87599938,"c":"0.00229620","v":"420.34000000","n":83,"q":"0.96497998","B":"0"}}
,

只是为了跟进那个答案。您可以看到蜡烛关闭,因为每个刻度的 websocket 返回数据都有一个布尔属性,用于确定蜡烛是否关闭,即在 5 分钟时间范围内,如果蜡烛在 5 分钟标记处关闭