欧易API交易历史查询:高效追踪与实战指南【2024最新】
欧易API查询交易历史:深度解析与实战指南
欧易(OKX)作为全球领先的加密货币交易所,为用户提供了丰富的API接口,方便开发者和量化交易者进行程序化交易和数据分析。其中,查询交易历史的API接口尤为重要,可以帮助用户追踪交易记录、分析交易策略效果、以及进行税务申报等。本文将深入解析欧易API查询交易历史功能,并提供实战指南,帮助读者更好地利用这一工具。
欧易API查询交易历史接口概览
欧易API提供了多种查询交易历史的接口,开发者可根据自身应用场景和数据需求,灵活选择使用。这些接口涵盖了成交明细、历史订单以及归档订单等多个维度的数据查询,为用户提供了全面的交易数据访问能力。
-
GET /api/v5/trade/fills
:查询用户成交明细。这是最常用的查询交易历史的接口之一,它能够提供关于用户已执行成交的详细信息。通过此接口,可以获取到成交价格、成交数量、手续费、成交时间、成交方向(买入或卖出)、以及关联的订单ID等关键数据。该接口支持分页查询,允许用户分批获取大量的成交记录。还可以通过指定交易对(instrument ID)来过滤成交明细,从而只获取特定交易对的成交数据。 -
GET /api/v5/trade/orders-history
:查询历史订单。此接口用于检索用户的所有历史订单信息,包括已完成、已取消和进行中的订单。用户可以获取到订单类型(限价单、市价单等)、订单状态(已成交、已取消、部分成交等)、下单时间、订单价格、订单数量、交易对、委托策略等详细信息。与成交明细接口类似,订单历史接口也支持分页查询和按照交易对进行过滤,方便用户高效地管理和分析其历史交易行为。 -
GET /api/v5/trade/orders-history-archive
:查询归档的历史订单。为了优化查询性能,欧易API将时间跨度较长的历史订单数据进行归档。如果需要查询较早之前的历史订单,则需要使用此接口。该接口的使用方式与orders-history
接口类似,但通常查询速度可能会较慢,因为它需要从归档数据库中检索数据。在使用此接口时,建议明确指定查询的时间范围,以减少数据检索量,提升查询效率。
GET /api/v5/trade/fills 接口详解
接口描述
GET /api/v5/trade/fills
接口用于查询用户的成交明细。通过该接口,用户可以获取到所有已成交的订单信息,包括但不限于成交价格、成交数量、手续费、成交时间以及交易对等关键数据,以便用户进行盈亏分析、交易策略优化和历史交易记录查询。
更详细地说,该接口返回的数据包含了每一笔成交的详细信息。成交价格是指实际交易发生的单价,成交数量是指实际成交的资产数量。手续费是平台针对此次交易收取的费用,通常以交易对的某种资产计价。成交时间记录了成交发生的精确时间戳,有助于用户追踪交易时效性。交易对则标明了此次成交涉及的资产组合,例如BTC-USD或ETH-USDT等。
通过设置不同的请求参数,例如开始时间和结束时间,用户可以筛选特定时间段内的成交记录。还可以根据交易对进行筛选,以便用户专注于特定市场的交易行为。该接口对于量化交易者、策略开发者以及需要审计交易历史的用户尤其重要。
请求参数
参数名 | 是否必须 | 类型 | 描述 |
---|---|---|---|
instId | 是 | string | 交易对,例如:BTC-USDT |
orderId | 否 | string | 订单ID,如果指定,则返回该订单的所有成交明细 |
instType | 否 | string | 产品类型,例如:SPOT, MARGIN, SWAP, FUTURES, OPTION。默认为SPOT。 |
after | 否 | string | 分页用,返回结果的最后一条数据的tradeId,下一页数据 |
before | 否 | string | 分页用,返回结果的第一条数据的tradeId,上一页数据 |
limit | 否 | string | 返回的结果集数量,范围:1-500,默认值:100 |
begin | 否 | string | 查询开始时间,Unix时间戳,单位:毫秒 |
end | 否 | string | 查询结束时间,Unix时间戳,单位:毫秒 |
返回参数
接口返回一个 JSON 数组,每个元素代表一个独立的成交明细,详细记录了交易执行的具体信息。数组中的每个对象都包含了以下关键字段,用于分析交易行为和跟踪订单执行状态:
字段名 | 类型 | 描述 |
---|---|---|
instId | string | 交易对标识,明确指定了交易的资产对,例如 BTC-USDT。 |
tradeId | string | 成交ID,平台为每笔成功的交易分配的唯一标识符,用于追踪特定交易。 |
orderId | string | 订单ID,关联成交记录的原始订单的唯一标识符,允许追踪订单的执行情况。 |
clOrdId | string | 客户自定义订单ID,如果客户在下单时设置了自定义的订单ID,则会在此字段中返回,方便用户进行订单管理和对账。 |
px | string | 成交价格,实际交易发生的单价,精确到小数点后多位,取决于交易对的精度设置。 |
sz | string | 成交数量,实际成交的资产数量,同样需要考虑交易对的最小交易单位和精度。 |
side | string | 订单方向,表明是买入(buy)还是卖出(sell)订单,指示了交易的目的。 |
posSide | string | 持仓方向,指示交易对持仓的影响,包括多仓(long)、空仓(short)和净持仓(net)。净持仓表示开仓和平仓方向相同,相互抵消。该字段仅适用于交割合约和永续合约。 |
fee | string | 手续费,因该笔交易而产生的费用,通常以交易币种计价。 |
feeCcy | string | 手续费币种,指定了手续费所使用的币种,例如 USDT, BTC等。 |
ts | string | 成交时间,Unix时间戳,单位为毫秒,记录了交易发生的准确时间。可用于时间序列分析和回溯测试。 |
instType | string | 产品类型,指明了交易的产品类型,例如:现货交易 (SPOT), 杠杆交易 (MARGIN), 永续合约 (SWAP), 交割合约 (FUTURES), 期权 (OPTION)。 |
mgnMode | string | 保证金模式,仅适用于币币杠杆和交割合约/永续合约。分为全仓(cross)和逐仓(isolated)两种模式,影响风险计算和保证金调用方式。 |
tag | string | 订单标签。如果用户在创建订单时设置了标签,该字段将返回该标签,便于用户进行自定义分类和统计。 |
示例代码 (Python)
以下 Python 代码演示了如何使用 OKX API 获取成交明细。代码使用了
requests
库发送 HTTP 请求,
hashlib
和
hmac
库生成签名,
time
库获取时间戳,以及
base64
库进行 Base64 编码。
在使用这段代码之前,需要安装
requests
库:
pip install requests
import requests
import hashlib
import hmac
import time
import base64
请替换以下变量为你的实际 API 密钥、Secret Key 和 Passphrase。这些信息可以在 OKX 平台的 API 管理页面找到。
base_url
定义了 API 的根 URL,根据你的地区选择合适的 URL。对于大部分用户,
https://www.okx.com
是正确的选择。部分地区可能需要使用
https://www.okx.com
。
api_key = 'YOUR_API_KEY'
secret_key = 'YOUR_SECRET_KEY'
passphrase = 'YOUR_PASSPHRASE'
base_url = 'https://www.okx.com' # 或 'https://www.okx.com',取决于你的地区
generate_signature
函数用于生成 API 请求的签名。它接收时间戳、HTTP 方法、请求路径和请求体作为输入,并使用 Secret Key 对其进行哈希运算,然后进行 Base64 编码。生成的签名用于验证请求的真实性。
def generate_signature(timestamp, method, request_path, body='', secret_key=secret_key):
message = timestamp + method + request_path + body
mac = hmac.new(secret_key.encode('utf-8'), message.encode('utf-8'), hashlib.sha256)
d = mac.digest()
return base64.b64encode(d).decode()
get_fills
函数用于获取指定交易对的成交明细。它接收交易对 ID (
inst_id
) 作为输入,例如
BTC-USDT
。该函数构造 API 请求的 URL,并设置必要的 HTTP 头部,包括 API Key、签名、时间戳和 Passphrase。然后,它发送 GET 请求到 OKX API,并返回响应结果。如果请求成功,则返回 JSON 格式的成交明细数据;否则,打印错误信息并返回
None
。
def get_fills(inst_id):
endpoint = '/api/v5/trade/fills'
timestamp = str(int(time.time()))
method = 'GET'
request_path = endpoint + '?instId=' + inst_id
signature = generate_signature(timestamp, method, request_path)
headers = {
'OK-ACCESS-KEY': api_key,
'OK-ACCESS-SIGN': signature,
'OK-ACCESS-TIMESTAMP': timestamp,
'OK-ACCESS-PASSPHRASE': passphrase,
'Content-Type': 'application/' # 明确指定 Content-Type 为 application/
}
url = base_url + endpoint + '?instId=' + inst_id
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.() # 使用 response.() 将响应转换为 JSON 格式
else:
print(f"Error: {response.status_code} - {response.text}")
return None
以下代码展示了如何调用
get_fills
函数,并解析返回的成交明细数据。定义要查询的交易对 ID,例如
BTC-USDT
。然后,调用
get_fills
函数获取成交明细数据。如果返回的数据包含
code
字段且值为
0
,则表示请求成功,可以遍历
data
字段中的每个成交明细,并打印相关信息,例如交易 ID、价格、数量、方向和时间戳。
ts
字段通常是毫秒级的时间戳,可能需要进行转换才能更易读。
if __name__ == '__main__':
instrument_id = 'BTC-USDT' # 例如:BTC-USDT
fills_data = get_fills(instrument_id)
if fills_data and fills_data.get('code') == '0': # 使用 .get() 方法避免 KeyError
for fill in fills_data['data']:
print(f"Trade ID: {fill['tradeId']}, Price: {fill['px']}, Size: {fill['sz']}, Side: {fill['side']}, Timestamp: {fill['ts']}")
else:
print("Failed to retrieve fills.")
注意事项
- 在使用API之前,请务必认真阅读欧易官方提供的API文档,深入了解每个接口的功能、参数说明、请求方式、返回数据结构以及使用限制。务必理解每个接口的频率限制(Rate Limit),避免因超出限制而被暂时禁止访问。同时,关注API文档的更新,以便及时了解最新的接口变更和功能增强。
- API Key、Secret Key和Passphrase是访问欧易API的关键凭证,务必采取最高级别的安全措施进行保管。切勿将这些信息以任何形式泄露给他人,不要将其存储在不安全的地方,例如公共网络、聊天记录、电子邮件或未加密的配置文件中。建议使用专门的密钥管理工具或硬件安全模块(HSM)来安全地存储和管理这些敏感信息。定期更换API Key和Secret Key可以进一步增强安全性。Passphrase也应设置为足够复杂,并定期修改。
- 为了确保数据在不同系统之间的一致性和准确性,强烈建议使用协调世界时(UTC)时间戳。在构造API请求和解析API响应时,务必将所有时间相关的数据转换为UTC时间戳,并进行统一处理。避免使用本地时间或未指定时区的时间,以免造成数据偏差或错误。
-
合理地设置
limit
参数,可以有效地控制单次API请求返回的数据量。如果不需要获取大量数据,应尽量减小limit
参数的值,以减少服务器的负担和网络传输的开销。避免一次性请求过多的数据,特别是在高频交易或实时数据获取的场景中。 -
在进行分页查询时,利用
after
和before
参数可以高效地遍历大量数据。after
参数用于获取指定ID之后的数据,before
参数用于获取指定ID之前的数据。通过循环调用API,并根据返回结果中的ID值更新after
或before
参数,可以实现数据的逐页获取。这种方式比使用offset
参数更加高效,特别是在数据量非常大的情况下。注意处理边界情况,例如第一页和最后一页的判断。
高级用法
-
时间范围查询:
通过
begin
和end
参数,您可以精确地查询指定时间范围内的交易历史记录。begin
和end
参数通常以 Unix 时间戳(秒)或 ISO 8601 格式表示。这对于税务申报、财务审计以及分析特定时间段内的交易活动模式非常有价值,帮助您生成特定时间段的交易报告,例如月度或年度报告。 -
指定订单查询:
通过
orderId
参数,可以查询特定订单的成交明细。 这使得您可以追溯单个订单的完整执行过程,包括成交价格、数量、手续费等详细信息。对于订单执行情况的复核和问题排查,此功能至关重要,并允许您针对特定订单进行精确的盈亏计算。 -
分页处理:
当交易历史数据量非常庞大时,一次性获取所有数据可能会导致性能问题。因此,需要进行分页处理。 可以使用
after
和before
参数来获取下一页或上一页的数据。 每次请求返回结果的最后一条数据的tradeId
作为下一次请求的after
参数,返回结果的第一条数据的tradeId
作为上一次请求的before
参数。 这允许您逐步加载和处理大量交易数据,而不会对系统资源造成过大压力。 为了提升用户体验,应在前端界面上提供分页导航功能。 同时,需要注意处理边界情况,例如到达数据末尾或起始位置时的分页逻辑。 - 错误处理: 在实际应用中,与交易所API交互时可能会遇到各种错误情况,例如网络连接中断、API 调用频率限制(Rate Limiting)、无效的 API 密钥、服务器内部错误等。 为了保证应用程序的健壮性和稳定性,必须添加完善的错误处理机制。 使用 try-except 块捕获可能出现的异常,并进行适当的处理,例如重试请求(针对间歇性网络错误)、暂停请求(达到 API 频率限制时)或记录错误日志以便后续分析。 实施指数退避策略可以有效地缓解 API 调用频率限制的影响。 同时,提供友好的错误提示信息给用户,帮助他们理解问题并采取相应的行动。
欧易API查询交易历史功能是量化交易和数据分析的重要工具。通过本文的介绍,读者应该对如何使用该功能有了更深入的了解。在实际应用中,需要根据具体的需求选择合适的接口,并结合实际情况进行优化。掌握这些技巧,可以更有效地利用欧易API,提升交易效率和数据分析能力。