欧易交易 API 使用指南
简介
欧易(OKX)交易所为开发者提供了一套功能丰富的应用程序编程接口 (API),使他们能够通过编程方式与欧易平台进行交互。借助这些API,开发者可以实现多种功能,包括但不限于:自动化交易策略的执行、实时市场数据的深度分析、高效的账户管理,以及构建定制化的交易应用程序。本文将深入探讨如何有效利用欧易交易 API,提供一个全面的指南,内容涵盖API密钥的获取与认证、常用API接口的具体使用方法,以及在使用过程中需要特别注意的关键事项。通过本指南,开发者能够更好地理解和应用欧易API,从而优化其交易流程,提高交易效率,并拓展在加密货币领域的应用。
准备工作
在使用欧易(OKX)API 之前,为了确保顺利接入并进行安全高效的交易,你需要进行以下准备工作:
- 注册欧易账户: 如果你还没有欧易账户,这是使用 API 的首要前提。请访问欧易官方网站(OKX)并按照注册流程创建一个账户。 确保你提供的信息真实有效,并通过所有必要的验证步骤,例如邮箱验证和身份验证(KYC)。完成身份验证能够提升账户的安全性和交易权限。
-
创建 API 密钥:
成功登录欧易账户后,导航至 API 管理页面。通常可以在账户设置或安全设置中找到。 在该页面,你可以创建新的 API 密钥对,包括一个 API Key 和一个 Secret Key。 创建 API 密钥时,至关重要的是要仔细配置其权限。 欧易允许你精确控制 API 密钥可以执行的操作,例如交易(现货、合约)、查询账户信息、划转资金,以及(如果需要)提现。 强烈建议你只授予 API 密钥完成其预期任务所需的最低权限。 例如,如果你的应用程序只需要读取市场数据,则不要授予其交易或提现权限。
请务必妥善保管你的 API Key 和 Secret Key。 它们类似于你账户的密码,泄露给他人可能导致资金损失或未经授权的访问。 不要将它们存储在公共代码库(如 GitHub)或以明文形式存储在配置文件中。 考虑使用加密方法或环境变量来安全存储 API 密钥。 为了增强安全性,强烈建议你启用双因素身份验证(2FA),例如使用谷歌验证器或 Authy。 每次使用 API 密钥时,都需要输入一个动态生成的验证码,从而防止未经授权的访问。 欧易通常提供 IP 地址限制功能,允许你将 API 密钥的使用限制在特定的 IP 地址范围内,进一步提高安全性。
- 了解 API 文档: 在开始编写任何代码之前,花时间仔细阅读欧易 API 文档至关重要。 欧易 API 文档是使用 API 的指南,其中包含了所有可用接口的详细信息,包括其功能、参数、返回值、错误代码和使用限制。 文档通常以 REST API 或 WebSocket API 的形式提供。 REST API 适用于请求/响应类型的交互,而 WebSocket API 适用于实时数据流,例如实时市场行情。 仔细研究文档中的示例代码,了解如何构造 API 请求,如何处理响应,以及如何处理错误。 特别注意 API 的频率限制,避免因频繁请求而被暂时或永久禁止访问。 欧易通常会对不同的 API 接口设置不同的频率限制,超出限制的请求会被拒绝。 了解这些限制并相应地设计你的应用程序,可以确保其稳定可靠地运行。
认证
在使用欧易 API 之前,必须对请求进行签名认证,以此确保通信的安全性及请求的合法性。欧易 API 采用行业标准的 HMAC-SHA256 算法进行签名认证,保障数据传输过程中的完整性和真实性。未经正确签名的请求将被服务器拒绝,有效防止恶意攻击。
- 构建预签名字符串 (Pre-Sign String): 将构成请求的关键要素,包括 HTTP 方法(如 GET、POST、PUT、DELETE)、规范化的请求路径(endpoint)、按字典顺序排列的请求参数(Query parameters,如有)、请求正文(request body,对于POST/PUT请求)以及 UTC 时间戳,按照特定格式连接成一个单一的字符串。 此字符串将作为后续计算签名的输入。
- 计算签名: 使用您的 API secret key(API 密钥)作为密钥,对上一步构建的预签名字符串进行 HMAC-SHA256 加密运算,从而生成请求的数字签名。此签名是对请求内容的唯一标识,确保请求在传输过程中未被篡改。不同的编程语言提供了相应的 HMAC-SHA256 算法库,可用于实现此步骤。
-
添加认证请求头:
将 API key、计算出的签名以及时间戳添加到 HTTP 请求头中。欧易 API 服务器会验证这些请求头,从而验证请求的身份和完整性。以下是欧易 API 所需的认证请求头:
-
OK-ACCESS-KEY
: 您的 API key,用于标识您的账户。务必妥善保管,切勿泄露。 -
OK-ACCESS-SIGN
: 使用 API secret key 生成的签名,用于验证请求的完整性。 -
OK-ACCESS-TIMESTAMP
: UTC 时间戳,精确到秒。该时间戳必须与服务器时间保持在一定误差范围内(通常为正负 5 秒),超出范围的请求将被视为无效,防止重放攻击。 -
OK-ACCESS-PASSPHRASE
: 创建 API 密钥时设置的 Passphrase(口令)。如果设置了 Passphrase,必须将其包含在请求头中;否则,请求可能无法通过认证。
-
不同编程语言的签名实现方式略有不同,但核心原理保持一致。以下是一个 Python 示例,演示如何计算签名:
import hashlib import hmac import base64 import time
def generate_signature(timestamp, method, request_path, body, secret_key): """ 生成 OKX API 请求的签名。 Args: timestamp (str): UTC 时间戳,单位为秒。 method (str): HTTP 方法 (GET, POST, PUT, DELETE)。 request_path (str): 请求路径,例如 /api/v5/account/balance。 body (str): 请求体,如果请求没有请求体,则为空字符串。 对于 GET 请求, 通常为空字符串 "". 对于 POST/PUT 请求,应当是 JSON 格式的字符串. secret_key (str): API secret key. Returns: str: 生成的签名。 """ 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')
示例
api_secret = "YOUR_API_SECRET"
#
替换为你的实际 API 密钥。这是访问您的加密货币交易所账户并执行操作的关键凭证,请务必妥善保管,切勿泄露给他人。密钥泄露可能导致账户资金损失。
timestamp = str(int(time.time()))
#
获取当前 Unix 时间戳,并将其转换为字符串格式。时间戳在加密货币 API 请求中用于防止重放攻击,确保请求的时效性。时间戳必须与服务器时间保持同步,否则请求可能被拒绝。
method = "GET"
#
指定 HTTP 请求方法。常见的请求方法包括 GET(获取数据)、POST(创建/更新数据)、PUT(更新数据)、DELETE(删除数据)等。此处使用 GET 方法表示要获取账户余额信息。
request_path = "/api/v5/account/balance"
#
API 请求路径,指定要访问的资源。不同的 API 端点对应不同的功能,例如获取账户余额、交易历史、下单等。
/api/v5/account/balance
通常用于获取账户余额信息。请参考交易所的官方 API 文档获取准确的请求路径。
body = ""
#
请求体,用于传递请求参数。对于 GET 请求,通常不需要请求体,因此此处为空字符串。对于 POST 或 PUT 请求,请求体通常包含 JSON 格式的数据,用于指定要创建或更新的资源信息。
signature = generate_signature(timestamp, method, request_path, body, api_secret)
#
调用
generate_signature
函数生成签名。签名用于验证请求的合法性,防止篡改。签名算法通常使用 HMAC-SHA256 等哈希算法,结合 API 密钥、时间戳、请求方法、请求路径和请求体等信息生成。
generate_signature
函数需要根据具体的交易所 API 文档实现。
print(f"Signature: {signature}")
#
打印生成的签名。在实际应用中,签名需要添加到 HTTP 请求头中,以便交易所服务器验证请求的合法性。不同的交易所可能有不同的签名方式,具体请参考其官方 API 文档。
常用 API 接口
欧易 API 提供了丰富的接口,涵盖了账户管理、现货及衍生品交易、行情数据、资金划转、用户数据等功能。开发者可以利用这些 API 构建自动化交易程序、行情分析工具以及其他与欧易平台交互的应用。以下是一些常用的 API 接口:
-
获取账户余额:
/api/v5/account/balance
用于获取你的账户余额信息。需要提供 API key、签名和时间戳进行认证,以确保请求的安全性。此接口返回包括可用余额、冻结余额等详细信息,允许用户全面了解其资产状况。- HTTP 方法:GET
-
参数:
ccy
(可选):指定要查询的币种。如果不指定,则返回所有币种的余额信息。可以一次查询多个币种,以逗号分隔,例如 "BTC,ETH,USDT"。
-
下单:
/api/v5/trade/order
用于创建新的交易订单。该接口支持多种订单类型和交易模式,允许用户灵活地执行交易策略。- HTTP 方法:POST
-
参数:
-
instId
: 交易对,例如 BTC-USDT、ETH-BTC。务必确保交易对的准确性。 -
tdMode
: 交易模式,例如 cash (现货),cross (全仓杠杆),isolated (逐仓杠杆)。选择不同的交易模式会影响风险和收益。 -
side
: 买卖方向,例如 buy (买入),sell (卖出)。 -
ordType
: 订单类型,例如 market (市价单),limit (限价单),stop (止损/止盈单),ioc (立即成交并取消剩余订单),fok (完全成交或立即取消订单)。不同类型的订单适用于不同的交易场景。 -
sz
: 交易数量。现货交易数量为币的数量,合约交易数量为合约张数。 -
px
(可选,限价单需要):订单价格。仅在限价单类型下需要指定。 -
tpTriggerPx
(可选,止盈触发价): 止盈触发价格。当市场价格达到该价格时,会触发止盈委托单。 -
tpOrdPx
(可选,止盈委托价): 止盈委托价格。止盈委托单的委托价格,通常与触发价格接近,但可以根据需要进行调整。 -
slTriggerPx
(可选,止损触发价): 止损触发价格。当市场价格达到该价格时,会触发止损委托单。 -
slOrdPx
(可选,止损委托价): 止损委托价格。止损委托单的委托价格,通常与触发价格接近,但可以根据需要进行调整。 -
tgtCcy
(可选): 仅适用于止盈止损单,用于指定触发止盈止损单后,平仓目标的币种。
-
-
取消订单:
/api/v5/trade/cancel-order
用于取消未成交的订单。及时取消未成交订单可以帮助用户管理风险。- HTTP 方法:POST
-
参数:
-
instId
: 交易对,例如 BTC-USDT。 -
ordId
: 订单 ID。可以通过"获取订单信息"接口或者"获取当前委托"接口获取。
-
-
获取订单信息:
/api/v5/trade/order
用于获取指定订单的信息。此接口可以查询订单的状态、成交量、成交均价等详细信息。- HTTP 方法:GET
-
参数:
-
instId
: 交易对,例如 BTC-USDT。 -
ordId
: 订单 ID。
-
-
获取历史K线数据:
/api/v5/market/history-candles
用于获取历史K线数据。K线数据是技术分析的重要依据。- HTTP 方法:GET
-
参数:
-
instId
: 交易对,例如 BTC-USDT -
after
(可选): 请求此时间戳之后的分页内容,Unix 时间戳,单位为毫秒。用于分页查询,获取较新的数据。 -
before
(可选): 请求此时间戳之前的分页内容,Unix 时间戳,单位为毫秒。用于分页查询,获取较旧的数据。 -
bar
(可选): K线周期,例如 1m、5m、15m、30m、1H、4H、1D、1W、1M、3M、6M、1Y。选择合适的K线周期对技术分析至关重要。 -
limit
(可选): 返回结果的数量,默认为 100,最大为 100。建议使用默认值,避免数据量过大导致请求超时。
-
注意事项
- 频率限制: 欧易 API 设有严格的频率限制机制,旨在保障系统的稳定性和公平性。如果你的请求频率超出限制,服务器将会拒绝你的请求。因此,强烈建议你仔细阅读欧易API的官方文档,了解具体的频率限制规则,并根据实际情况合理控制你的请求频率,例如采用批量请求、缓存数据或使用延时策略等方式,以避免触发频率限制。
- 错误处理: 在使用欧易 API 进行开发时,务必对 API 返回的各种错误信息进行妥善处理。API 返回的错误信息通常包含了错误码和错误描述,可以帮助你快速定位问题所在。针对不同的错误类型,你需要采取相应的措施,例如重试请求、检查参数、处理异常等,以确保程序的健壮性和稳定性。更高级的错误处理策略可以包括记录错误日志以便追踪问题,以及实施熔断机制防止错误蔓延。
- 资金安全: 使用 API 进行交易操作,虽然可以提高效率,但也存在一定的安全风险。为了保障你的资金安全,请务必谨慎操作,并采取必要的安全措施。例如,使用强密码保护你的 API 密钥,定期更换 API 密钥,限制 API 密钥的访问权限,使用 IP 白名单限制 API 的访问来源,启用双因素认证等。同时,建议你定期审查你的交易策略和代码,以防止潜在的安全漏洞。务必了解欧易提供的资金安全保护机制,并充分利用。
- API 版本: 欧易 API 会不断更新迭代,推出新的功能和修复已知的 bug。为了获得最佳的体验和安全性,强烈建议你使用最新的 API 版本。在使用新的 API 版本之前,请仔细阅读官方文档,了解新版本的特性和兼容性要求,并进行充分的测试。同时,也需要关注旧版本的 API 的弃用时间,及时进行升级,避免因使用过时的 API 而导致程序出现问题。
- 时间戳同步: 时间戳是 API 请求中一个重要的参数,用于验证请求的有效性。为了确保你的系统时间与欧易服务器时间同步,你需要使用网络时间协议 (NTP) 服务进行时间同步。如果你的系统时间与欧易服务器时间偏差过大,可能会导致签名验证失败,从而导致请求被拒绝。建议你定期检查系统时间,并确保时间同步的准确性。可以使用ntpdate命令或配置ntpd服务保持时间同步。
示例代码 (Python)
以下是一个简单的 Python 示例,展示如何使用欧易 (OKX) API 获取现货账户余额。此示例涵盖了必要的身份验证步骤,包括生成签名,以及发送经过身份验证的 API 请求。
import requests
import hmac
import hashlib
import time
import os
# 你的 API 密钥、私钥和密码短语 (从欧易获取)
API_KEY = os.environ.get("OKX_API_KEY") # 建议从环境变量中读取,更加安全
SECRET_KEY = os.environ.get("OKX_SECRET_KEY") # 建议从环境变量中读取,更加安全
PASSPHRASE = os.environ.get("OKX_PASSPHRASE") # 建议从环境变量中读取,更加安全
BASE_URL = "https://www.okx.com" # 欧易 API 的基础 URL
# 生成时间戳
def generate_timestamp():
return str(int(time.time()))
# 生成签名
def sign(timestamp, method, request_path, body=None):
message = timestamp + method + request_path + (str(body) if body else '')
mac = hmac.new(SECRET_KEY.encode('utf-8'), message.encode('utf-8'), hashlib.sha256)
d = mac.digest()
return base64.b64encode(d).decode('utf-8')
# 获取账户余额的函数
def get_account_balance():
timestamp = generate_timestamp()
method = "GET"
request_path = "/api/v5/account/balance"
# 构造请求头
headers = {
"OK-ACCESS-KEY": API_KEY,
"OK-ACCESS-SIGN": sign(timestamp, method, request_path),
"OK-ACCESS-TIMESTAMP": timestamp,
"OK-ACCESS-PASSPHRASE": PASSPHRASE,
"Content-Type": "application/"
}
url = BASE_URL + request_path
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查是否有 HTTP 错误
return response.()
except requests.exceptions.RequestException as e:
print(f"API 请求失败: {e}")
return None
# 调用函数并打印结果
if __name__ == "__main__":
balance = get_account_balance()
if balance:
print("账户余额:", balance)
else:
print("未能获取账户余额")
导入环境变量
API 密钥、API Secret 密钥和 API Passphrase 是访问 OKX 交易所 API 的凭证。强烈建议将这些敏感信息存储在环境变量中,而不是直接硬编码在代码中,以显著提高安全性。可以使用 Python 的
os
模块来获取这些环境变量。
API_KEY = os.environ.get("OKX_API_KEY")
API_SECRET = os.environ.get("OKX_SECRET_KEY")
API_PASSPHRASE = os.environ.get("OKX_PASSPHRASE")
以上代码片段分别从环境变量
OKX_API_KEY
、
OKX_SECRET_KEY
和
OKX_PASSPHRASE
中获取 API 密钥、API Secret 密钥和 API Passphrase,并将它们赋值给相应的变量。如果环境变量未设置,这些变量的值将为
None
。
以下函数用于获取 OKX 账户余额。该函数利用 API 密钥、API Secret 密钥和 API Passphrase 对请求进行签名,以确保请求的安全性。
def get_account_balance(api_key, api_secret, api_passphrase):
"""
获取 OKX 账户余额。
"""
Args:
api_key (str): API 密钥,用于身份验证。
api_secret (str): API Secret 密钥,用于生成请求签名。
api_passphrase (str): API Passphrase,用于增强安全性。
Returns:
dict: 账户余额信息,包含不同币种的余额。如果请求失败,则返回 None。
在发送 API 请求之前,需要生成一个签名。OKX 使用 HMAC-SHA256 算法对请求进行签名,以防止篡改。以下代码展示了如何生成签名:
timestamp = str(int(time.time()))
method = "GET"
request_path = "/api/v5/account/balance"
body = "" # GET 请求通常没有 body
signature = generate_signature(timestamp, method, request_path, body, api_secret)
timestamp
是当前时间的 Unix 时间戳,用于防止重放攻击。
method
是 HTTP 请求方法,此处为 "GET"。
request_path
是 API 请求的路径。
body
是请求体,对于 GET 请求通常为空。
api_secret
是 API Secret 密钥,用于生成签名。
generate_signature
函数的实现如下:
import hmac
import hashlib
import base64
def generate_signature(timestamp, method, request_path, body, secret_key):
message = timestamp + method + request_path + body
hmac_key = secret_key.encode('utf-8')
message = message.encode('utf-8')
signature = hmac.new(hmac_key, message, digestmod=hashlib.sha256).digest()
signature_b64 = base64.b64encode(signature).decode('utf-8')
return signature_b64
生成签名后,需要将其添加到 HTTP 请求的头部。OKX API 需要以下头部信息:
headers = {
"OK-ACCESS-KEY": api_key,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-TIMESTAMP": timestamp,
"OK-ACCESS-PASSPHRASE": api_passphrase,
"Content-Type": "application/" # 明确指定 JSON
}
OK-ACCESS-KEY
是 API 密钥。
OK-ACCESS-SIGN
是请求签名。
OK-ACCESS-TIMESTAMP
是时间戳。
OK-ACCESS-PASSPHRASE
是 API Passphrase。
Content-Type
指定请求体的格式,此处为 JSON。
使用
requests
库发送 API 请求:
url = "https://www.okx.com" + request_path # 务必使用 HTTPS
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
如果请求成功,
response.status_code
将为 200。可以使用
response.()
方法将响应体解析为 JSON 格式的字典。如果请求失败,可以打印错误信息并返回
None
。
以下是主程序的代码:
if __name__ == "__main__":
if not all([API_KEY, API_SECRET, API_PASSPHRASE]):
print("请设置环境变量 OKX_API_KEY, OKX_SECRET_KEY, OKX_PASSPHRASE")
else:
balance = get_account_balance(API_KEY, API_SECRET, API_PASSPHRASE)
if balance:
print(.dumps(balance, indent=4)) # 使用 .dumps 格式化输出
主程序首先检查是否设置了环境变量。如果没有设置,则打印提示信息。否则,调用
get_account_balance
函数获取账户余额,并将结果格式化后打印到控制台。
需要安装
requests
库:
pip install requests
该示例使用了
.dumps
函数来格式化输出 JSON 数据,使其更易于阅读。需要导入
模块:
import
该代码片段展示了如何安全地获取 OKX 账户余额。重点在于环境变量的使用、请求签名的生成以及错误处理。务必仔细阅读 OKX API 文档,了解更多 API 的使用方法和限制。请妥善保管您的 API 密钥和 Passphrase,避免泄露。