目录导读
欧易API接口概述与申请流程
很多交易者刚开始接触量化时,都会被“API”这个词吓到,其实说白了,API就是让程序能像人一样操作你的交易所账户——查余额、看行情、下单平仓,而欧易交易所(OKX)提供的API接口,是目前主流交易所中比较完善的一套工具。

你需要拥有一个欧易交易所账户,如果没有,先去欧易交易所下载完成注册和身份验证,这里的“欧易交易所下载”不是让你随便点个链接就完事,而是要去官网的下载页面,确保安装的是正版App或访问的是正确官网。
接下来是申请API密钥的步骤:
- 登录你的欧易账户,点击右上角头像,进入“API”管理页面。
- 选择“创建API Key”,系统会要求你进行安全验证(短信或邮箱验证码)。
- 给API起个名字,Python量化脚本”,然后设置权限。
- 关键一步:权限设置有“读取”、“交易”、“提币”三个选项,对于普通交易脚本,只勾选“读取”和“交易”就够用了,千万别勾“提币”,否则万一密钥泄露,别人能把你的币转走。
- 创建成功后,你会得到两样东西:API Key 和 Secret Key,Secret Key只会显示一次,务必复制并保存在安全的地方。
小贴士:建议开启“绑定IP白名单”功能,把自己的服务器或电脑IP填进去,这样就算别人拿到你的密钥,也没法从别的地方调用。
API密钥的安全管理与权限设置
很多人觉得API密钥就是一组字符,随便存个txt文件就行,但你要知道,这相当于把你的交易所账户密码以明文形式放在电脑里,万一电脑中病毒或者被人远程访问,后果不堪设想。
这里分享几个实用的安全习惯:
- 环境变量存储:别把密钥硬编码在Python脚本里,用
os.getenv()从系统环境变量读取,或者用.env文件配合python-dotenv库管理。 - 权限最小化:只开通脚本真正需要的权限,比如只做数据回测,那就只给“读取”权限;需要自动交易,才加“交易”权限。
- 定期更换:每三个月换一次密钥,就像换密码一样,养成习惯就不觉得麻烦了。
- 不要提交到Git:如果你用Git管理代码,记得把
.env文件和包含密钥的配置文件加到.gitignore里。
如果你不确定自己设置得对不对,可以去oknr.com.cn看看相关的安全配置教程,那里有详细的步骤截图。
Python环境搭建与必备库安装
现在假设你已经有了API密钥,该动手写代码了,首先确保你的电脑上装了Python 3.7以上版本,如果你还没装,去官网下载安装包,记得安装时勾选“Add Python to PATH”。
打开终端或命令提示符,安装以下几个库:
pip install requests pip install python-dotenv pip install pandas
说一下这些库的作用:
- requests:用来发送HTTP请求,和欧易API通信。
- python-dotenv:读取
.env文件里的环境变量。 - pandas:处理返回的数据,比如K线数据,方便做分析。
有些教程会推荐 ccxt 这个库,它封装了很多交易所的API,但对于初学者,我更推荐直接用 requests,因为这样你能更清楚地理解API调用的底层逻辑,出了问题也好排查。
编写第一个行情数据获取脚本
先写一个最简单的脚本:获取BTC/USDT的当前市场价格,这一步能帮你验证API是否配置成功。
创建一个 market.py 文件,代码如下:
import requests
import os
from dotenv import load_dotenv
load_dotenv()
# 从环境变量读取API密钥(如果你只是想获取行情,其实不需要密钥也可以)
# 但为了演示完整流程,我们还是加上
API_KEY = os.getenv('OKX_API_KEY')
SECRET_KEY = os.getenv('OKX_SECRET_KEY')
# 获取BTC/USDT的最新行情
url = "https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
price = data['data'][0]['last']
print(f"当前BTC价格: {price} USDT")
else:
print(f"请求失败,状态码: {response.status_code}")
运行这个脚本,如果你能看到打印出的BTC价格,恭喜你,API通信成功了!这就是你迈向量化交易的第一步。
实现自动下单与交易逻辑
搞定了行情查询,我们来点真格的:写一个自动下单脚本,这个脚本会检查BTC价格,如果跌到某个位置就买入,涨到某个位置就卖出。
先说明一下:实际交易前一定要用测试网(Demo)环境跑几遍,别拿着真金白银直接试,欧易提供了模拟盘,地址和主网不同,但接口逻辑完全一样。
下面是一个简单的交易脚本示例,包含了签名验证逻辑(欧易API要求在发起交易请求时用Secret Key对参数进行签名):
import requests
import json
import time
import hmac
import base64
import os
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv('OKX_API_KEY')
SECRET_KEY = os.getenv('OKX_SECRET_KEY')
PASSPHRASE = os.getenv('OKX_PASSPHRASE') # 创建API时设置的密码短语
def get_sign(timestamp, method, request_path, body=''):
message = timestamp + method + request_path + body
mac = hmac.new(bytes(SECRET_KEY, encoding='utf-8'), bytes(message, encoding='utf-8'), digestmod='sha256')
d = mac.digest()
return base64.b64encode(d)
def get_header(method, request_path, body=''):
timestamp = str(time.time())
sign = get_sign(timestamp, method, request_path, body)
header = {
'OK-ACCESS-KEY': API_KEY,
'OK-ACCESS-SIGN': sign,
'OK-ACCESS-TIMESTAMP': timestamp,
'OK-ACCESS-PASSPHRASE': PASSPHRASE,
'Content-Type': 'application/json'
}
return header
# 查询账户余额
def get_account_balance():
url = "https://www.okx.com/api/v5/account/balance"
header = get_header('GET', '/api/v5/account/balance')
response = requests.get(url, headers=header)
return response.json()
# 市价下单
def place_order(instId, side, sz):
url = "https://www.okx.com/api/v5/trade/order"
body = {
'instId': instId,
'tdMode': 'cash',
'side': side,
'ordType': 'market',
'sz': str(sz)
}
header = get_header('POST', '/api/v5/trade/order', json.dumps(body))
response = requests.post(url, headers=header, data=json.dumps(body))
return response.json()
if __name__ == '__main__':
# 简单示例:如果BTC跌破某个价位,买入0.001个BTC
price = get_ticker_price('BTC-USDT')
if float(price) < 60000:
result = place_order('BTC-USDT', 'buy', 0.001)
print('下单结果:', result)
else:
print('价格未达预期,不操作')
重要提醒:这个脚本只是个教学示例,不能直接用于实盘,原因很多:没有错误处理、没有重试机制、没有风控逻辑、没有记录日志,如果你真想用它赚钱,至少得加上“检查账户余额是否足够”、“防止重复下单”、“异常情况报警”这些功能。
常见问题解答与调试技巧
Q1: 明明按照教程写了,为什么请求返回“签名错误”?
A: 90%的情况是时间戳问题,欧易API的时间校验很严格,你的电脑时间必须和服务器时间同步(误差在5秒内),建议在脚本开头加一句 import ntplib 来同步网络时间,或者直接 pip install ntplib 后调用,另外检查一下Secret Key和Passphrase是否复制正确,注意有没有多余空格。
Q2: 测试网和主网有什么区别?怎么切换?
A: 欧易的测试网地址是 https://www.okx.com(部分历史接口可能不同,建议查阅最新文档),测试网用的USDT是虚拟币,随便玩,实盘切换时,只需要把URL里的域名部分改回主网地址就行,其他代码完全一样,建议先在oknr.com.cn上找一下最新测试网入口,因为有时候平台会更新域名。
Q3: 我的脚本跑着跑着突然报错“429 Too Many Requests”怎么办?
A: 这是触发了频率限制,欧易API规定每秒最多请求次数是有限制的(通常20次/秒),解决方法有两个:
- 在每次请求之间加
time.sleep(0.1)(即每100毫秒请求一次)。 - 使用WebSocket订阅行情,不用轮询请求。
Q4: 我想做网格交易或者定投,有没有现成的模板?
A: 这类策略逻辑比较复杂,建议你先理解上面这个基础脚本,然后去GitHub搜一下“OKX grid trading bot”或者“OKX DCA bot”,不过一定要仔细审查代码,别直接复制就运行——有人会在开源代码里藏后门,窃取你的API密钥。
Q5: 既然可以直接在欧易网页端手动交易,为什么还要写脚本?
A: 最核心的原因是速度和纪律,人手动操作会有犹豫、会手滑、会错过最佳时机,而机器可以毫秒级执行预先写好的规则,还能同时监控几十个币种,24小时不间断运行,前提是你的策略本身是靠谱的——脚本只是执行工具,策略才是灵魂。
标签: 欧易API Python交易脚本