想要用代码把交易效率提升 300%?OKX最新发布的API v5将交易接口统一、WebSocket 订阅精简、认证逻辑升级,所有细节都在本篇指南里拆解。核心关键词:API v5、交易接口、WebSocket、统一账户、批量下单、订单状态、仓位管理、杠杆设置。
一、为什么升级到 API v5?
1.1 一条接口,搞定所有产品
过去版本需要分别调用现货、合约、期权等多套路径,而 API v5 通过 POST /api/v5/trade/order 一条接口即可下单至任意品种,仅通过 instType 区分即可。
1.2 命名更精炼
全部采用小写 camelCase,流量小、解析快。例如:
currency→ccyinstrument_id→instId
1.3 WebSocket 原生压缩
无需手动解压,打开 "permessage-deflate" 即可节省 70% 以上流量。
二、建立连接与身份验证
2.1 WebSocket 公私分离
- 公共频道:行情、K线无需登录。
- 私有频道:仓位、订单需先执行
op: "login"。
典型登录格式如下:
{
"op": "login",
"args": [{
"apiKey": "你的Key",
"passphrase": "你的Passphrase",
"timestamp": "时间戳",
"sign": "根据文档计算出的签名"
}]
}2.2 REST 认证
与旧版保持一致,依然在 Headers 中加入 OK-ACCESS-SIGN 等字段即可。
三、配置统一账户与子账户
3.1 账户模式一键查看
GET /api/v5/account/config 可返回:
- 账户模式(简单、单币种保证金、多币种保证金)
- 持仓模式(Net / 双向)
- 自动借贷开关
- 期权希腊值模型
✅ 小提示:如果你想从“ Net ”切换为“ Long/Short 双向持仓”,必须先全部平仓后调用 POST /api/v5/account/set-position-mode。3.2 子账户 API Key 全生命周期管理
# 创建
POST /api/v5/users/subaccount/apikey
# 读取
GET /api/v5/users/subaccount/apikey
# 更新
POST /api/v5/users/subaccount/modify-apikey
# 删除
POST /api/v5/users/subaccount/delete-apikey安全最佳实践:务必绑定白名单 IP,避免 API Key 外泄。
四、杠杆与可买可卖额度
4.1 杠杆配置粒度
- 逐币(现货/杠杆):对
ccy设置杠杆; - 逐品种(合约/永续):对
instId设置杠杆。
三步快速设置
GET /api/v5/account/leverage-info拉取现有杠杆。- 根据
ccy或instId拼装请求 6~8 次可覆盖常用币种及合约。 - 用
POST /api/v5/account/set-leverage一并指定lever、mgnMode。
4.2 最大可交易额度
在多币种保证金模式 + 自动借贷下,可用额度会随网络实时变动:
GET /api/v5/account/max-avail-size?instId=BTC-USDT&tdMode=cross返回字段 availBuy、availSell 可精确到小数点后 18 位,无惧滑点。
五、下单、改单、撤单:REST vs WebSocket
5.1 下单示例
REST 场景:
POST /api/v5/trade/order
Body:
{
"instId": "BTC-USDT-SWAP",
"tdMode": "cross",
"clOrdId": "testBTC0123",
"side": "buy",
"ordType": "limit",
"px": "50912.4",
"sz": "1"
}WebSocket 场景(更高效):
{
"id": "NEWtestBTC0123",
"op": "order",
"args": [{
"instId": "BTC-USDT-SWAP",
"tdMode": "cross",
"clOrdId": "testBTC0123",
"side": "buy",
"ordType": "limit",
"px": "50912.4",
"sz": "1"
}]
}5.2 批量操作
支持最多 20 笔订单并发:
- 批量下单:
POST /api/v5/trade/batch-orders - 批量撤单:
POST /api/v5/trade/cancel-batch-orders
与旧版不同,各订单成功/失败独立,务必检查返回的sCode与sMsg。
六、实时监控:订单与仓位频道
6.1 订阅订单更新
WebSocket 订阅粒度:
a. 全品种 {"channel": "orders"}
b. 某底层 {"channel": "orders", "uly": "BTC-USDT"}
c. 单一品种 {"channel": "orders", "instId": "BTC-USDT-SWAP"}
收到 state: "live" / "filled" / "canceled" 后便可执行下一步策略逻辑。
6.2 仓位快照+推送
仓位频道按相同粒度订阅,首帧提供非零仓位快照,后续增量更新。
关键字段:
posId:依据mgnMode + posSide + instId + ccy生成,永不重复。upl、uplRatio:实时盈亏及盈亏率。
七、对账秘籍:用 tradeId 匹配订单与仓位
因仓位更新可能聚合多条成交,最简单方式是:
- 订单频道收到
tradeId+ fills; - 将
tradeId与仓位更新的tradeId比对; - 若
uTime或posId冲突再用时间戳校验。
👉 点击查看交互式对账代码模板,30 秒完成订单数据与仓位数据同步
八、常见问题 FAQ
Q1:API v3 的 underlying 字段还能用吗?
A:已被 uly 取代,v3 代码需迁移。
Q2:为什么 REST 获取仓位返回空?
A:官频订阅仅在有持仓或非零币种时推送;如确认已开仓仍无数据,检查是否 instType 对应错误。
Q3:Net 持仓下能否同时开多、开空?
A:不能;Net 模式会实时多空对冲,想分仓需改为双向持仓模式并先撤净仓位。
Q4:WebSocket 掉线如何优雅重连?
A:官方 30s 心跳,收到 {"event":"error","code":"60005"} 时直接重新登录+订阅即可,记录 uTime 避免重复推送卡顿。
Q5:如何防止杠杆误超?
A:利用 max-avail-size 获得的 availBuy/availSell 做程序级别二次校验;再调用 set-leverage 强制锁杠杆。
Q6:批量撤单失败 30018?
A:错误码对应“订单不存在或已取消”,确认ordId与clOrdId是否匹配、时间戳是否与时钟同步。
写在最后
API v5 从底层到应用层的全面升级,把“拆东墙补西墙”的旧范式彻底重塑为一站式服务。下次当你需要同时管理现货、永续、交割、期权的多品种仓位时,别忘了这篇指南里的配置顺序、订阅粒度与对账技巧——几分钟的接入,抵得上半天的人工统计。祝你交易得心应手,收益翻番!