欧易API交易历史查询:高效追踪与实战指南【2024最新】

时间:2025-03-07 阅读数:61人阅读

欧易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,提升交易效率和数据分析能力。