目录导读
- 欧易API接口申请全流程解析
- Python环境搭建与必要库安装
- 从零开始编写第一个交易脚本
- 常见错误排查与性能优化
- 问答环节:用户高频问题解答
欧易API接口申请全流程解析
想通过程序自动交易,第一步就是要拿到欧易交易所官网的API密钥,很多新手朋友卡在这一步,其实流程非常简单:

登录你的欧易交易所下载账号,在右上角个人中心找到“API”管理页面,这里要注意:请务必完成身份认证(KYC2级),否则无法创建API。
点击“创建API”后,系统会让你选择权限类型,如果你是做现货交易,勾选“交易”权限即可;如果想做合约,则需要额外选择“合约交易”。安全提示:不要勾选“提币”权限,这个权限只在特殊场景下使用,日常交易脚本用不到。
创建成功后,你会拿到两个关键信息:API Key和Secret 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请求,hashlib和hmac用来生成签名,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交易脚本编写的基础技能,从申请密钥到下单完成,整个流程清晰可循。先用测试网模拟交易,确认无误后再上真金白银,如果你在编写过程中遇到其他问题,欢迎在评论区留言交流。