币安错误——使用了过多的请求权重;当前限制是每 1 分钟 1200 个请求重量

Binance error - Too much request weight used; current limit is 1200 request weight per 1 MINUTE

exchange.load_markets()
while 1:
    try:
        bars = exchange.fetch_ohlcv(ETH/USDT, timeframe='5m', limit=5)                                          
        df = pd.DataFrame(bars[:], columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

    except ccxt.BaseError as Error:
        print("[ERROR] ", Error)
        continue

您好, 我在 Binance 中使用 Python 进行算法交易。我正在使用 ccxt。 我在 运行 上面的代码中,但我没有收到任何关于请求使用的错误消息。但是,在我成为 运行 相同 IP 中使用相同代码的第二个交易机器人后,我收到“超过 1200 个请求使用”错误。 我如何计算我在一分钟内创建了多少个请求?如果我能计算出来,我会安排在 2 或 3 秒内下载 ohlvc 数据,或者需要多少秒。 谢谢。

您可以这样做的一种方法是检索交换时间并将其保存在一个变量中,然后每次循环代码时将该变量减去当前时间。

这会让您了解循环之间有多少毫秒以查看您是否达到限制:

import ccxt
import pandas as pd

exchange = ccxt.binance()
exchange.load_markets()

previous_time = 0

while 1:
    try:
        current_time = exchange.fetchTime()
        time_difference = current_time - previous_time
        previous_time = current_time
        print(time_difference)
        
        bars = exchange.fetch_ohlcv('ETH/USDT', timeframe='5m', limit=5)                                          
        df = pd.DataFrame(bars[:], columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
       # print(df)

    except ccxt.BaseError as Error:
        print("[ERROR] ", Error)
        continue

据我所知,每 0.5 秒到 1 秒发出一个请求,这远低于每分钟 1200 个请求/60 秒 = 每秒 20 个请求。话虽这么说,如果你是 运行 其他并行的机器人,那么你可以很快达到极限。

也就是说,确切的错误消息如下:

{"code":-1003,"msg":"Too many requests; current limit is 1200 requests per minute. 
Please use the websocket for live updates to avoid polling the API."}

正如错误消息所暗示的那样,您真的应该考虑使用 websocket 进行实时更新,因为如果您想继续轮询 [=32=,您这样做的方式并不是正确的方法] 在非常短的时间范围内。

这还需要您学习使用 asyncio 事件循环。可以找到一个很好的教程 here

最后,这是一个 link 使用 websocketsasyncio 检索 binance 价格的工作示例。