欧易API接口申请教程,如何使用Python编写简单的交易脚本?

admin 欧易中心 1

目录导读

  1. 欧易API接口核心价值与申请流程
  2. Python开发环境搭建与依赖库安装
  3. API鉴权机制深度解析
  4. 实战:编写现货交易脚本(含限价单与市价单)
  5. 常见错误排查与安全注意事项
  6. 高频问答集锦

欧易API接口核心价值与申请流程

欧易(OKX)作为全球领先的数字资产交易平台,其API接口为开发者提供了程序化交易、市场数据获取、资产管理等核心功能,通过API,您可以实现自动化策略、量化交易甚至构建自己的交易系统。

欧易API接口申请教程,如何使用Python编写简单的交易脚本?-第1张图片-欧易交易所

申请步骤(2025年最新版):

  1. 创建API密钥
    登录欧易官网(建议直接访问oe-okor.com.cn),进入“我的账户”→“API管理”,点击“创建API Key”,选择权限(推荐勾选“读取”和“交易”权限,避免开启提现权限)。

  2. 保存关键参数
    系统会生成api_keysecret_keypassphrase注意secret_key仅显示一次,请务必复制到安全的本地文件,若丢失需重新申请。

  3. IP白名单设置
    为保障账户安全,建议将运行脚本的服务器IP加入白名单,若使用动态IP,可暂时关闭白名单功能(不推荐生产环境使用)。

  4. 测试与正式环境区分
    欧易提供模拟盘(Demo)环境,申请时选择“测试网”即可获得模拟资金,生产环境需切换至“主网”。


Python开发环境搭建与依赖库安装

推荐使用Python 3.8+版本,核心依赖库为requestshmac(用于签名计算)。

# 创建虚拟环境(可选)
python -m venv okx_env
source okx_env/bin/activate  # Linux/Mac
okx_env\Scripts\activate     # Windows
# 安装必要库
pip install requests pandas

若需处理实时行情,可额外安装websocket-client(用于WebSocket订阅)。


API鉴权机制深度解析

欧易API采用HMAC-SHA256签名算法,每次请求需携带以下参数:

  • OK-ACCESS-KEY:API Key
  • OK-ACCESS-SIGN:签名串
  • OK-ACCESS-TIMESTAMP:UTC时间戳(毫秒)
  • OK-ACCESS-PASSPHRASE:API创建时设置的密码

签名生成规则:
将时间戳 + 请求方法(GET/POST)+ 请求路径 + 请求体(若为GET则为空字符串)拼接字符串,用HMAC-SHA256算法加密后转为Base64编码。

import hmac
import base64
import datetime
import requests
def sign_message(secret_key, timestamp, method, request_path, body=''):
    message = f"{timestamp}{method}{request_path}{body}"
    mac = hmac.new(bytes(secret_key, 'utf-8'), bytes(message, 'utf-8'), digestmod='sha256')
    return base64.b64encode(mac.digest()).decode('utf-8')
# 示例:获取账户余额(GET请求)
api_key = 'YOUR_API_KEY'
secret_key = 'YOUR_SECRET_KEY'
passphrase = 'YOUR_PASSPHRASE'
timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
method = 'GET'
request_path = '/api/v5/account/balance'
sign = sign_message(secret_key, timestamp, method, request_path)
headers = {
    'OK-ACCESS-KEY': api_key,
    'OK-ACCESS-SIGN': sign,
    'OK-ACCESS-TIMESTAMP': timestamp,
    'OK-ACCESS-PASSPHRASE': passphrase,
    'Content-Type': 'application/json'
}
response = requests.get(f'https://www.okx.com{request_path}', headers=headers)
print(response.json())

实战:编写现货交易脚本

以下脚本实现市价买入BTC查询当前未成交订单功能。

import json
import time
class OKXTrader:
    def __init__(self, api_key, secret_key, passphrase):
        self.base_url = 'https://www.okx.com'
        self.api_key = api_key
        self.secret_key = secret_key
        self.passphrase = passphrase
    def _sign(self, timestamp, method, path, body=''):
        msg = timestamp + method + path + body
        mac = hmac.new(self.secret_key.encode(), msg.encode(), 'sha256')
        return base64.b64encode(mac.digest()).decode()
    def _headers(self, timestamp, method, path, body=''):
        return {
            'OK-ACCESS-KEY': self.api_key,
            'OK-ACCESS-SIGN': self._sign(timestamp, method, path, body),
            'OK-ACCESS-TIMESTAMP': timestamp,
            'OK-ACCESS-PASSPHRASE': self.passphrase,
            'Content-Type': 'application/json'
        }
    def place_market_order(self, instId, side, sz):
        """市价单下单,instId如BTC-USDT,side为buy/sell,sz为数量"""
        path = '/api/v5/trade/order'
        timestamp = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        body = json.dumps({
            'instId': instId,
            'tdMode': 'cash',    # 现货交易
            'side': side,
            'ordType': 'market',
            'sz': str(sz)
        })
        resp = requests.post(self.base_url + path, headers=self._headers(timestamp, 'POST', path, body), data=body)
        return resp.json()
    def get_pending_orders(self, instId=''):
        """查询未成交订单列表"""
        path = '/api/v5/trade/orders-pending'
        if instId:
            path += f'?instId={instId}'
        timestamp = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        resp = requests.get(self.base_url + path, headers=self._headers(timestamp, 'GET', path))
        return resp.json()
# 使用示例
trader = OKXTrader('your_api_key', 'your_secret_key', 'your_passphrase')
print('下市价买单(0.001 BTC):', trader.place_market_order('BTC-USDT', 'buy', 0.001))
print('当前挂单:', trader.get_pending_orders('BTC-USDT'))

运行提示:
首次运行建议使用欧易交易所下载的模拟盘环境测试,正式交易前务必核对订单参数(如数量、方向),避免因手误造成损失。


常见错误排查与安全注意事项

错误码 常见原因 解决方案
40001 API Key无效或过期 重新申请并检查复制是否完整
40002 签名错误 检查timestamp格式(必须为UTC且精确到毫秒)
40003 无交易权限 开启API Key的“交易”权限
40005 请求频率超限 每秒不超过10次(市商/机构可申请提升)

安全建议:

  • 永远不要将secret_key上传至公开代码仓库(如GitHub)
  • 为API Key设置仅交易权限,禁用提现功能
  • 定期轮换密钥(建议每月更新一次)
  • 使用HTTPS加密通信(欧易API已强制要求)

高频问答集锦

Q1:申请API时,是否需要开启IP白名单?
A:强烈建议开启,若您的服务器IP固定,设置白名单可极大降低被盗用风险,若为家庭网络动态IP,可暂时关闭但需配合其他安全措施(如限制交易额度)。

Q2:使用Python脚本下单后,如何快速获取成交结果?
A:可通过/api/v5/trade/fills接口查询最近订单的成交明细,或订阅WebSocket频道实时推送成交数据。

Q3:脚本报错“invalid sign”应如何排查?
A:按步骤检查:①timestamp是否为UTC且末尾带Z;②请求路径是否与签名时一致(含参数);③body字符串是否与请求体完全一致(注意空格),推荐使用pdbprint打印签名前的完整字符串。

Q4:如何实现自动网格交易策略?
A:结合本教程的API逻辑,通过定时任务轮询行情,在价格达到预设区间时下达限价单即可,注意设置合理的止损止盈参数。

Q5:欧易交易所下载后,模拟盘和主网数据是否互通?
A:不互通,模拟盘使用独立的服务器和虚拟资产,主网为真实资金,建议先用模拟盘跑通脚本逻辑,再切换至主网,如需获取欧易交易所下载链接,可通过oe-okor.com.cn访问官方渠道。


通过本教程,您已掌握使用Python调用欧易API的核心流程,从密钥申请到签名算法,再到实际下单脚本,每一步都经过精心设计,建议先从模拟盘开始,逐步优化您的交易策略,若遇到其他技术问题,可参考欧易官方文档(路径:/docs)或加入开发者社区交流。

标签: 欧易API Python交易脚本

抱歉,评论功能暂时关闭!