如何通过Binance API高效获取指定时间段的全量已成交订单历史?
针对你开发交易机器人时遇到的全年订单历史获取效率低的问题,我整理了几个实用的优化方案:
1. 并发请求+限流控制
遍历所有交易对时串行请求确实会拖慢进度,改用并发请求能大幅提升速度。比如用Python的aiohttp+asyncio,或者Node.js的axios并发池,同时向多个交易对发起订单数据请求。
但要注意Binance API的权重限制:GET /api/v3/allOrders(个人账户所有订单)或GET /api/v3/historicalTrades(市场成交历史)的单请求权重为5,普通账户每分钟权重上限是1200。建议把并发数控制在10-20个左右,避免触发限流导致请求失败。
示例思路(Python伪代码):
import asyncio import aiohttp async def fetch_order_history(session, ticker, start_ts, end_ts): url = f"https://api.binance.com/api/v3/allOrders?symbol={ticker}&startTime={start_ts}&endTime={end_ts}" async with session.get(url) as response: return await response.json() async def main(): target_tickers = ["BTCUSDT", "ETHUSDT", "BNBUSDT"] # 按需扩展交易对列表 start_ts = 1672531200000 # 2023年1月1日的时间戳(毫秒) end_ts = 1704067200000 # 2024年1月1日的时间戳(毫秒) async with aiohttp.ClientSession() as session: tasks = [fetch_order_history(session, ticker, start_ts, end_ts) for ticker in target_tickers] order_results = await asyncio.gather(*tasks) # 后续处理订单数据逻辑 asyncio.run(main())
2. 官方批量历史数据下载(市场成交数据适用)
如果你的机器人需要的是市场逐笔成交历史(而非个人账户订单),Binance官方提供了免费的批量数据下载服务——按交易对和日期打包成压缩文件。你可以直接下载全年的逐笔成交数据,完全不需要调用API请求,这是效率最高的方式。
3. 优先处理核心交易对
如果你的交易策略主要针对高流动性主流交易对(比如BTC/USDT、ETH/USDT这类),可以先获取这些核心交易对的历史数据,快速完成初步训练。小众交易对的历史数据可以后续按需补充,能大幅缩短初始数据获取的时间。
4. 纠正API接口使用误区
你提到的allOrdersList应该是指GET /api/v3/orderList接口,它确实只返回OCO订单列表。而获取普通订单(限价单、市价单、止损单等)应该使用GET /api/v3/allOrders接口,传入指定交易对和时间范围参数,就能拿到该交易对的所有订单数据。
5. 增量更新+缓存(持续训练场景)
如果你的机器人是长期运行的,可以先一次性补全历史时间段的数据,之后通过Websocket订阅实时更新:个人账户订单用userDataStream频道,市场成交用trade频道,实时获取新订单数据并缓存。后续训练只需要使用增量数据,不需要重复拉取全年历史。
内容的提问来源于stack exchange,提问作者Rangel Milushev




