欧易交易所 API 使用方法
欧易(OKX)交易所提供了一套强大的应用程序编程接口 (API),允许开发者以编程方式访问交易所的数据和功能。这使得用户能够创建自己的交易机器人、自动化交易策略、进行数据分析以及集成欧易的功能到第三方应用程序中。本文将详细介绍欧易交易所 API 的使用方法,涵盖账户创建、API 密钥申请、API 调用方式以及常见问题等方面。
一、准备工作:注册账户与申请 API 密钥
在使用欧易 API 之前,必须完成账户注册、KYC认证和API密钥的申请与配置。 这些准备工作是访问欧易交易所数据和执行交易操作的基础。
- 注册欧易账户: 如果尚未拥有欧易账户,请访问欧易官方网站 (okx.com) 进行注册。注册时,需要提供常用的邮箱地址或手机号码,并设置安全的登录密码。
- 身份验证 (KYC): 完成账户注册后,务必进行身份验证 (KYC)。KYC 验证分为不同等级,更高级别的验证通常能解锁更高的 API 访问权限和更宽松的交易限额。根据您的需求选择适合的KYC等级进行验证。
- 启用API: 成功登录欧易账户后,进入用户中心或账户设置页面,查找 "API" 或 "API Management" 选项。在大多数交易所中,此选项通常位于安全设置或账户设置的子菜单下。
- 创建 API 密钥: 在 API 管理页面,可以创建新的 API 密钥。每个 API 密钥都应根据其用途进行命名,以便于管理和跟踪。创建密钥时,必须设置以下关键参数:
- API 名称: 为 API 密钥设置一个清晰且具有描述性的名称,例如 "MyTradingBot_v1" 或 "PortfolioTracker"。这有助于区分不同的 API 密钥,尤其是在您拥有多个应用程序或策略时。
- Passphrase: Passphrase 是 API 密钥的额外安全层,用于加密签名请求。务必选择一个强密码,并将其安全存储。Passphrase 在生成API请求签名时,和Secret Key配合使用,如果遗忘需要重新生成API Key。
- 权限设置: 这是创建 API 密钥过程中至关重要的一步。欧易 API 提供了多种权限级别,必须根据应用程序的具体需求选择最小权限原则。常见的权限类型包括:
- 只读 (Read Only): 允许访问公开市场数据,例如实时行情、历史K线数据、交易对信息、订单簿深度等。此权限不允许进行任何交易操作。
- 交易 (Trade): 允许进行下单、撤单、修改订单等交易操作。请谨慎授予此权限,并确保应用程序具有完善的风控机制。
- 资金 (Funds): 允许进行提现、转账、充值等资金操作。此权限具有最高的风险,应仅在必要时授予,并采取严格的安全措施。
- IP限制 (IP Address Whitelist): 为了增强安全性,可以限制 API 密钥只能从特定的 IP 地址访问。这意味着只有来自指定 IP 地址的请求才会被授权。如果不确定应用程序的 IP 地址,可以暂时留空,但在生产环境中强烈建议配置 IP 白名单,限制API密钥的使用范围。可以使用如VPN或者云服务器等方式,获取固定IP地址。
- 获取 API 密钥信息: 成功创建 API 密钥后,将获得以下重要信息:
- API Key: API Key 是用于识别您的身份的唯一标识符,类似于用户名。每个 API Key 对应一个账户,用于验证API请求的合法性。
- Secret Key: Secret Key 是用于生成请求签名的私钥,类似于密码。必须妥善保管 Secret Key,绝对不能泄露给他人。
强烈建议仅授予应用程序所需的最低权限,降低潜在的安全风险。例如,如果应用程序仅用于监控市场行情,则只需授予 "只读" 权限,切勿授予不必要的交易或资金权限。
务必安全存储 API Key、Secret Key 和 Passphrase。如果密钥泄露,立即撤销该 API 密钥并创建一个新的密钥。启用二次验证 (2FA) 可以提高账户的整体安全性。定期审查 API 密钥的权限和使用情况,及时撤销不再使用的密钥。
二、API 调用方式
欧易 API 支持 REST 和 WebSocket 两种调用方式,分别满足不同的数据获取和交易需求。REST API 适用于对数据准确性要求高,实时性要求不高的场景,而 WebSocket API 则适用于需要实时数据的场景,如高频交易。
-
REST API: REST API 采用标准的 HTTP 请求方式,允许开发者使用各种编程语言和 HTTP 客户端库进行调用。欧易 REST API 采用 JSON 格式作为数据交换的载体,保证数据传输的通用性和易解析性。
-
API Endpoint: 欧易 REST API 的根 endpoint 是
https://www.okx.com/api/v5
。所有 API 请求都必须以该 endpoint 作为起始地址。使用正确的 endpoint 是成功调用 API 的前提。 -
HTTP 方法: 欧易 REST API 使用不同的 HTTP 方法来执行不同的操作,每个方法对应着不同的数据操作语义。
-
GET
: 用于从服务器获取数据,不会对服务器数据产生修改。常用于查询市场行情、账户信息等。 -
POST
: 用于向服务器提交数据,常用于创建新的资源,例如下单、创建提币请求等。 -
PUT
: 用于更新服务器上已存在的资源,需要提供完整的资源信息。常用于修改订单等。 -
DELETE
: 用于删除服务器上的资源。常用于撤销订单、删除地址等。
-
-
请求头 (Headers): 在 HTTP 请求头中包含必要的信息,用于身份验证、指定数据格式等。
-
OK-ACCESS-KEY
: 您的 API Key,用于标识您的账户。请妥善保管您的 API Key,防止泄露。 -
OK-ACCESS-SIGN
: 您的请求签名,用于验证请求的真实性和完整性。签名可以防止请求被篡改。 -
OK-ACCESS-TIMESTAMP
: 当前时间戳(UTC 秒数),用于防止重放攻击。时间戳的有效性通常有时间窗口限制。 -
OK-ACCESS-PASSPHRASE
: 您的 Passphrase,用于增强安全性。Passphrase 通常用于加密敏感数据。 -
Content-Type
:application/
(如果请求体包含 JSON 数据)。指定请求体的格式,服务器会根据该类型进行解析。
-
-
请求签名 (Signature): 请求签名通过加密算法,对请求的关键信息进行加密,保证请求的安全性。
signature = base64(HMAC-SHA256(timestamp + method + requestPath + body, secretKey))
计算签名的过程如下:
-
timestamp
: 当前时间戳(UTC 秒数)。保证请求的时效性。 -
method
: HTTP 方法(例如GET
、POST
)。确保服务器知道请求的操作类型。 -
requestPath
: API 请求的路径(例如/api/v5/market/tickers
)。指定请求的具体 API 接口。 -
body
: 请求体(如果请求体包含 JSON 数据)。包含了请求的具体参数。 -
secretKey
: 您的 Secret Key,用于加密计算签名。必须保密,切勿泄露。
-
-
API Endpoint: 欧易 REST API 的根 endpoint 是
-
WebSocket API: WebSocket API 提供了双向的实时数据流通道,客户端和服务器可以实时地发送和接收数据。适用于对实时性要求高的场景,例如行情推送、订单更新等。
-
WebSocket Endpoint: 欧易 WebSocket API 的 endpoint 分为公共频道和私有频道。
wss://ws.okx.com:8443/ws/v5/public
(公共频道) 提供无需身份验证的公开数据,例如市场行情。wss://ws.okx.com:8443/ws/v5/private
(私有频道) 提供需要身份验证的私有数据,例如账户信息和订单信息。 -
订阅频道: 连接到 WebSocket API 后,需要订阅感兴趣的频道才能接收数据。每个频道对应着特定的数据类型。订阅通过发送 JSON 消息实现。
{ "op": "subscribe", "args": [ { "channel": "tickers", "instId": "BTC-USDT" } ] }
在这个例子中,客户端订阅了
tickers
频道,并且指定了instId
为BTC-USDT
,表示订阅 BTC-USDT 的市场行情数据。 频道名称和instId
需要根据 API 文档进行正确设置。 - 身份验证: 访问私有频道需要进行身份验证,确保只有授权用户才能访问敏感数据。身份验证的过程与 REST API 类似,需要提供 API Key、签名和时间戳等信息,并通过 JSON 消息发送到服务器。签名算法与 REST API 保持一致。
-
WebSocket Endpoint: 欧易 WebSocket API 的 endpoint 分为公共频道和私有频道。
三、常见 API 调用示例
以下是一些常见的欧易 API 调用示例,使用 Python 语言和
requests
库。 这些示例展示了如何通过 API 获取市场数据和执行交易操作,为开发者提供快速入门的参考。务必替换示例代码中的占位符 (例如
YOUR_API_KEY
,
YOUR_SECRET_KEY
,
YOUR_PASSPHRASE
) 为您自己的实际 API 密钥和密码。
- 获取 BTC-USDT 的市场行情:
-
api_key
,secret_key
,passphrase
: 需要替换成您在OKX交易所申请到的API Key,Secret Key和Passphrase。 -
generate_signature
函数:用于生成API请求的签名,以确保请求的安全性。签名过程包括将时间戳、请求方法、请求路径和请求体组合成一个字符串,然后使用 Secret Key 进行 HMAC-SHA256 加密,最后进行 Base64 编码。 -
timestamp
:当前时间戳,单位为秒。 -
method
:请求方法,这里是 "GET"。 -
request_path
:API 请求的路径,这里是获取 BTC-USDT 市场行情的接口。 -
body
:请求体,对于 GET 请求,通常为空字符串。 -
headers
:包含 API Key、签名、时间戳和 Passphrase 的请求头。Content-Type
被设置为application/
, 虽然这里实际上没有发送JSON数据,但为了保持一致性和避免潜在的问题,建议保留此设置。 -
url
:API 请求的完整 URL。 -
response = requests.get(url, headers=headers)
:发送 GET 请求并获取响应。 -
print(response.())
:打印响应的 JSON 数据。 - 下单 (限价单):
-
api_key
,secret_key
,passphrase
: 同样需要替换成您自己的API Key,Secret Key和Passphrase。 -
generate_signature
函数:与获取市场行情示例中的签名函数相同,用于生成API请求的签名。 -
timestamp
:当前时间戳,单位为秒。 -
method
:请求方法,这里是 "POST"。 POST方法用于向服务器提交数据。 -
request_path
:API 请求的路径,这里是下单接口。 -
body
:请求体,包含下单的参数,例如:-
instId
:交易对,这里是 "BTC-USDT"。 -
tdMode
:交易模式,"cash" 表示现货交易。 -
side
:交易方向,"buy" 表示买入。 -
ordType
:订单类型,"limit" 表示限价单。 -
sz
:下单数量,这里是 0.001 BTC。 -
px
:下单价格,这里是 20000 USDT。
-
-
headers
:包含 API Key、签名、时间戳和 Passphrase 的请求头。Content-Type
设置为application/
,因为请求体是一个 JSON 字符串。 -
url
:API 请求的完整 URL。 -
response = requests.post(url, headers=headers, data=body)
:发送 POST 请求并获取响应。data=body
将JSON格式的请求体发送到服务器。 -
print(response.())
:打印响应的 JSON 数据。 响应数据会包含订单ID等信息,可用于后续查询订单状态。
此示例演示如何获取 BTC-USDT 交易对的最新市场行情数据,包括最新成交价、买一价、卖一价、24 小时成交量等信息。 通过调用
/api/v5/market/tickers
接口,可以实时监控市场动态。
import requests
import time
import hmac
import hashlib
import base64
import
api_key = "YOUR_API_KEY"
secret_key = "YOUR_SECRET_KEY"
passphrase = "YOUR_PASSPHRASE"
def generate_signature(timestamp, method, request_path, body):
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("utf-8")
timestamp = str(int(time.time()))
method = "GET"
request_path = "/api/v5/market/tickers?instId=BTC-USDT"
body = ""
signature = generate_signature(timestamp, method, request_path, body)
headers = {
"OK-ACCESS-KEY": api_key,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-TIMESTAMP": timestamp,
"OK-ACCESS-PASSPHRASE": passphrase,
"Content-Type": "application/"
}
url = "https://www.okx.com/api/v5/market/tickers?instId=BTC-USDT"
response = requests.get(url, headers=headers)
print(response.())
代码解释:
此示例演示如何通过 API 下一个限价单。 限价单是指用户指定价格和数量,只有当市场价格达到或优于指定价格时才会成交的订单。 通过调用
/api/v5/trade/order
接口,可以实现自动交易策略。
import requests
import time
import hmac
import hashlib
import base64
import
api_key = "YOUR_API_KEY"
secret_key = "YOUR_SECRET_KEY"
passphrase = "YOUR_PASSPHRASE"
def generate_signature(timestamp, method, request_path, body):
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("utf-8")
timestamp = str(int(time.time()))
method = "POST"
request_path = "/api/v5/trade/order"
body = .dumps({
"instId": "BTC-USDT",
"tdMode": "cash",
"side": "buy",
"ordType": "limit",
"sz": "0.001",
"px": "20000"
})
signature = generate_signature(timestamp, method, request_path, body)
headers = {
"OK-ACCESS-KEY": api_key,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-TIMESTAMP": timestamp,
"OK-ACCESS-PASSPHRASE": passphrase,
"Content-Type": "application/"
}
url = "https://www.okx.com/api/v5/trade/order"
response = requests.post(url, headers=headers, data=body)
print(response.())
代码解释:
四、错误处理
在使用欧易API进行交易或数据查询时,可能会遇到各种错误。欧易API会返回不同的HTTP状态码和JSON格式的错误信息,开发者需要根据这些信息来正确地处理错误,保证程序的稳定性和可靠性。
常见的错误代码包括:
-
400
: 请求参数错误。这表示客户端发送的请求中包含了无效的参数,例如参数格式错误、缺少必要参数或参数值超出允许范围。您需要仔细检查请求参数,确保符合API文档的要求。详细的错误信息通常会包含在返回的JSON中,说明哪个参数存在问题。 -
401
: 身份验证失败。这表示API密钥无效、过期或没有权限访问所请求的资源。请确保您使用的API密钥正确,并且已经启用了相应的权限。如果您最近更新了API密钥,请确保在您的应用程序中也进行了相应的更新。检查您的IP地址是否在API密钥的允许IP列表中。 -
403
: 禁止访问。通常由于IP地址未添加到白名单导致,或您的账户权限不足,无法访问特定接口。 -
429
: 超过请求频率限制。为了保护API的稳定性和可用性,欧易API对请求频率进行了限制。如果您在短时间内发送了过多的请求,就会收到此错误。您可以通过减少请求频率、使用批量请求或实现请求队列来解决此问题。某些接口可能拥有不同的限速策略,需要仔细阅读API文档。 -
500
: 服务器内部错误。这表示欧易服务器内部发生了未知的错误。这种错误通常是临时的,您可以稍后重试。如果错误持续发生,请联系欧易的技术支持。 -
503
: 服务不可用。表明欧易服务器目前无法处理该请求,通常是由于服务器维护或过载引起。建议稍后重试。
除了上述常见的错误代码之外,欧易API还可能返回其他错误代码,具体取决于不同的API接口和请求情况。您可以参考欧易 API 文档了解更多详细的错误代码信息,以及针对每种错误代码的处理建议。API文档通常会提供更详细的错误描述、错误示例和解决方案,帮助您更好地理解和处理API错误。同时,建议在您的应用程序中添加适当的错误处理机制,例如日志记录、重试机制和异常处理,以便更好地应对API错误。
五、API 文档
欧易交易所提供了一套全面的应用程序编程接口(API),允许开发者以编程方式访问和管理其平台上的各种功能。这些功能包括但不限于交易下单、查询账户信息、获取市场数据、管理资金划转等等。 为了帮助开发者更好地理解和使用这些 API,欧易提供了详细的 API 文档,您可以在欧易官方网站上的“开发者中心”或相关页面找到最新的 API 文档。
API 文档是开发者使用欧易 API 的重要参考资料。它包含了所有可用 API 接口的详细说明,针对每个接口都提供了清晰的请求示例、参数解释和响应格式。具体来说,文档详细描述了每个 API 接口的用途、HTTP 请求方法(如 GET、POST、PUT、DELETE)、所需的请求参数(包括数据类型、是否必填、取值范围等)、响应数据的结构(JSON 格式或其他格式)以及可能返回的错误代码及其含义。 一些高级 API 文档可能还会包含身份验证和授权的说明,以及速率限制等相关信息。开发者应仔细阅读 API 文档,以便正确地构建 API 请求和处理 API 响应,确保应用程序能够与欧易平台进行有效的交互。