欧易 · API 实操
欧易 API 的请求次数限制到底按什么来算?
「子账户每 2 秒最多 1,000 个订单请求」这句,容易被折算成「每秒能下 500 单」,脚本再照这个速度往一个合约上连发。实际发不了那么多:同一个产品 ID 上,单笔下单接口 POST /api/v5/trade/order 每 2 秒只收 60 次。1,000 管的是整个子账户所有产品的新单和改单加在一起,60 管的是单个产品、单个接口,两条同时生效,哪条先满就被哪条挡回来。
欧易 API 的限速没有一个通用的「每秒多少次」。公共行情接口按 IP 计,私有接口按 User ID 计(子账户各有自己的 User ID),下单、撤单、改单再细到产品 ID,WebSocket 的登录和订阅按连接计。普通的超限返回错误码 50011;超了子账户那条 1,000,返回的是 50061。
欧易 API 限速按 IP 算还是按账户算?
看接口要不要身份验证。不带 API Key 签名的公共行情接口,额度跟着出口 IP 走;带签名的私有接口跟着 User ID 走,母账户和每个子账户分开计数。几个脚本里常调的接口:
| 接口 | 限速 | 按什么计 |
|---|---|---|
| GET /api/v5/market/ticker | 20 次/2s | IP |
| GET /api/v5/market/tickers | 20 次/2s | IP |
| GET /api/v5/market/books | 40 次/2s | IP |
| GET /api/v5/market/candles | 40 次/2s | IP |
| GET /api/v5/account/balance | 10 次/2s | User ID |
| GET /api/v5/trade/orders-pending | 60 次/2s | User ID |
| GET /api/v5/trade/order | 60 次/2s | User ID + 产品 ID(期权按交易品种) |
| GET /api/v5/trade/account-rate-limit | 1 次/s | User ID |
按 IP 计的那几行,同一台机器上的几个脚本就算用的是不同账户的 Key,拉公共行情时也挤在同一份额度里。私有接口反过来,换一个子账户,User ID 变了,额度就是另一份。
WebSocket 有自己的一套。建立连接按 IP 限 3 次/秒;每条连接上的订阅、取消订阅和登录请求合计每小时 480 次;连上以后 30 秒内没有订阅,或者订阅后 30 秒内服务器没推送数据,连接会被自动断开。订单、账户、持仓等私有频道,每个子账户订阅同一个频道最多 30 条连接。
下单、撤单、改单每 2 秒能发多少次
这三类接口的额度互相独立,下单的 60 次用完了,撤单那 60 次还在。额度按「User ID + 产品 ID」划分,BTC-USDT-SWAP 和 ETH-USDT-SWAP 各有一份;期权例外,按交易品种(Instrument Family)划分,品种信息用「获取交易产品基础信息」接口查。
| 接口 | 限速 | 怎么计数 | 计入子账户上限 |
|---|---|---|---|
| POST /api/v5/trade/order | 60 次/2s | 按请求次数 | 计入 |
| POST /api/v5/trade/batch-orders | 300 个/2s | 按订单个数 | 计入,每个订单单独算 |
| POST /api/v5/trade/amend-order | 60 次/2s | 按请求次数 | 计入 |
| POST /api/v5/trade/amend-batch-orders | 300 个/2s | 按订单个数 | 计入,每个订单单独算 |
| POST /api/v5/trade/cancel-order | 60 次/2s | 按请求次数 | 不计入 |
| POST /api/v5/trade/cancel-batch-orders | 300 个/2s | 按订单个数 | 不计入 |
- 批量接口和单笔接口的额度也分开。一次批量请求放 5 个订单,扣的是 300 里的 5 个;批量请求里只有 1 个订单时,它按单笔处理,算进 60 次那一份。
- 下单、撤单、改单的额度由 REST 和 WebSocket 共用,把下单从 REST 挪到 WebSocket 不会多出一份 60 次。WebSocket 接行情受的是建连次数和每条连接订阅、登录次数的约束,和这里的交易额度是两回事。
- 同一笔订单同时处于处理中的改单请求最多 3 笔,已有 3 笔在处理时再提交,返回 51513。
- 跟单交易的带单员,在带单产品上的限速低得多:下单 4 次/2s,批量下单、改单、批量改单都是 4 个/2s。
把单个产品能用的额度加起来:单笔下单 60 次加批量下单 300 个,2 秒内最多 360 个新订单;改单同样是 60 + 300 = 360 个。新单和改单合计 720 个,不到 1,000。照这个加法,只交易一个产品的脚本先撞上的会是产品这一层的 50011,子账户那条 1,000 要同时交易好几个产品才碰得到。
报 50061 是碰到了子账户每 2 秒 1,000 个的上限
50061 对应子账户层面的限速:每个子账户每 2 秒最多 1,000 个订单相关请求。只有新订单和改单计入,撤单不算;批量请求里的每个订单单独计数。受它管的是 REST 的下单、批量下单、修改订单、批量修改订单,以及 WebSocket 的下单、批量下单、改单、批量改单。它和产品 ID 那一层的限速并行运行,两条都得满足。
举个例子:脚本同时跑三个永续合约,每个产品 2 秒内把单笔下单的 60 次和批量下单的 300 个都用满,新订单一共 360 × 3 = 1,080 个。每个产品单看都没超,子账户合计超过了 1,000,这时收到的是 50061,不是 50011。
文档在成交比率分档那一节末尾写明,大宗交易、价差交易、做市商保护(MMP)订单,以及币币、币币杠杆订单,不受子账户限速限制。按这句,只跑现货的脚本不计入这 1,000,主要盯每个产品 60 次/2s 那一层。本地给子账户总数留的计数器照样留着,真收到 50061 就按下面处理。
收到 50061,只给报错的交易对降速多半不够,这份额度是子账户所有产品共用的,要压的是全部产品新单加改单的总量。撤单不计入这条,该撤的照常撤。
VIP5 以上的子账户限速按成交比率分 8 档
这套分档只对用户等级 VIP5 及以上生效:子账户每 2 秒的新单加改单上限按成交比率落档,从 1,000 到 10,000 共 8 档。
每天 00:00 UTC(北京时间 08:00),系统用过去 7 天的数据算两个比率:
- 子账户成交比率 = 子账户的 USDT 交易量 ÷ Σ(每个交易产品的新增和修改请求数 × 交易产品乘数)。母账户自己也当作一个「子账户」来算。
- 母账户合计成交比率 = 母账户层面的 USDT 交易量 ÷ Σ(所有子账户各个交易产品的新增和修改请求数 × 交易产品乘数)。
只数 sCode = 0 的成功请求。大宗交易、价差交易、做市商保护和法币类型订单的订单数不进分母,大宗交易和价差交易的交易量也不进分子。
乘数调的是每个产品在比率里的权重。小币对和合约要做出同样的交易量,需要的订单往往更多,所以乘数小于 1,每笔请求在分母里占得少些:
| 业务线 | 覆盖规则 | 默认乘数 | 独立乘数 |
|---|---|---|---|
| 永续 | 产品 ID | 0.2 | 1:BTC-USDT-SWAP、BTC-USD-SWAP、ETH-USDT-SWAP、ETH-USD-SWAP |
| 交割 | 交易品种 | 0.1 | 0.3:BTC-USDT、BTC-USD、ETH-USDT、ETH-USD |
| 币币 | 产品 ID | 0.1 | 0.5:BTC-USDT、ETH-USDT |
| 期权 | 交易品种 | 0.1 | — |
币币订单虽然不受子账户限速限制,乘数表里仍有币币一行,文档的算例也把 XRP-USDT 的交易量和订单数算进了比率。
每天 08:00 UTC(北京时间 16:00),系统拿 00:00 UTC 那份快照,取子账户成交比率和母账户合计成交比率里较大的一个,按下表定这个子账户接下来的限速:
| 档位 | 成交比率 [x ≤ 比率 < y) | 子账户每 2 秒限速(新订单及修改订单请求) |
|---|---|---|
| Tier 1 | [0, 1) | 1,000 |
| Tier 2 | [1, 2) | 1,250 |
| Tier 3 | [2, 3) | 1,500 |
| Tier 4 | [3, 5) | 1,750 |
| Tier 5 | [5, 10) | 2,000 |
| Tier 6 | [10, 20) | 2,500 |
| Tier 7 | [20, 50) | 3,000 |
| Tier 8 | ≥ 50 | 10,000 |
档位怎么变动:
- 比率改善、档位上调,当天 08:00 UTC 立即生效。
- 比率下降、档位要下调,有一天宽限,降低后的限速在 T+1 的 08:00 UTC 才执行;到 T+1 时比率又提高了,直接给更高的那档。
- 交易手续费等级降到 VIP4,限速降为最低档,同样有一天宽限。
- 子账户 7 日交易量低于 1,000,000 USDT,按母账户合计成交比率定档。
- 新建的子账户先用最低档,T+1 的 08:00 UTC 起才按上面的规则走。
文档给的算例有三个账户,BTC-USDT-SWAP 乘数取 1,XRP-USDT 乘数取 0.1。把数代进两条公式:
| 账户 | 交易量(USDT)与订单数 | 比率 | 取较大值后 |
|---|---|---|---|
| A(母账户) | BTC-USDT-SWAP 100 / 10 单;XRP-USDT 20 / 15 单 | 120 ÷ (10 × 1 + 15 × 0.1) = 120 ÷ 11.5 ≈ 10.43 | 10.43 → Tier 6,2,500 个/2s |
| B(子账户) | BTC-USDT-SWAP 200 / 100 单;XRP-USDT 20 / 30 单 | 220 ÷ (100 × 1 + 30 × 0.1) = 220 ÷ 103 ≈ 2.14(文档写 2.13) | 3.01 → Tier 4,1,750 个/2s |
| C(子账户) | BTC-USDT-SWAP 300 / 100 单;XRP-USDT 20 / 45 单 | 320 ÷ (100 × 1 + 45 × 0.1) = 320 ÷ 104.5 ≈ 3.06 | 3.06 → Tier 4,1,750 个/2s |
| 母账户合计 | 交易量 660,分母 10 + 1.5 + 100 + 3 + 100 + 4.5 | 660 ÷ 219 ≈ 3.01 | — |
算例里的交易量是演示用的小数字。真实账户里,子账户 7 日交易量低于 1,000,000 USDT 时直接按母账户合计比率定档,不再比较两个比率。
欧易 API 怎么查当前限速额度,超限以后怎么重试
当前额度用 GET /api/v5/trade/account-rate-limit(获取账户限速)查,这个接口限 1 次/s,按 User ID 计。它返回子账户成交比率、母账户合计成交比率、子账户当前限速,以及 T+1 的预期子账户限速(档位要下调时看这一项)。数据每天 08:00 UTC 更新,脚本在北京时间 16:00 之后读一次存下来,当天就够用,没必要每次下单前都去查。
本地计数分三层:每个产品的下单、撤单、改单各一个计数器,按 2 秒计;同一子账户所有产品的新单加改单合一个总数,和查到的子账户限速比;WebSocket 记每秒建连次数和每条连接的订阅、登录次数。断线重连时别让多条连接在同一秒里一起重建,也别在一条连接上反复取消、重订。
订单多、又集中在同一个产品上,改用批量接口:单笔下单每 2 秒 60 次,批量下单每 2 秒 300 个订单。批量不会让子账户那条上限变宽,每个订单照样单独计入 1,000。改单等前一笔的结果回来再发下一笔,别让同一订单的处理中改单堆到 3 笔。
| 错误码 | 碰到的是哪条 | 脚本里怎么处理 |
|---|---|---|
| 50011 | 某个接口自己的限速(按 IP、User ID 或产品 ID) | 这个接口降速,退避后重试 |
| 50061 | 子账户每 2 秒新单加改单合计 | 整个子账户的新单、改单一起减速;撤单照常 |
| 51513 | 同一订单处理中的改单已有 3 笔 | 等前面的改单返回结果再提交 |
退避重试的代码(等待时间怎么逐次拉长、重试几次后停手)在 欧易 API 常见报错与排查清单 里。还没建过 Key、没在模拟盘下过单的,从 欧易 API 量化入门:创建模拟盘 Key、下单与撤单核验 开始。
欧易 API 限速问答
欧易 API 下单每秒能发多少次?
欧易按 2 秒计:单个产品的单笔下单每 2 秒 60 次,批量下单每 2 秒 300 个订单,两份额度独立,期权按交易品种计。子账户层面,新订单加改单每 2 秒合计 1,000 个,VIP5 以上按成交比率分档,最高 10,000。REST 和 WebSocket 下单共用这些额度。
欧易 API 报 50061 怎么解决?
50061 表示这个子账户每 2 秒的新订单和改单请求合计超过了限速,默认 1,000 个,批量请求里每个订单单独计数。只给报错的交易对降速多半不够,要把这个子账户所有产品的下单、改单一起减速;撤单不计入这条。文档写明币币、币币杠杆订单不受子账户限速限制,只跑现货的脚本按这句不计入这 1,000;真收到 50061,照样按上面的办法减速。
用 WebSocket 下单能多拿一份限速额度吗?
下单、撤单、改单的限速在 REST 和 WebSocket 之间共享,换通道不会多出额度,WebSocket 订单管理同样按 User ID 计。WebSocket 另有自己的连接限制:建连每秒 3 次(按 IP),每条连接的订阅、取消订阅和登录合计每小时 480 次。