OKX API 使用教程
简介
OKX API 是一套功能全面的应用程序编程接口,专为满足开发者对加密货币交易及相关操作的编程化需求而设计。它提供强大的工具集,赋能开发者以自动化的方式安全高效地访问和操作 OKX 数字资产交易所的各项核心功能。借助 OKX API,用户可以摆脱手动操作的限制,实现交易策略的自动化执行、实时市场数据的精准获取、账户资金的精细化管理,以及其他更高级的自定义操作。
本教程旨在提供一份详尽的 OKX API 使用指南,从零开始引导开发者快速上手。我们将深入讲解如何完成 API 身份验证,确保安全访问;详细介绍常用 API 接口,包括现货交易、合约交易、资金划转、市场数据查询等,并提供清晰的参数说明和使用示例;还将提供不同编程语言的示例代码,帮助开发者更好地理解和应用 API,从而构建自己的交易机器人、数据分析工具或量化交易平台。
本教程将重点关注以下几个方面:
- 身份验证: 详细讲解如何生成 API 密钥,设置访问权限,并通过正确的身份验证方法连接到 OKX API。
- 常用接口: 深入剖析现货交易、合约交易、资金账户、市场数据等常用 API 接口,提供参数说明、请求示例和响应示例。
- 错误处理: 介绍如何处理 API 返回的错误信息,并提供常见的错误代码及解决方案。
- 速率限制: 解释 OKX API 的速率限制机制,并提供最佳实践,避免触发限制。
- 示例代码: 提供多种编程语言(如 Python、Java、Node.js)的示例代码,帮助开发者快速集成 OKX API 到自己的项目中。
准备工作
在使用 OKX API 之前,为了确保顺利集成并保障账户安全,您需要完成以下准备工作:
- 注册 OKX 账户: 如果您还没有 OKX 账户,请访问 OKX 官方网站,按照指引完成注册流程。请务必使用真实有效的身份信息进行注册,并完成 KYC (了解您的客户) 认证,以便解锁更高级别的 API 使用权限和交易功能。
-
创建 API 密钥:
登录您的 OKX 账户,导航至 API 管理页面。该页面通常位于用户个人资料、账户安全或开发者中心等位置。在此页面上,您可以创建新的 API 密钥。创建过程中,务必启用您需要的 API 权限,例如交易、提现、查询等,并仔细阅读每项权限的说明,避免赋予不必要的权限。强烈建议开启IP限制,绑定常用IP,从而增强API密钥的安全性。创建完成后,请务必妥善保管您的 API 密钥,尤其是
secretKey
,绝对不要泄露给任何人,包括 OKX 官方人员。API 密钥通常包含以下三个关键部分:-
apiKey
:用于身份验证的公钥,类似于用户名,用于标识您的账户。 -
secretKey
:用于对 API 请求进行签名的私钥,类似于密码,用于证明请求的合法性。务必将其视为最高机密,如果怀疑泄露,请立即撤销并重新生成新的 API 密钥。 -
passphrase
:创建 API 密钥时设置的可选密码,用于某些需要更高安全性的操作,例如提现或修改账户设置。如果设置了passphrase
,请务必记住,并在需要时正确提供。
-
- 选择编程语言和 SDK: 根据您的编程技能、项目需求和目标平台的兼容性,选择合适的编程语言和 OKX API SDK。OKX 官方或活跃的开源社区通常会提供多种编程语言的 SDK,例如 Python (okx-python)、Java (okx-java)、JavaScript (okx-js) 等。这些 SDK 封装了 API 请求的细节,简化了开发过程。如果您不想使用 SDK,也可以选择直接通过 HTTP 请求与 API 交互,但需要自行处理 API 签名、请求构建和错误处理等细节。在使用 SDK 时,请注意及时更新至最新版本,以获得最新的功能和安全修复。
身份验证
OKX API采用高级的身份验证措施,使用基于HMAC-SHA256的签名机制,确保所有API请求的安全性和完整性。HMAC(Hash-based Message Authentication Code)是一种利用哈希函数和密钥的消息认证码算法,SHA256 (Secure Hash Algorithm 256-bit) 是其使用的哈希算法。每个API请求都必须包含一个精心构造的签名,这个签名作为验证请求来源以及数据完整性的关键要素,防止恶意篡改或伪造请求。
构建API签名通常涉及以下步骤:需要准备好你的API密钥(API Key)、密钥(Secret Key)以及可选的密码(Passphrase,如果已设置)。然后,根据API文档的具体要求,将请求参数按照特定顺序进行排列和格式化,形成一个待签名的字符串。接下来,使用你的Secret Key作为密钥,对待签名字符串应用HMAC-SHA256算法进行哈希运算。最终生成的哈希值,即为API签名,它会附加到你的API请求头中,供OKX服务器进行验证。签名验证的失败会导致API请求被拒绝,从而保障账户安全。为确保签名正确生成,请务必仔细阅读OKX API文档,遵循其签名规则和格式要求,并使用经过验证的HMAC-SHA256库进行签名计算。密钥和密码务必妥善保管,避免泄露。
签名生成步骤:
-
构建预签名字符串:
预签名字符串是用于生成 API 请求签名的关键输入,它确保了请求的完整性和真实性。该字符串由多个部分组成,并通过换行符
\n
分隔。必须严格按照指定的顺序和格式构建预签名字符串。-
HTTP 方法 (GET 或 POST):
明确指定所使用的 HTTP 方法。这通常是
GET
用于检索数据,或POST
用于创建、更新数据。确保大小写与实际请求一致。 -
请求路径:
这是 API 端点的路径,它定义了您要访问的特定资源或功能。例如,
/api/v5/account/balance
用于获取账户余额,/api/v5/trade/order
用于创建交易订单。请仔细核对路径的准确性,包括斜杠和大小写。 -
请求体:
对于
POST
请求,请求体通常包含 JSON 格式的数据,用于指定要创建或更新的资源的信息。例如,创建订单时,请求体可能包含交易对、买卖方向、订单类型和数量等信息。对于GET
请求,请求体应为空字符串。务必将请求体格式化为有效的 JSON 字符串,并确保其内容与 API 的要求一致。 - 时间戳: 这是指当前 Unix 时间戳,表示自 UTC 时间 1970 年 1 月 1 日 0 时 0 分 0 秒起至现在的总秒数。使用准确的时间戳是防止重放攻击的关键措施。请确保时间戳的精度为秒,并将其转换为字符串格式。
示例:
GET 请求示例:
GET /api/v5/account/balance 1678888888
POST 请求示例(包含请求体):
POST /api/v5/trade/order {"instId":"BTC-USDT","side":"buy","ordType":"market","sz":"0.1"} 1678888888
-
HTTP 方法 (GET 或 POST):
明确指定所使用的 HTTP 方法。这通常是
-
计算 HMAC-SHA256 签名:
使用您的
secretKey
作为密钥,对预签名字符串进行 HMAC-SHA256 计算。HMAC-SHA256 是一种加密哈希函数,它结合了密钥和数据来生成唯一的签名,从而验证数据的完整性和来源。代码示例(Python):
import hmac import hashlib import base64 import time secret_key = "YOUR_SECRET_KEY" # 替换为您的 secretKey prehash = "GET\n/api/v5/account/balance\n\n" + str(int(time.time())) digest = hmac.new(secret_key.encode('utf-8'), prehash.encode('utf-8'), hashlib.sha256).digest() signature = base64.b64encode(digest).decode() print(signature)
代码解释:
-
secret_key = "YOUR_SECRET_KEY"
:将YOUR_SECRET_KEY
替换为您在交易所或 API 平台获得的真实密钥。请务必妥善保管您的密钥,避免泄露。 -
prehash = "GET\n/api/v5/account/balance\n\n" + str(int(time.time()))
:构建预签名字符串,包括 HTTP 方法、请求路径、空请求体(对于 GET 请求)和当前时间戳。 -
digest = hmac.new(secret_key.encode('utf-8'), prehash.encode('utf-8'), hashlib.sha256).digest()
:使用hmac.new()
函数,以您的密钥和预签名字符串作为输入,计算 HMAC-SHA256 哈希值。请确保使用 UTF-8 编码对密钥和预签名字符串进行编码。 -
signature = base64.b64encode(digest).decode()
:将计算得到的哈希值进行 Base64 编码,以便在 HTTP 请求头中传输。
-
-
添加请求头:
将以下 HTTP 请求头添加到您的 API 请求中,以便服务器验证请求的身份和完整性。
-
OK-ACCESS-KEY
:您的apiKey
,用于标识您的账户。 -
OK-ACCESS-SIGN
:上一步生成的签名,用于验证请求的完整性和真实性。 -
OK-ACCESS-TIMESTAMP
:当前 Unix 时间戳(以秒为单位),与预签名字符串中使用的时间戳一致。 -
OK-ACCESS-PASSPHRASE
:您的passphrase
(如果设置了),用于增强账户安全性。如果您没有设置 passphrase,则无需添加此请求头。 -
Content-Type
:application/
(对于 POST 请求),指示请求体的格式为 JSON。对于 GET 请求,可以省略此请求头。
注意: 请确保所有请求头的值都正确无误,并且符合 API 的要求。错误的请求头会导致 API 请求失败。
-
常用 API 接口
以下是一些常用的 OKX API 接口,这些接口允许开发者以编程方式访问 OKX 交易所的数据和功能,从而构建交易机器人、数据分析工具等应用。
-
获取账户余额:
/api/v5/account/balance
(GET)- 描述:获取您的账户余额信息,包括可用余额、冻结余额等。该接口允许您查询不同币种的账户信息。
-
参数:
-
ccy
(可选,指定要查询的币种,例如 "BTC"。如果不指定,则返回所有币种的余额。)
-
示例:使用 Python 和 requests 库,您可以构建以下请求来获取账户余额。注意替换示例中的占位符 (
YOUR_API_KEY
,YOUR_SECRET_KEY
,YOUR_PASSPHRASE
) 为您的实际 API 密钥。import requests import time import hmac import hashlib import base64 import api_key = "YOUR_API_KEY" # 替换为您的 apiKey secret_key = "YOUR_SECRET_KEY" # 替换为您的 secretKey passphrase = "YOUR_PASSPHRASE" # 替换为您的 passphrase url = "https://www.okx.com/api/v5/account/balance" method = "GET" timestamp = str(int(time.time())) prehash = method + "\n" + "/api/v5/account/balance" + "\n" + "\n" + timestamp digest = hmac.new(secret_key.encode('utf-8'), prehash.encode('utf-8'), hashlib.sha256).digest() signature = base64.b64encode(digest).decode() headers = { "OK-ACCESS-KEY": api_key, "OK-ACCESS-SIGN": signature, "OK-ACCESS-TIMESTAMP": timestamp, "OK-ACCESS-PASSPHRASE": passphrase, "Content-Type": "application/" } response = requests.get(url, headers=headers) print(response.())
-
下单:
/api/v5/trade/order
(POST)- 描述:创建一个新的交易订单。此接口支持各种订单类型和参数,允许您执行买入或卖出操作。需要注意的是,务必仔细检查订单参数,避免造成不必要的损失。
-
参数:
-
instId
: 交易对 (例如 "BTC-USDT") -
side
: 交易方向 ("buy" 或 "sell") -
ordType
: 订单类型 ("market"、"limit"、"post_only"、"fok"、"ioc" 等) 不同的订单类型有不同的执行方式和适用场景。 -
sz
: 订单数量 (以基础货币计价) -
px
: 价格 (仅限价单) 限价单的价格,市价单不需要此参数。 -
tdMode
:交易模式,"cash"表示币币/现货,"cross"表示全仓杠杆,"isolated"表示逐仓杠杆。 - 其他参数:可以参考OKX API文档,根据您的交易策略调整其他参数。
-
示例:以下 Python 代码展示了如何使用 API 创建一个市价买单。同样,请替换占位符为您的实际 API 密钥。
import requests import time import hmac import hashlib import base64 import api_key = "YOUR_API_KEY" # 替换为您的 apiKey secret_key = "YOUR_SECRET_KEY" # 替换为您的 secretKey passphrase = "YOUR_PASSPHRASE" # 替换为您的 passphrase url = "https://www.okx.com/api/v5/trade/order" method = "POST" timestamp = str(int(time.time())) data = { "instId": "BTC-USDT", "side": "buy", "ordType": "market", "sz": "0.01", "tdMode": "cash" # 设置为现货交易 } body = .dumps(data) prehash = method + "\n" + "/api/v5/trade/order" + "\n" + body + "\n" + timestamp digest = hmac.new(secret_key.encode('utf-8'), prehash.encode('utf-8'), hashlib.sha256).digest() signature = base64.b64encode(digest).decode() headers = { "OK-ACCESS-KEY": api_key, "OK-ACCESS-SIGN": signature, "OK-ACCESS-TIMESTAMP": timestamp, "OK-ACCESS-PASSPHRASE": passphrase, "Content-Type": "application/" # Important: use application/ } response = requests.post(url, headers=headers, data=body) print(response.())
-
获取市场行情:
/api/v5/market/ticker
(GET)- 描述:获取指定交易对的最新市场行情信息,包括最新成交价、最高价、最低价、成交量等。该接口是进行交易决策的重要参考。
-
参数:
instId
(交易对,例如 "BTC-USDT")
-
获取历史K线数据:
/api/v5/market/history-candles
(GET)- 描述:获取指定交易对的历史 K 线数据,用于技术分析和趋势预测。K 线数据是了解市场走势的重要工具。
-
参数:
instId
(交易对,例如 "BTC-USDT")、bar
(K 线周期,例如 "1m"、"5m"、"1h"、"1d" 等。不同的周期代表不同的时间粒度。)、limit
(返回的数据条数,默认为100,最大值为100)。
错误处理
在使用 OKX API 进行交易和数据查询时,开发者不可避免地会遇到各种各样的错误情况。为了确保应用程序的稳定性和可靠性,妥善处理这些错误至关重要。OKX API 的响应信息通常包含一个
code
字段以及一个
msg
字段,
code
字段用于指示具体的错误类型,而
msg
字段则提供关于错误的详细描述,方便开发者快速定位问题。
以下列出一些常见的 OKX API 错误代码及其含义,以及应对这些错误的建议措施:
-
60001
:参数错误。此错误表明请求中包含无效的参数。开发者应仔细检查请求参数,确保其类型、格式和取值范围符合 API 文档的要求。例如,检查必填参数是否缺失,数值参数是否为有效数字,字符串参数是否符合长度限制等。 -
60010
:签名验证失败。此错误表示 API 请求的签名验证未通过。开发者需要检查用于生成签名的 API Key、Secret Key 是否正确配置,以及签名算法是否与 OKX API 的要求一致。还需要确保签名的生成过程中使用了正确的请求参数和时间戳。检查时间戳的有效性,确保其在有效的时间窗口内。 -
51001
:账户余额不足。当进行交易操作时,如果账户中可用于交易的余额不足以支付交易所需的资金,就会返回此错误。开发者应在发起交易请求前,先查询账户余额,并根据账户余额情况调整交易数量。用户也应该收到余额不足的提示。 -
58005
:交易对不存在。此错误表示请求中指定的交易对在 OKX 交易所中不存在。开发者需要检查交易对的名称是否正确,并确保该交易对在 OKX 交易所中可用。注意区分大小写和分隔符。 -
52001
:下单失败。可能的原因包括价格超出限价范围、交易数量低于最小交易数量等。检查下单价格和数量是否符合交易所的规则。 -
52002
:撤单失败。可能由于订单已成交、已撤销或不存在。检查订单状态。 -
400
:请求错误。通常表示客户端发送的请求格式不正确,例如请求头不完整。 -
429
: 请求过于频繁,触发限流。减少请求频率,或者使用更高级别的API密钥以获得更高的请求限制。 -
500
:服务器内部错误。这通常是 OKX 交易所自身的问题,开发者可以稍后重试。
在编写代码时,务必实现完善的错误处理机制。以下是一些建议:
- 使用 try-except 块(或其他语言的等效机制)来捕获 API 调用可能抛出的异常。
- 记录详细的错误日志,包括错误代码、错误信息、请求参数和时间戳。这有助于调试和排查问题。
- 根据不同的错误类型,采取相应的处理措施。例如,对于参数错误,可以提示用户修改输入;对于账户余额不足,可以提示用户充值;对于签名验证失败,可以重新生成签名。
- 对于一些可恢复的错误,例如服务器内部错误或请求过于频繁,可以尝试重试请求。可以使用指数退避算法来避免瞬间大量的重试请求导致系统过载。
- 在用户界面上显示友好的错误提示信息,帮助用户理解问题并采取正确的操作。
通过认真对待错误处理,开发者可以构建出更加健壮和可靠的应用程序,为用户提供更好的使用体验。
安全注意事项
-
保护您的 API 密钥:
secretKey
是访问您OKX账户的钥匙,务必妥善保管。永远不要通过任何渠道泄露您的secretKey
给任何人,包括OKX官方工作人员。不要将其存储在不安全的设备或位置,例如公共代码仓库、聊天记录、邮件或任何未加密的云存储服务。定期轮换您的API密钥,增加账户安全性。 - 使用安全的网络连接: 所有与OKX API的交互都应该通过HTTPS协议进行,HTTPS协议能够加密您的API请求和响应,防止中间人攻击和数据窃听。避免在使用公共Wi-Fi等不安全网络环境下进行API调用,以防止敏感信息泄露。请确保您的代码库或工具强制使用HTTPS连接。
- 限制 API 密钥权限: 在OKX创建API密钥时,仔细评估您的应用或脚本真正需要的权限,仅授予最小必要的权限。例如,如果您的应用只需要读取市场数据,则无需授予交易权限或提币权限。这样即使API密钥泄露,攻击者也无法执行超出授权范围的操作。利用子账户功能可以进一步隔离不同应用的权限。
- 监控 API 使用情况: 定期监控您的API使用量、请求频率和响应时间。OKX会提供API使用情况的统计信息。如果发现任何异常行为,例如突然增加的请求量、未授权的交易尝试或来自未知IP地址的请求,立即采取行动,例如禁用API密钥、检查您的代码或联系OKX支持。设置警报系统,以便在检测到异常活动时收到通知。
- 阅读官方文档: OKX官方API文档是您使用API的权威指南。务必仔细阅读并理解文档中的说明、参数、限制和最佳实践。关注OKX的公告和更新,及时了解API的最新变化、新增功能和安全建议。OKX API可能会定期更新,以修复漏洞、改进性能或添加新功能。