如何通过一个请求从币安API中获取所有或多个交易对的历史k线数据?

12

我有一个交易机器人,它可以交易多个货币对(30-40)。它使用之前5分钟K线的价格作为输入。因此,我需要逐个获取所有货币对的5分钟历史记录。目前整个周期需要约10分钟时间,这意味着5分钟K线每隔10分钟才能更新一次,这不太好。

你有任何加速的想法吗?


我现在使用这个 - Negar Zamiri
3个回答

11

我认为最适合你的选择将是websocket连接。 你不能每隔5分钟接收一次k线数据,但你可以接收蜡烛图的每一个变化,就像你在图表中看到的那样。币安API仅提供此功能,但与websocket连接结合使用,它将非常快速,而不是需要10分钟。

接收数据后,您只需要指定蜡烛图何时关闭,您可以从json数据中的时间戳('t'和'T')中完成这个任务。[文档在这里]

你必须安装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,"s":"XRPBTC","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","k":{"t":1599828780000,"T":1599828839999,"s":"BNBBTC","i":"1m","f":87599856,"L":87599935,"o":"0.00229400","c":"0.00229610","h":"0.00229710","l":"0.00229400","v":"417.88000000","n":80,"x":false,"q":"0.95933156","V":"406.63000000","Q":"0.93351653","B":"0"}}
< {"e":"kline","E":1599828804853,"s":"ETHBTC","k":{"t":1599828780000,"T":1599828839999,"s":"ETHBTC","i":"1m","f":193235180,"L":193235214,"o":"0.03551300","c":"0.03551700","h":"0.03551800","l":"0.03551300","v":"21.52300000","n":35,"x":false,"q":"0.76437246","V":"11.53400000","Q":"0.40962829","B":"0"}}
< {"e":"kline","E":1599828806303,"s":"BNBBTC","k":{"t":1599828780000,"T":1599828839999,"s":"BNBBTC","i":"1m","f":87599856,"L":87599938,"o":"0.00229400","c":"0.00229620","h":"0.00229710","l":"0.00229400","v":"420.34000000","n":83,"x":false,"q":"0.96497998","V":"406.63000000","Q":"0.93351653","B":"0"}}

单个请求中有多少对数据是有限制的吗? - user2530833

1

仅作为对答案的跟进。您可以看到蜡烛的关闭,因为每个tick的websocket返回数据都有一个布尔属性,用于指示蜡烛是否关闭,例如,在5分钟时间框架上,如果蜡烛在5分钟标记处关闭


0

对rozumir的回答的另一个跟进。如果您使用“async for”循环和“try-except”,则可以在断开连接后保证重新连接。由于binance在24小时后断开websocket连接,因此这非常有用。Websockets 10.4的示例代码如下:

import asyncio
import websockets

async def candle_stick_data():

    url = "wss://stream.binance.com:9443/ws/" #steam address
    first_pair = 'btcusdt@kline_15m' #first pair

    async for sock in websockets.connect(url+first_pair):

        try:
            pairs = '{"method": "SUBSCRIBE", "params:["ethusdt@kline_15m","algousdt@kline_15m","nearusdt@kline_15m","atomusdt@kline_15m"],  "id": 1}' #other pairs
        
            await sock.send(pairs)
            print(f"> {pairs}")
            while True:
            
                resp = await sock.recv()                
                print(f"< {resp}")
                            
        except websockets.ConnectionClosed:
            continue

asyncio.run(candle_stick_data())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接