量化喵是独立第三方信息站,不是欧易(OKX)官方。注册按钮含邀请码 OK30001,我们可能因此获得推广服务费。 完整披露 →

欧易 · API 实操

欧易 API 常见报错与排查清单:照着这张表修

写量化脚本的人,十有八九不是卡在策略上,而是卡在一行红字报错上:脚本跑起来,终端弹出一串看不懂的 code 和英文,人就懵了。好消息是,欧易 API 的报错就那么几种高频款,搞清楚每种长什么样、对应哪个原因,排查会快得多。

这篇我们(量化喵编辑组)把自己踩过、以及在社群里反复看到的报错整理成一份清单,核心是一张错误码对照表——出了问题,先到表里按错误码或关键词定位,再看下面对应的逐条排查。读完你应该能把大多数报错在几分钟内自己解决,而不是对着红字干瞪眼。

先学会读报错:code + msg

排错的第一步,是看懂报错本身。欧易接口出错时,会返回三样信息:

  • HTTP 状态码:最粗的一层,比如 401(鉴权问题)、429(请求太多)、400(请求本身有问题)。
  • code:欧易自己的数字错误码,最精确地指向问题类型。这是你排查的主要依据。
  • msg:一段文字说明,帮你确认方向,有时还会直接点出哪个字段出错。

如果你用 ccxt,它会把这些原始报错包装成更易读的异常类型,比如鉴权问题抛 AuthenticationError、限频抛 RateLimitExceeded、余额不够抛 InsufficientFunds。异常信息里一般也带着欧易的原始 code 和 msg。一个好习惯是用 try/except 把它们打印清楚:

import ccxt

okx = ccxt.okx({
    'apiKey':   '你的_apiKey',
    'secret':   '你的_secret',
    'password': '你的_Passphrase',
    'enableRateLimit': True,
})

try:
    balance = okx.fetch_balance()
    print('USDT 可用:', balance['USDT']['free'])
except ccxt.AuthenticationError as e:
    print('鉴权失败,检查三个凭证和系统时间:', e)
except ccxt.RateLimitExceeded as e:
    print('触发限频,放慢请求:', e)
except ccxt.BaseError as e:
    print('其他报错,看原始 code/msg:', e)

把异常里那串 code 和 msg 原样记下来,对照下面这张表,基本就能定位到底是哪一类问题。

高频报错对照表

下面这张表覆盖了新手最常撞上的几种报错。错误码以欧易当前 API v5 文档公布的为准(欧易偶尔会调整码值,遇到对不上的就以 msg 文字和官方文档为准),重点是把「原因→怎么修」对上号。

报错(code / 关键词)大概率原因怎么修
50011
Too Many Requests / 限频
请求太密集,触发接口限频保护 打开 enableRateLimit;还撞就加指数退避重试,别用无延时的 while 循环
Invalid sign
鉴权失败
签名不对:多半是 Passphrase 填错,或 apiKey/secret 复制有误,或系统时间不准 逐个核对三个凭证有无空格/缺字;确认 password 填的是 Passphrase;校准系统时间
API key 无效
APIKey does not exist
apiKey 复制错、被删了、或用错了环境(实盘 Key 当模拟盘 Key) 重新从后台复制 apiKey;确认这个 Key 还在、没被删;确认 sandbox 开关与环境一致
Passphrase 错误
passphrase incorrect
ccxt 的 password 字段填成了登录密码,而不是建 Key 时设的 Passphrase password 改成你建那个 Key 时设的 Passphrase;记不清只能删 Key 重建
余额不足
Insufficient balance
下单金额超过账户可用余额,或资金在别的账户(如资金账户 vs 交易账户) 减小下单量;确认资金在用于交易的账户里;模拟盘可重置虚拟资金
时间戳过期
timestamp expired
本机系统时间偏差过大,签名时间戳超出欧易容差 开启 NTP 自动校时,把系统时间同步准;云服务器一般默认已开
权限不足
permission denied
这个 Key 没有所需权限(常见:只勾了读取,没勾交易) 回 API 管理给该 Key 补勾「交易」权限,不用重建
IP 不在白名单
IP not allowed
给 Key 设了 IP 白名单,但当前出口 IP 不在名单里(换网络/开代理/宽带 IP 变了) 把当前出口 IP 加进该 Key 的白名单;IP 经常变就考虑暂不设白名单
交易对不存在
instrument does not exist
symbol 格式写错,或用了合约格式去下现货单 现货写成 BTC/USDT(大写带斜杠);先 load_markets() 看可用交易对
数量/精度不符
size too small
下单量小于该交易对最小下单量,或精度位数不对 load_markets() 查该交易对的 limitsprecision,按要求取整

逐条排查怎么修

表格给方向,这一节给细节。挑你撞上的那条往下看。

鉴权类(Invalid sign / API key 无效 / Passphrase 错误)

这是新手报错的重灾区,按下面顺序排查,命中率最高:

  • 先查 Passphrase。ccxt 里的 password 字段,填的必须是你建 Key 时设的那串 Passphrase,不是登录密码,也不是 secret。这一条占了鉴权失败的一大半。
  • 再查 apiKey / secret 有没有复制错。常见是粘贴时首尾多了空格、或漏了一两个字符。重新从后台复制一遍最稳妥。
  • 还要查系统时间。时间不准会让签名时间戳过期,表现也是鉴权失败。开 NTP 校时。

权限不足

典型症状是「能查余额,不能下单」。查余额走读取权限,下单走交易权限,两者分开授权。回欧易后台 API 管理,找到这个 Key,补勾「交易」即可,不用重建。如果你顺手勾过提现——别留着,跑量化的 Key 永远别开提现权限。

余额不足

除了字面意义的钱不够,还有一个隐蔽原因:欧易有不同的账户(资金账户、交易账户等),你的钱可能不在用于下单的那个账户里。确认资金已经划转到交易账户。模拟盘的话,虚拟资金用完了在模拟盘界面重置即可——这也是 先在模拟盘练手 的好处,试错不花真钱。

symbol / 精度类

现货交易对在 ccxt 里统一是 大写/大写 带正斜杠,比如 BTC/USDT。写成 BTCUSDT、小写、或用合约格式都会报错。数量太小或精度不对,就用 load_markets() 查这个交易对的最小下单量和精度,按它要求来。这块在我们的 API 量化入门 里有完整的下单示例。

排错排到一半发现是账户本身的问题?如果你还没有一个干净的账户专门跑脚本,不妨单独开一个。用我们的邀请码 OK30001 注册欧易,手续费有减免,API 下的单同样适用。点这里注册欧易并开 API →

限频与退避重试

限频(50011 / Too Many Requests)是脚本党最常撞、也最该提前防的一类。它不是你做错了什么,而是请求太密集触发了交易所的保护。处理它分两层:

第一层:打开 ccxt 自带的限速。初始化时加 'enableRateLimit': True,ccxt 会自动在请求之间插入合理间隔,大多数场景这一步就够了:

okx = ccxt.okx({
    'apiKey':   '你的_apiKey',
    'secret':   '你的_secret',
    'password': '你的_Passphrase',
    'enableRateLimit': True,   # 自动限速,先开上
})

第二层:加指数退避重试。如果你的策略在某些时刻请求确实很密(比如同时刷很多交易对),光靠自动限速可能还会偶尔撞。这时给关键请求包一层重试:撞一次等 1 秒再试,再撞等 2 秒、4 秒,逐步拉长,撞够几次就放弃报错。

import ccxt, time

def with_retry(fn, max_tries=5):
    delay = 1
    for i in range(max_tries):
        try:
            return fn()
        except ccxt.RateLimitExceeded:
            print(f'限频,第 {i+1} 次,等 {delay}s 再试')
            time.sleep(delay)
            delay *= 2          # 指数退避:1 → 2 → 4 → 8 ...
    raise RuntimeError('重试多次仍被限频,放弃')

# 用法:把会被限频的调用丢进去
ticker = with_retry(lambda: okx.fetch_ticker('BTC/USDT'))
print(ticker['last'])

一个反面教材:别写 while True: 里面紧接着打接口、中间不加任何延时。这种循环会在一秒内打出几十上百个请求,瞬间撞限频,严重时整个 Key 会被短暂限制。任何高频循环里都要留间隔。

实测:我们踩的一次坑

📋 编辑组实测 · 2026-06-05
我们 16:47 在欧易模拟盘调试一个多交易对扫描脚本,一上来就在循环里对十几个交易对连着调 fetch_ticker,中间没加任何延时,也忘了开 enableRateLimit。跑了不到一分钟,终端就开始刷 RateLimitExceeded(对应 50011),后面的请求几乎全废。我们做了两步:先在初始化加上 'enableRateLimit': True,再把每个交易对的请求包进上面那个 with_retry 退避函数。改完重跑,十几个交易对全部正常返回,中间偶尔触发一两次退避、等一两秒就过了,整轮扫描跑完没再报限频。教训很直接:循环里打接口,限速和退避是标配,不是可选项。

常见问题

欧易 API 报错怎么读?

欧易的接口出错时会返回一个 code(数字错误码)和一段 msg(文字说明),还有 HTTP 状态码。先看 code,它最精确地指向问题类型;msg 帮你确认方向。在 ccxt 里,报错通常被包成对应的异常类型(比如 AuthenticationErrorRateLimitExceededInsufficientFunds),异常信息里一般也带着欧易原始的 code 和 msg。把这串信息原样搜一下,基本就能定位。

为什么一直报鉴权失败 / Invalid sign?

鉴权类报错最常见的三个原因:一是 ccxt 里的 password 字段没填欧易的 Passphrase(误填了登录密码),二是 apiKey 或 secret 复制时多了空格或少了字符,三是系统时间不准导致签名时间戳过期。按这个顺序逐个排查,绝大多数 Invalid sign 都能解决。

触发限频(50011 / Too Many Requests)怎么办?

限频是请求太密集触发的保护。最省事的办法是在初始化 ccxt 时打开 enableRateLimit,它会自动在请求间插入间隔。如果还撞,就在代码里加指数退避重试——撞一次等 1 秒,再撞等 2 秒、4 秒,逐步拉长。别用 while True 不加延时去打接口。

能查余额但下单报权限不足,为什么?

查余额属于读取权限,下单属于交易权限,两者在建 Key 时是分开授权的。能查不能下,基本就是只勾了读取没勾交易。回欧易后台 API 管理里给这个 Key 补勾交易权限即可,不用重建。

时间戳过期(timestamp expired)是什么意思?

欧易对请求里的时间戳有容差,如果你的电脑或服务器系统时间不准、偏差超过容差,签名就会因为时间戳过期被拒。解决办法是把系统时间同步到准确的网络时间,开启 NTP 自动校时。云服务器一般默认开了,本地机器偶尔会漂。

报「交易对不存在」是怎么回事?

多半是 symbol 格式写错。ccxt 里现货交易对是大写带正斜杠,比如 BTC/USDT,写成 BTCUSDTbtc/usdt、或者用了合约格式去下现货单都会报交易对不存在。拿不准时先 print(okx.load_markets().keys()) 看一眼可用的交易对到底长什么样。

把报错排查这关过了,你的脚本就不会动不动卡死了。接下来值得花时间的是把 风控写进代码——比报错更可怕的是脚本没报错却一直在下错单。也别忘了新代码先丢 模拟盘 里跑,排错不花真钱。

排错排顺了,准备好正经跑策略了?

先把账户和 API 准备好,在模拟盘把流程和报错都排顺,再切真金。用邀请码注册的新账户,手续费有减免,API 下的单一样适用。

OK30001 用 OK30001 注册欧易 →

加密资产价格波动剧烈,合约与杠杆可能导致本金全部亏损。量化与自动化交易不保证盈利,请只用你能承受损失的资金。