Binance API 查询交易记录
在加密货币交易领域,Binance 作为全球领先的交易所,提供了强大的 API(应用程序编程接口),方便用户自动化交易策略、监控账户活动以及查询历史交易记录。 对于量化交易员、税务合规人员以及任何需要深入了解其 Binance 账户活动的用户来说,掌握 Binance API 的交易记录查询功能至关重要。 本文将详细介绍如何利用 Binance API 查询交易记录,以及需要注意的关键参数和最佳实践。
准备工作
在使用 Binance API 查询交易记录之前,必须先完成下列准备工作,以确保数据访问的安全性和效率:
- 创建 Binance 账户: 如果您尚未拥有 Binance 账户,请访问 Binance 官方网站 (www.binance.com) 并注册一个新账户。 注册过程需要提供有效的电子邮件地址和设置强密码。
- 启用双重验证 (2FA): 为了最大程度地保护您的 Binance 账户安全,强烈建议启用双重验证。双重验证通过要求您在登录时提供除了密码之外的第二种验证方式(例如,来自 Google Authenticator 或短信的验证码)来增加安全性。可以在 Binance 账户的安全设置中找到 2FA 启用选项。
- 创建 API 密钥: 登录您的 Binance 账户,然后导航至 API 管理页面。在此页面,您可以创建新的 API 密钥对,包括 API 密钥(API Key)和密钥(Secret Key)。在创建 API 密钥时,务必仔细配置所需的权限。对于查询交易记录,通常至少需要启用“读取”权限。如果需要通过 API 进行交易,则还需开启“交易”权限。创建完毕后,请 务必妥善保管您的 API 密钥和密钥 ,切勿将其泄露给任何第三方。一旦泄露,他人可能会利用您的 API 密钥访问或控制您的账户。建议将 API 密钥存储在安全的地方,例如使用密码管理器或加密的文件。
-
选择合适的编程语言和库:
Binance API 提供了 REST 和 WebSocket 两种接口,满足不同的数据访问需求。REST API 基于请求/响应模型,适用于查询历史交易数据、账户信息等。WebSocket API 提供实时数据流,适用于监控市场行情、订单状态等。 选择您熟悉的编程语言,例如 Python、Java 或 Node.js,并选择对应的 Binance API 库。对于 Python,常用的库包括
python-binance
、ccxt
和binance-connector-python
。python-binance
是一个较为轻量级的库,易于上手;ccxt
是一个更通用的加密货币交易库,支持多个交易所;binance-connector-python
是官方推荐的库,提供更完整的功能和更好的支持。安装所选的库后,您可以使用 API 密钥和密钥连接到 Binance API 并开始查询交易记录。 确保您选择的库与您的编程语言版本兼容,并阅读相应的文档以了解如何使用该库提供的各种功能。
REST API 查询交易记录
Binance REST API 提供了丰富的端点用于查询交易记录,满足不同粒度和维度的查询需求。这些端点允许开发者获取历史交易数据,账户余额信息,以及充提记录等,为量化交易、风险管理和数据分析提供支持。常用的端点包括:
-
GET /api/v3/myTrades
: 查询指定交易对的交易历史。该接口需要提供交易对(symbol)参数,并支持分页查询和时间范围筛选,方便用户获取特定时间段内的交易数据。同时,返回信息包含成交价格、数量、手续费、交易方向(买入/卖出)等详细信息。 -
GET /api/v3/allOrders
: 查询指定交易对的所有订单历史,包括已成交、未成交以及已取消的订单。通过该接口,用户可以追踪订单状态,分析订单执行情况。同样需要提供交易对参数,并支持订单ID、时间范围等条件进行过滤。返回信息包含订单类型(限价单、市价单等)、订单状态、成交数量、委托价格等详细信息。 -
GET /api/v3/account
: 查询账户信息,包括可用余额、已用余额、总余额等。该接口可以获取账户的整体资产状况,方便用户进行资产管理。 返回信息包含不同币种的余额信息,以及账户的交易手续费等级等。 -
GET /sapi/v1/capital/deposits/history
: 查询充值历史。该接口用于获取用户的充值记录,包括充值币种、数量、时间、状态等信息。支持币种、状态等条件进行过滤。 -
GET /sapi/v1/capital/withdrawals/history
: 查询提现历史。该接口用于获取用户的提现记录,包括提现币种、数量、时间、状态、手续费等信息。同样支持币种、状态等条件进行过滤。
以下将以
GET /api/v3/myTrades
为例,详细说明如何查询特定交易对的交易记录,并提供示例请求和响应,以便更好地理解接口的使用方法。
Python 代码示例 (使用
python-binance
库)
这段代码展示了如何使用
python-binance
库连接到币安交易所,并演示一些基本操作。
python-binance
是一个流行的 Python 库,它封装了币安 API,使得与币安交易所的交互变得更加简单。在使用此代码之前,请确保已经安装了
python-binance
库,可以使用
pip install python-binance
命令进行安装。
以下是代码的起始部分,主要功能是导入必要的模块并进行初始化:
from binance.client import Client
import os
-
from binance.client import Client
:这行代码从binance
库中导入Client
类。Client
类是与币安交易所进行交互的主要接口,通过它,可以调用币安 API 的各种功能,例如查询账户信息、下单交易、获取市场数据等。 -
import os
:这行代码导入了 Python 的os
模块。os
模块提供了与操作系统进行交互的函数,例如读取环境变量、创建目录等。在这个例子中,os
模块可能被用来读取存储在环境变量中的 API 密钥,以避免将密钥硬编码在代码中。
强烈建议将 API 密钥存储在环境变量中,而不是直接写入代码。这样可以提高代码的安全性,防止密钥泄露。可以通过以下步骤设置环境变量:
-
在操作系统中设置名为
BINANCE_API_KEY
和BINANCE_API_SECRET
的环境变量,分别存储 API 密钥和密钥。 -
在 Python 代码中使用
os.environ.get('BINANCE_API_KEY')
和os.environ.get('BINANCE_API_SECRET')
来读取环境变量的值。
从环境变量中获取 API 密钥和密钥
在安全地管理您的 Binance API 密钥和密钥时,最佳实践是避免将其直接硬编码到您的代码中。推荐的方法是从环境变量中获取它们,这有助于防止密钥泄露到版本控制系统或未经授权的访问。
以下代码展示了如何使用 Python 的
os
模块从环境变量中读取 API 密钥和密钥:
api_key = os.environ.get('BINANCE_API')
api_secret = os.environ.get('BINANCE_SECRET')
代码解释:
-
os.environ.get('BINANCE_API')
:此函数尝试从环境变量中获取名为BINANCE_API
的变量的值。如果该变量存在,则将其值赋给api_key
变量。如果该变量不存在,则api_key
将被赋值为None
(或您可以设置一个默认值)。 -
os.environ.get('BINANCE_SECRET')
:与上面类似,此函数尝试从环境变量中获取名为BINANCE_SECRET
的变量的值,并将其赋给api_secret
变量。
设置环境变量:
在代码运行之前,您需要在您的操作系统或 shell 环境中设置这两个环境变量。以下是一些常见的设置方法:
-
Linux/macOS:
您可以将以下行添加到您的
.bashrc
、.zshrc
或其他 shell 配置文件中:
export BINANCE_API="YOUR_BINANCE_API_KEY"
export BINANCE_SECRET="YOUR_BINANCE_SECRET_KEY"
然后,运行
source ~/.bashrc
或
source ~/.zshrc
使更改生效。
BINANCE_API
和
BINANCE_SECRET
两个新的系统或用户变量,并将您的 API 密钥和密钥分别设置为它们的值。
安全性考虑:
-
不要将 API 密钥和密钥提交到版本控制系统 (例如 Git)。
确保将包含 API 密钥和密钥的环境变量配置文件(例如
.env
文件,如果使用的话)添加到.gitignore
文件中。 - 限制 API 密钥的权限。 Binance 允许您创建具有特定权限的 API 密钥。只授予您的应用程序所需的最小权限,以降低风险。
- 定期轮换 API 密钥。 这可以减少密钥泄露造成的潜在损害。
使用环境变量来管理 API 密钥是一种安全且灵活的方法,可以帮助您保护您的 Binance 账户和数据。
初始化 Binance 客户端
通过初始化 Binance 客户端,您可以安全地连接到 Binance API 并执行各种操作,如交易、获取市场数据和管理账户。您需要提供有效的 API 密钥和密钥才能成功初始化客户端。
client = Client(api_key, api_secret)
其中,
api_key
是您的 Binance API 密钥,
api_secret
是您的 Binance API 密钥。 这些密钥可以在您的 Binance 账户的 API 管理页面生成。请务必妥善保管您的 API 密钥和密钥,不要泄露给他人,也不要将其存储在公共或不安全的地方。如果您的密钥泄露,请立即撤销并重新生成新的密钥。
使用有效的 API 密钥和密钥初始化客户端后,您就可以使用
client
对象调用 Binance API 的各种方法。 请仔细阅读 Binance API 文档以了解可用的方法和参数。 错误的 API 密钥或密钥将导致初始化失败,并抛出异常。
设置交易对
在加密货币交易中,交易对是指两种可以相互交易的加密货币或加密货币与法定货币。
symbol = 'BTCUSDT'
这行代码用于指定您希望交易的交易对。在本例中,
BTCUSDT
代表比特币 (BTC) 与泰达币 (USDT) 的交易对。这意味着您可以使用 USDT 来购买 BTC,或者使用 BTC 来出售换取 USDT。
交易对的选择至关重要,它决定了您参与交易的市场。不同的交易所有不同的交易对可供选择。在选择交易对时,需要考虑交易量、流动性以及您对标的资产的了解程度。较高的交易量和流动性意味着更容易以您期望的价格买入或卖出,而对标的资产的了解则有助于您做出更明智的交易决策。
例如,如果您的交易策略涉及比特币,那么选择
BTCUSDT
交易对可能是一个合理的选择。但是,如果您对比特币现金 (BCH) 更感兴趣,则可以选择
BCHUSDT
交易对。务必仔细研究您感兴趣的交易对,并了解其风险和回报。
设置查询参数
在区块链数据查询中,设置合适的查询参数至关重要,它直接影响到检索效率和数据的完整性。其中,
limit
参数用于控制单次API调用返回的最大交易记录数量。选择合适的
limit
值需要在性能和数据量之间取得平衡。
limit = 100
# 每次返回的最大交易记录数量。此示例将单次API调用返回的交易记录数量限制为100条。这意味着,如果你需要检索大量的交易记录,例如超过1000条,则需要进行多次API调用,每次调用获取100条记录。
limit
的具体最大值取决于不同的区块链API提供商,一些API可能允许更高的
limit
值,而另一些则有较低的限制。需要查阅对应API的文档以确定最大允许值。
设置较小的
limit
值可以降低服务器的负载,提高响应速度,避免因单次请求数据量过大而导致的超时错误。但这也意味着需要更多的API调用才能获取完整的数据。相反,设置较大的
limit
值可以减少API调用的次数,但可能会增加服务器的负载,延长响应时间,并可能导致请求失败。因此,需要根据实际情况和API提供商的建议,选择最合适的
limit
值。
除了
limit
之外,常见的查询参数还包括
offset
(用于分页,指定从哪条记录开始返回),
blockNumber
或
timestamp
(用于指定区块高度或时间范围), 以及
address
(用于过滤特定地址的交易记录)。合理使用这些参数,可以更精确、高效地检索所需的区块链数据。
startTime = 1609459200000 # 可选:起始时间戳 (毫秒)
endTime = 1640995200000 # 可选:结束时间戳 (毫秒)
发送请求并获取交易记录
在加密货币交易中,获取历史交易记录对于分析市场趋势、评估交易策略以及进行合规审计至关重要。使用客户端API,可以方便地检索特定交易对的交易数据。
trades = client.get_my_trades(symbol=symbol, limit=limit) #, startTime=startTime, endTime=endTime)
这行代码展示了如何通过客户端API调用
get_my_trades
方法来获取交易记录。其中:
-
trades
:变量名,用于存储返回的交易记录列表。每个交易记录通常包含交易ID、交易时间、交易价格、交易数量、交易方向(买入或卖出)、手续费等信息。 -
client
:代表已经初始化并连接到交易所的客户端对象。你需要根据具体的交易所API文档进行客户端的初始化设置,例如设置API密钥、私钥等。 -
get_my_trades
:客户端对象提供的用于获取用户交易记录的方法。这个方法通常需要传入一些参数,例如交易对的交易代码(symbol)和返回交易记录的数量限制(limit)。 -
symbol
:交易对的代码,例如"BTCUSDT"表示比特币兑美元的交易对。你需要根据交易所支持的交易对来设置这个参数。 -
limit
:指定返回的交易记录的最大数量。交易所通常对每次请求返回的记录数量有限制,你需要根据交易所API文档来设置这个参数。如果不设置limit参数,通常会有默认值,但是为了避免超出限制,建议明确设置。 -
startTime
和endTime
(注释部分):这两个参数允许你指定交易记录的起始时间和结束时间,从而获取特定时间段内的交易记录。如果需要按时间筛选交易记录,可以取消注释并设置这两个参数。时间的格式通常是Unix时间戳(毫秒级)。例如,要获取2023年1月1日到2023年1月31日的交易记录,需要将对应的时间戳作为参数传入。
通过合理使用这些参数,你可以精确地获取所需的交易记录,为后续的分析和决策提供数据支持。
打印交易记录
在加密货币交易中,记录每一次交易至关重要,无论是为了税务申报、盈亏分析还是交易策略的回溯。以下代码段展示了如何从交易数据中提取关键信息并进行格式化输出。
针对交易列表中的每一笔交易(
trade in trades
),循环遍历并提取以下核心属性:
时间: {trade['time']}
:记录交易发生的具体时间戳。时间戳通常为 Unix 时间格式,需要转换为可读的日期和时间。不同交易所的时间戳精度可能不同,例如毫秒级或秒级。
交易对: {trade['symbol']}
:指定交易发生的货币对,例如 BTCUSDT 或 ETHBTC。交易对由基础货币和计价货币组成,前者是被交易的资产,后者是用来衡量其价值的资产。
价格: {trade['price']}
:记录交易的成交价格。这是执行交易时的实际价格,受到市场供需关系的影响。理解价格的变动趋势是分析交易策略有效性的关键。
数量: {trade['qty']}
:指示交易的资产数量。数量的单位是基础货币,表示实际交易了多少个单位的加密货币。
费用: {trade['commission']}
:记录交易产生的手续费。手续费是交易所或交易平台收取的服务费用,会直接影响交易的盈利能力。
费用币种: {trade['commissionAsset']}
:指定手续费的支付币种。不同的交易所可能允许使用不同的加密货币或法币支付手续费。
是否买入: {not trade['isBuyer']}
:使用布尔值
trade['isBuyer']
标识交易类型。如果
isBuyer
为
True
,则表示该交易为卖出操作;反之,如果
isBuyer
为
False
,则表示该交易为买入操作。代码中使用
not
运算符进行逻辑反转,以便更直观地显示交易类型。
"-" * 20
:使用分隔符将每笔交易的记录分隔开,提高可读性。
代码解释:
-
导入库:
导入
binance.client
模块中的Client
类。这个类是连接 Binance API 的关键,它封装了各种与币安交易所交互的方法,使得用户可以通过编程的方式获取市场数据、进行交易等操作。 - 初始化客户端: 使用 API 密钥 (API Key) 和密钥 (Secret Key) 初始化 Binance 客户端。API 密钥和密钥是访问 Binance API 的身份凭证,务必妥善保管。建议将 API 密钥和密钥保存在安全的地方,例如操作系统的环境变量中,或者使用专门的密钥管理工具,**绝对不要**直接硬编码在代码中,防止泄露导致资产损失。错误的密钥管理实践可能会导致安全风险,如未经授权的交易或账户信息泄露。
- 设置交易对: 指定要查询的交易对,例如 'BTCUSDT'。交易对是指在交易所中可以进行交易的两种资产的组合。例如,'BTCUSDT' 表示用 USDT 购买或出售 BTC。选择正确的交易对对于获取准确的交易数据至关重要。
-
设置查询参数:
-
symbol
: 必选参数, 指定交易对。例如,要查询比特币和 USDT 的交易记录,symbol
应设置为 'BTCUSDT'。 -
limit
: 可选参数, 指定每次返回的最大交易记录数量,默认为 500,最大为 1000。较高的limit
值可以减少 API 请求的次数,但可能会增加单次请求的数据量。需要根据实际需求和API的速率限制进行权衡。 -
startTime
: 可选参数, 指定起始时间戳(毫秒)。时间戳是表示特定时间的数字,通常以自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数为单位。可以使用 Python 的time
模块或datetime
模块来生成时间戳。 -
endTime
: 可选参数, 指定结束时间戳(毫秒)。如果不指定,则默认为当前时间。 -
fromId
: 可选参数, 指定从哪个交易 ID 开始查询。交易 ID 是 Binance 为每笔交易分配的唯一标识符。使用fromId
可以实现分页查询,避免重复获取相同的交易记录。特别适用于查询大量历史交易数据的情况。
-
-
发送请求:
调用
client.get_my_trades()
方法发送请求,并获取交易记录。这个方法会将设置好的参数发送到 Binance API,并返回一个包含交易记录的列表。需要注意的是,频繁地调用 API 可能会触发速率限制,导致请求失败。因此,在使用 API 时,需要合理地控制请求频率。 - 处理响应: 遍历交易记录,提取所需的信息,并进行打印或其他处理。交易记录通常包含交易时间、交易价格、交易数量、手续费等信息。可以根据需要提取这些信息,进行统计分析、风险评估或其他应用。例如,可以计算一段时间内的平均交易价格、交易量等指标。
关键参数说明
-
symbol
: 指定要查询的交易对,例如 "BTCUSDT"。这是指定交易市场的基础参数,例如比特币兑美元(BTCUSDT)或其他任何在交易所上市的交易对。 务必使用交易所支持的准确交易对代码。 -
limit
: 限制返回的交易记录数量。 调整此值以控制每次API调用返回的数据量。 Binance API 有速率限制,过高的limit
值可能导致请求失败。 合理设置limit
值,例如 500 或 1000,以平衡数据量和请求频率。 -
startTime
和endTime
: 指定查询的时间范围。 这两个参数至关重要,能够精确地过滤历史交易数据。 它们必须是 Unix 时间戳(毫秒),代表时间段的开始和结束。 未指定时,API 将返回尽可能多的历史交易记录,可能导致数据量过大或超时。 使用这两个参数优化查询效率,仅检索所需时间范围内的交易数据。 例如,查询过去 24 小时的交易记录,需要将当前时间和 24 小时前的时间分别转换为 Unix 毫秒时间戳。 -
fromId
: 指定从哪个交易 ID 开始查询。 它是进行分页查询的关键参数,特别是当需要检索大量的交易记录时。首次查询时,可以忽略此参数,API 将从最早的交易记录开始返回。 在后续查询中,使用上次查询结果中最后一条交易记录的id
作为fromId
,有效地获取下一页的交易记录,避免重复数据。 这对于处理大量历史数据至关重要,可以显著提高数据检索的效率。 必须确保fromId
是有效的交易 ID。
处理 API 速率限制
Binance API 为了维护平台的稳定性和防止恶意滥用,实施了速率限制策略。 当请求频率超过预设的阈值时,API 将返回包含特定错误代码的响应,提示超出速率限制。 为了避免触发这些限制,保证应用程序的正常运行,开发者可以采取以下优化措施:
- 降低请求频率: 精简请求策略,避免不必要的重复调用。 例如,除非必要,不要过于频繁地轮询历史交易记录。 审慎地评估数据更新的必要性,并据此调整请求频率。
- 利用 WebSocket API: 对于对实时性要求较高的应用场景,优先考虑使用 Binance 提供的 WebSocket API。 WebSocket 建立的是持久连接,允许服务器主动推送数据,显著降低了对 REST API 的轮询需求,从而避免触发速率限制。 例如,实时交易和价格监控等应用更适合使用 WebSocket。
- 实施数据缓存机制: 将 API 请求返回的结果进行本地缓存,尤其对于不经常变动的数据。 当再次需要相同数据时,直接从缓存中读取,避免重复发起 API 请求。 这可以显著降低服务器的负载,并提升应用程序的响应速度。 缓存策略应根据数据的更新频率进行调整,以确保数据的有效性和一致性。
-
采用分页查询策略:
对于需要获取大量数据的场景,例如历史订单查询,应使用
limit
和fromId
(或其他类似的分页参数)进行分页查询。 通过分批次地获取数据,避免单次请求的数据量过大,从而降低触发速率限制的风险。 每次请求合适数量的数据,并根据响应中的信息,迭代地获取剩余数据。 - 实时监控速率限制指标: Binance API 的响应头中包含了与速率限制相关的详细信息,例如剩余可用请求次数、重置时间等。 开发者应积极监控这些信息,并根据实际情况动态调整请求频率。 当发现剩余请求次数接近阈值时,应主动降低请求频率,避免触发速率限制。 可以设置告警机制,当速率限制即将达到时,及时通知开发者。
其他注意事项
- 安全问题: 务必采取最高级别的安全措施来保护您的 API 密钥和密钥。 不要将其泄露给任何第三方,包括朋友或同事。 切勿将 API 密钥和密钥硬编码在应用程序源代码中,这会带来极高的安全风险。 而是应该利用服务器端环境变量、安全的密钥管理系统(例如 HashiCorp Vault)或其他专门设计的安全存储方案来管理它们。 定期轮换您的 API 密钥,并启用所有可用的双因素身份验证(2FA)选项,以进一步增强安全性。 监控您的 API 使用情况,以便及时发现任何异常活动,例如未经授权的访问尝试。
- 错误处理: 在与 Binance API 交互时,完善的错误处理机制至关重要。 网络连接问题、服务器维护、API 速率限制以及不正确的请求参数都可能导致错误。 实施重试策略,以处理瞬时网络问题,但要确保在重试之间实施指数退避,以避免使 Binance 服务器过载。 记录所有 API 请求和响应,包括错误代码和消息,以便进行调试和故障排除。 向用户提供清晰且有用的错误消息,并根据需要通知管理员。 使用 try-except 块或类似结构来捕获异常,并优雅地处理错误,防止应用程序崩溃。
- API 版本: Binance API 会定期进行更新,引入新功能、修复错误并提高性能。 始终查阅 Binance 的官方 API 文档和变更日志,以了解最新的 API 版本和重大变更。 迁移到新 API 版本时,请进行彻底的测试,以确保您的应用程序能够正常运行。 考虑使用 API 版本控制,以便在不中断现有用户的情况下推出新功能。 订阅 Binance 的官方公告渠道,以便及时了解 API 的任何重大更新或弃用计划。
- 精度问题: 加密货币交易需要极高的精度,因为即使是很小的误差也可能导致重大财务损失。 加密货币的价格和数量通常以小数点后 8 位或更多位来表示。 避免使用浮点数数据类型(例如 float 或 double)来存储和计算这些值,因为它们可能会引入舍入误差。 使用专门为处理高精度十进制算术而设计的数据类型,例如 Python 的 Decimal 模块或 Java 的 BigDecimal 类。 在将数据传递到 Binance API 之前,始终对数字进行适当的格式化,并确保它们符合 API 的精度要求。 进行全面的单元测试和集成测试,以验证您的代码能够正确处理高精度数值。
通过上述的详细说明,您应该能够充分利用 Binance API 来查询和管理您的交易记录。这些知识不仅能帮助您有效地管理您的 Binance 账户和自动化交易策略,还能为税务申报提供精确的数据支持,并确保符合相关法规。请牢记,安全是重中之重,务必采取一切必要措施来保护您的 API 密钥和密钥的安全,并定期审查您的安全实践。