OKX API使用指南:从零开始掌握加密货币交易自动化
在加密货币交易中,自动化交易、策略执行和高效管理是提升交易效率的关键,OKX作为全球领先的数字资产交易平台,提供了功能强大的API(应用程序接口),允许开发者通过编程方式实现交易、数据查询、账户管理等操作,本文将详细介绍OKX API的使用方法,从申请到实战,助你快速上手。
OKX API简介:什么是API?为什么需要它?
API是应用程序接口,相当于OKX交易平台与你的交易程序之间的“桥梁”,通过API,你可以:
- 自动化交易:执行预设的交易策略(如网格交易、定投),无需手动盯盘;
- 批量操作:快速查询账户资产、订单历史、市场数据等,提升数据处理效率;
- 策略回测:获取历史K线数据,验证交易策略的有效性;
- 多账户管理:通过程序统一管理多个OKX账户的交易行为。
OKX API支持现货交易、合约交易、期权交易等全业务场景,并提供RESTful API(用于数据查询和订单提交)和WebSocket API(用于实时数据推送),满足不同需求。
准备工作:申请API密钥与配置权限
在使用OKX API前,需完成以下准备工作:
注册并登录OKX账户
确保已完成身份认证(KYC),未认证账户可能无法使用API功能。
创建API密钥
- 登录OKX官网,进入【账户】→【API管理】;
- 点击【创建API】,设置API名称(如“网格交易机器人”)、权限(需根据需求勾选,见下文);
- 验证身份(如短信/邮箱验证),生成API Key(密钥)、Secret Key(秘钥)和Passphrase(密码短语)。
注意:这三项信息需妥善保存,一旦丢失无法找回,建议使用密码管理工具存储。
配置API权限
OKX API权限分为只读、交易、提现三类,需按需勾选(建议最小权限原则):
- 只读:查询账户资产、订单、市场数据等,适合数据分析和策略回测;
- 交易:提交/取消订单、查询订单状态,适合自动化交易;
- 提现:执行提现操作(需额外开启IP白名单,避免安全风险)。
设置IP白名单(推荐)
为提升安全性,可在创建API时限制允许访问的IP地址(仅填写的IP可调用API),避免密钥泄露被恶意使用,若需临时更换IP,可随时在API管理页面修改。
OKX API核心功能与调用方法
OKX API主要通过RESTful接口实现操作,以下是核心功能的使用示例(以Python为例,需先安装requests库:pip install requests)。
认证机制:如何生成请求签名?
OKX API使用HMAC-SHA256算法对请求进行签名,确保请求的合法性和安全性,签名步骤如下:
- 将请求方法(GET/POST)、请求路径(如
/api/v5/account/balance)、请求参数(按字母序排序)拼接成字符串; - 使用
Secret Key对字符串进行HMAC-SHA256加密,生成签名; - 将签名、API Key、Passphrase等信息添加到请求头中。
示例代码:生成签名
import hmac
import base64
import hashlib
import time
def generate_signature(api_key, secret_key, passphrase, method, path, query_string=None, body=None):
timestamp = str(int(time.time()))
message = timestamp + method.upper() + path + (query_string or "") + (body or "")
signature = base64.b64encode(
hmac.new(secret_key.encode(), message.encode(), hashlib.sha256).digest()
).decode()
return signature
查询账户资产(只读权限)
接口:GET /api/v5/account/balance
功能:获取账户余额(包括现货、合约等资产)。
示例代码
import requests
api_key = "your_api_key"
secret_key = "your_secret_key"
passphrase = "your_passphrase"
base_url = "https://www.okx.com"
def get_account_balance():
path = "/api/v5/account/balance"
timestamp = str(int(time.time()))
method = "GET"
body = ""
signature = generate_signature(api_key, secret_key, passphrase, method, path, body=body)
headers = {
"OK-ACCESS-KEY": api_key,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-PASSPHRASE": passphrase,
"OK-ACCESS-TIMESTAMP": timestamp,
"Content-Type": "application/json"
}
response = requests.get(base_url + path, headers=headers)
return response.json()
print(get_account_balance())
下单交易(交易权限)
接口:POST /api/v5/trade/order
功能:提交限价单、市价单等。
请求参数说明
| 参数名 | 类型 | 必填 | 说明 |
|--------------|--------|------|--------------------------|
| instId | string | 是 | 交易产品,如BTC-USDT |
| tdMode | string | 是 | 交易模式:cash(现货)cross(全仓合约)isolated(逐仓合约) |
| side | string | 是 | 买卖方向:buy/sell |
| ordType | string | 是 | 订单类型:limit(限价)market(市价) |
| sz | string | 是 | 委托数量(张或币数) |
| px | string | 否 | 限价单价格(市价单无需) |
示例代码:买入BTC限价单
def place_order():
path = "/api/v5/trade/order"
timestamp = str(int(time.time()))
method = "POST"
body = json.dumps({
"instId": "BTC-USDT",
"tdMode": "cash",
"side": "buy",
"ordType": "limit",
"sz": "0.001",
"px": "30000"
})
signature = generate_signature(api_key, secret_key, passphrase, method, path, body=body)
headers = {
"OK-ACCESS-KEY": api_key,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-PASSPHRASE": passphrase,
"OK-ACCESS-TIMESTAMP": timestamp,
"Content-Type": "application/json"
}
response = requests.post(base_url + path, headers=headers, data=body)
return response.json()
print(place_order())
查询订单状态(交易权限)
接口:GET /api/v5/trade/order
功能:通过订单ID查询订单详情(如成交状态、剩余数量)。
请求参数
ordId:订单ID(必填)instId:交易产品(可选,建议填写)
示例代码
def get_order_status(ord_id):
path = "/api/v5/trade/order"
timestamp = str(int(time.time()))
method = "GET"
query_string = f"ordId={ord_id}&instId=BTC-USDT"
signature = generate_signature(api_key, secret_key, passphrase, method, path, query_string=query_string)
headers = {
"OK-ACCESS-KEY": api_key,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-PASSPHRASE": passphrase,
"OK-ACCESS-TIMESTAMP": timestamp,
"Content-Type": "application/json"
}
response = requests.get(base_url + path + "?" + query_string, headers=headers)
return response.json()
print(get_order_status("your_order_id"))
WebSocket API:实时数据推送
对于需要实时数据的场景(如行情监控、高频交易),可使用WebSocket API。
示例代码:订阅BTC-USDT实时K线
import websockets
import asyncio
async def subscribe_kline():
ws_url = "wss://ws.okx.com:8443/ws/v5/public"
async with websockets.connect(ws_url) as websocket:
subscribe_msg = {
"op": "subscribe",
"args": [{
"channel": "candle1m",
"instId": "BTC-USDT"
}]
}
await websocket.send(json.dumps(subscribe_msg))
while True:
response = await websocket.recv()
print(response)
asyncio.run(subscribe_kline())