欧易交易所官网API接口申请教程,Python交易脚本实战指南

admin okx快讯 1

目录导读

  1. 欧易API接口申请全流程解析
  2. Python环境搭建与必要库安装
  3. 从零开始编写第一个交易脚本
  4. 常见错误排查与性能优化
  5. 问答环节:用户高频问题解答

欧易API接口申请全流程解析

想通过程序自动交易,第一步就是要拿到欧易交易所官网的API密钥,很多新手朋友卡在这一步,其实流程非常简单:

欧易交易所官网API接口申请教程,Python交易脚本实战指南-第1张图片-欧易交易所

登录你的欧易交易所下载账号,在右上角个人中心找到“API”管理页面,这里要注意:请务必完成身份认证(KYC2级),否则无法创建API。

点击“创建API”后,系统会让你选择权限类型,如果你是做现货交易,勾选“交易”权限即可;如果想做合约,则需要额外选择“合约交易”。安全提示:不要勾选“提币”权限,这个权限只在特殊场景下使用,日常交易脚本用不到。

创建成功后,你会拿到两个关键信息:API KeySecret Key请注意:Secret Key只会显示一次,一定要复制保存到本地加密文件里,如果泄露了,可以在官网立即删除重建。

这里分享一个小技巧:欧易的API文档非常详细,支持REST和WebSocket两种协议,对于初学者,建议先从REST协议入手,因为实现简单,出错容易排查,官方文档地址就在欧易交易所开发者中心,里面包含了所有接口的调用示例。

Python环境搭建与必要库安装

写脚本之前,先把环境准备好,我用的是Python 3.9+版本,理论上3.7以上都行。

第一步:安装依赖库

打开终端或命令提示符,执行以下命令:

pip install requests
pip install hashlib
pip install hmac
pip install time

requests库用来发HTTP请求,hashlibhmac用来生成签名,time库用来处理时间戳,这些是核心依赖,不需要装其他花里胡哨的库。

第二步:创建项目文件

在你的工作目录下新建一个okex_trade.py文件,这个文件就是我们的交易脚本主入口。

第三步:配置基本信息

在代码开头,先把API信息配置好,建议不要直接写死密钥,而是通过环境变量读取,避免代码泄露风险:

import os
api_key = os.getenv("OKEX_API_KEY")
secret_key = os.getenv("OKEX_SECRET_KEY")
passphrase = os.getenv("OKEX_PASSPHRASE")  # 注意:创建API时设置的访问口令

这里特别提醒:passphrase是你创建API时自己设置的口令,不是登录密码,很多人在这里踩坑。

从零开始编写第一个交易脚本

现在进入正题:写一个能查询账户余额并下单的脚本。

第一步:签名工具类

欧易的API请求需要携带签名,这是安全验证的关键,我们封装一个签名生成函数:

import requests
import json
import hmac
import hashlib
import base64
import datetime
from typing import Dict, Any
def generate_signature(timestamp: str, method: str, request_path: str, body: str) -> str:
    message = timestamp + method + request_path + body
    mac = hmac.new(bytes(secret_key, encoding='utf-8'), 
                   bytes(message, encoding='utf-8'), 
                   digestmod=hashlib.sha256)
    d = mac.digest()
    return base64.b64encode(d).decode('utf-8')

这个函数接收时间戳、请求方法(GET/POST)、请求路径和请求体,返回加密后的签名。

第二步:获取账户信息

写一个函数查账户余额,这是最基础的接口调用:

def get_account_info():
    base_url = "https://www.okex.com"  # 注意:正式环境用这个
    request_path = "/api/v5/account/balance"
    timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
    signature = generate_signature(timestamp, 'GET', request_path, '')
    headers = {
        'OK-ACCESS-KEY': api_key,
        'OK-ACCESS-SIGN': signature,
        'OK-ACCESS-TIMESTAMP': timestamp,
        'OK-ACCESS-PASSPHRASE': passphrase,
        'Content-Type': 'application/json'
    }
    response = requests.get(base_url + request_path, headers=headers)
    return response.json()

运行这个函数,如果返回了账户余额信息,说明API配置成功了。

第三步:下市价单

这里演示一个最简单的市价买入脚本:

def place_market_order(inst_id: str, side: str, sz: str):
    """下市价单
    :param inst_id: 交易对,如 'BTC-USDT'
    :param side: 'buy' 或 'sell'
    :param sz: 数量,市价单买时是买入金额,卖时是币数量
    """
    base_url = "https://www.okex.com"
    request_path = "/api/v5/trade/order"
    timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
    body = {
        'instId': inst_id,
        'tdMode': 'cash',  # 现货交易
        'side': side,
        'ordType': 'market',
        'sz': sz
    }
    # 市价单买时,sz表示买入金额;卖时,sz表示卖出数量
    if side == 'buy':
        body['tgtCcy'] = 'quote_ccy'  # 按计价货币数量买入
    body_str = json.dumps(body)
    signature = generate_signature(timestamp, 'POST', request_path, body_str)
    headers = {
        'OK-ACCESS-KEY': api_key,
        'OK-ACCESS-SIGN': signature,
        'OK-ACCESS-TIMESTAMP': timestamp,
        'OK-ACCESS-PASSPHRASE': passphrase,
        'Content-Type': 'application/json'
    }
    response = requests.post(base_url + request_path, headers=headers, data=body_str)
    return response.json()

完整运行示例

if __name__ == "__main__":
    # 先查余额
    print("查询账户余额...")
    balance = get_account_info()
    print(json.dumps(balance, indent=2))
    # 下个测试单(建议先用最小金额测试)
    print("尝试下市价买单...")
    result = place_market_order('BTC-USDT', 'buy', '10')  # 用10 USDT买比特币
    print(json.dumps(result, indent=2))

常见错误排查与性能优化

写脚本过程中,几个高频报错和解决方案:

错误1:401 Unauthorized 原因通常是签名错误或密钥过期,检查三点:时间戳是否UTC格式、passphrase是否匹配、密钥有没有泄露。

错误2:400 Bad Request - 参数异常 常见于市价单参数格式不对,比如欧易的市价单买时,sz代表买入金额,卖时代表卖出数量,容易搞混,建议先用tgtCcy参数明确指定。

错误3:429 Too Many Requests 请求频率超限,欧易对单个IP和Key有频率限制,现货接口限制较宽松,合约接口限制严格,可以在每次请求后加time.sleep(0.1)来降低频率。

性能优化建议

  • 使用连接池:requests.Session()可以复用TCP连接,减少握手开销
  • 批量下单:如果需要下多个订单,使用/trade/batch-orders接口
  • 使用WebSocket接收行情,减少轮询压力

问答环节:用户高频问题解答

问:欧易API接口申请需要翻墙吗? 答:正常访问欧易交易所不需要翻墙,API接口也是直接可用的,如果遇到连接问题,先检查本地网络和DNS设置。

问:脚本里API密钥写在哪里最安全? 答:绝对不要直接写在代码里,推荐用环境变量(os.getenv)或单独加密配置文件,如果只是本地测试,也可以临时手动输入,用完就清除。

问:市价单和限价单有什么区别? 答:市价单按当前市场最优价格立即成交,适合快速建仓;限价单需要设定具体价格,只有价格达到或优于设定价格时才成交,新手建议先从市价单开始,避免限价单不成交造成资金闲置。

问:可以用Python脚本做高频交易吗? 答:Python做高频交易速度不够,因为GIL锁和解释器开销,但做中低频策略、定投、网格交易完全够用,如果追求超低延迟,可以考虑C++或Go语言配合FIX协议。

问:API调用出现“资金不足”但账户里有余额? 答:检查一下账户模式和币种,比如在现货账户,需要先确保USDT在“资金账户”而非“交易账户”,欧易的账户结构分很多层级,建议仔细阅读文档的“账户”部分。


通过以上步骤,你已经掌握了欧易API接口申请和Python交易脚本编写的基础技能,从申请密钥到下单完成,整个流程清晰可循。先用测试网模拟交易,确认无误后再上真金白银,如果你在编写过程中遇到其他问题,欢迎在评论区留言交流。

标签: 欧易API Python交易

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