目录导读
- 欧易API接口概述与申请流程
- Python环境搭建与必要库安装
- 欧易API认证机制详解(API Key、Secret Key、Passphrase)
- Python交易脚本实战:获取账户信息与行情数据
- 编写自动化挂单脚本:限价单与市价单
- 风险控制与常见错误处理
- 高频交易进阶:WebSocket实时数据接入
- 问答环节:解决API调用中的典型问题
- 从脚本到策略的升级路径
欧易API接口概述与申请流程
欧易交易所(OKX)作为全球领先的数字资产交易平台,其API接口为量化交易者和开发者提供了强大的自动化交易能力,在开始编写Python脚本之前,首先需要完成API接口的申请。

申请步骤:
- 登录欧易官网,进入“账户”->“API管理”页面。
- 点击“创建API”,选择交易类型(建议勾选“交易”和“读取”权限)。
- 记录系统生成的API Key、Secret Key和Passphrase(通行短语),这三个参数是后续所有请求的认证核心。
💡提示: 申请API时建议绑定IP白名单,防止密钥泄露后被盗用,不要在代码中明文存储Secret Key,应使用环境变量加密管理。
Python环境搭建与必要库安装
推荐使用Python 3.8以上版本,安装以下核心库:
pip install requests hashlib hmac base64 json time
其中requests用于HTTP请求,hashlib和hmac用于签名生成,base64处理编码转换。
欧易API认证机制详解
欧易API采用HMAC-SHA256签名算法,每次请求都需要携带以下头部信息:
OK-ACCESS-KEY:API KeyOK-ACCESS-SIGN:签名(由Secret Key加密生成)OK-ACCESS-TIMESTAMP:UTC时间戳OK-ACCESS-PASSPHRASE:创建API时设置的通行短语
签名生成公式:
sign = Base64(HMAC_SHA256(SecretKey, timestamp + method + requestPath + body))
其中method为请求方法(GET/POST),requestPath为接口路径(如/api/v5/account/balance),body为空字符串或JSON字符串。
Python交易脚本实战:获取账户信息与行情数据
1 基础工具函数
import requests
import json
import hmac
import hashlib
import base64
import time
from datetime import datetime
def get_timestamp():
return datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
def sign_message(timestamp, method, request_path, body, secret_key):
message = timestamp + method + request_path + body
mac = hmac.new(bytes(secret_key, encoding='utf8'), bytes(message, encoding='utf-8'), digestmod=hashlib.sha256)
return base64.b64encode(mac.digest()).decode('utf-8')
def send_request(method, request_path, body=None):
api_key = 'YOUR_API_KEY'
secret_key = 'YOUR_SECRET_KEY'
passphrase = 'YOUR_PASSPHRASE'
base_url = 'https://ox-okbb.com.cn'
timestamp = get_timestamp()
signature = sign_message(timestamp, method, request_path, body or '', secret_key)
headers = {
'OK-ACCESS-KEY': api_key,
'OK-ACCESS-SIGN': signature,
'OK-ACCESS-TIMESTAMP': timestamp,
'OK-ACCESS-PASSPHRASE': passphrase,
'Content-Type': 'application/json'
}
url = base_url + request_path
if method == 'GET':
response = requests.get(url, headers=headers)
else:
response = requests.post(url, headers=headers, data=body)
return response.json()
2 获取账户余额
def get_account_balance():
path = '/api/v5/account/balance'
return send_request('GET', path)
# 调用示例
balance_data = get_account_balance()
print(json.dumps(balance_data, indent=2))
3 获取BTC/USDT实时行情
def get_ticker(inst_id='BTC-USDT'):
path = f'/api/v5/market/ticker?instId={inst_id}'
return send_request('GET', path)
编写自动化挂单脚本:限价单与市价单
1 限价单示例
def place_limit_order(inst_id, side, price, sz):
body = {
'instId': inst_id,
'tdMode': 'cash',
'side': side,
'ordType': 'limit',
'price': str(price),
'sz': str(sz)
}
path = '/api/v5/trade/order'
return send_request('POST', path, json.dumps(body))
# 挂单示例:限价买入0.01 BTC,价格30000 USDT
result = place_limit_order('BTC-USDT', 'buy', 30000, 0.01)
print(result)
2 市价单示例
def place_market_order(inst_id, side, sz):
body = {
'instId': inst_id,
'tdMode': 'cash',
'side': side,
'ordType': 'market',
'sz': str(sz)
}
path = '/api/v5/trade/order'
return send_request('POST', path, json.dumps(body))
风险控制与常见错误处理
在编写交易脚本时,必须加入以下风控模块:
- 请求频率限制:欧易API每个接口有速率限制(如REST API每秒最多10次),超过会被封IP。
- 资金管理:每次下单前检查账户余额,设置单次最大交易量。
- 异常处理:使用try-except捕获网络超时、签名错误等异常。
import time
from functools import wraps
def rate_limiter(max_calls=10, period=1):
def decorator(func):
last_called = [0.0]
@wraps(func)
def wrapper(*args, **kwargs):
elapsed = time.time() - last_called[0]
if elapsed < period / max_calls:
time.sleep(period / max_calls - elapsed)
ret = func(*args, **kwargs)
last_called[0] = time.time()
return ret
return wrapper
return decorator
常见错误码对照:
50001:签名错误(检查timestamp格式、Secret Key是否匹配)50002:时间戳超出范围(系统时间与服务器时间差超过5秒)50013:重复请求(nonce冲突)51000:参数错误(检查必填字段)
高频交易进阶:WebSocket实时数据接入
对于需要毫秒级响应的策略,建议使用WebSocket连接,欧易提供公共频道(行情、深度)和私有频道(账户、订单)。
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
if 'arg' in data and data['arg']['channel'] == 'tickers':
print(f"最新价格: {data['data'][0]['last']}")
def on_error(ws, error):
print(f"WebSocket错误: {error}")
ws_url = 'wss://ox-okbb.com.cn/ws/v5/public'
ws = websocket.WebSocketApp(ws_url, on_message=on_message, on_error=on_error)
ws.run_forever()
问答环节:解决API调用中的典型问题
Q1: 创建API时提示“IP限制”怎么办? A: 在API管理页面添加你的服务器公网IP到白名单,如果使用动态IP,可暂时关闭IP限制(不推荐生产环境使用)。
Q2: 签名总是失败,如何调试?
A: 首先通过print()输出timestamp和签名前的message字符串,与官方文档示例对比,注意timestamp必须精确到毫秒,且使用UTC时间而非本地时间。
Q3: 市价单成交滑点严重怎么优化?
A: 可改用“高级限价单”(ordType: 'advanced_limit')结合深度数据动态定价,或拆分为多笔小额订单通过“冰山订单”功能执行。
Q4: 脚本在欧易交易所下载后无法运行?
A: 确保Python版本兼容,并重新安装依赖库,检查base_url是否从www.okx.com变更为ox-okbb.com.cn。
Q5: 如何测试API而不动用真实资金?
A: 欧易提供模拟盘环境,申请模拟API Key后,将base_url改为https://ox-okbb.com.cn/(模拟盘端点),其他代码完全一致。
Q6: 脚本异常终止后如何恢复持仓?
A: 添加启动时的持仓检查逻辑,通过get_positions()接口获取当前仓位,自动对齐策略状态。
从脚本到策略的升级路径
本文从零搭建了基于欧易API的Python交易脚本框架,涵盖认证、行情获取、订单管理、风险控制等核心模块,随着经验积累,您可以:
- 整合技术指标(如MACD、RSI)生成交易信号
- 接入数据库存储历史K线数据用于回测
- 部署到云服务器实现7×24小时自动化交易
- 利用WebSocket实现实时行情驱动的闪电交易
交易脚本只是工具,稳定盈利需要严格的资金管理和持续的策略优化,建议先从模拟盘开始,逐步过渡到实盘,每次修改后都必须进行充分的压力测试。
标签: 欧易API Python交易脚本