想高效接入全球领先的加密交易所,却不知道从何下手?本文用一把“手术刀”级别精度的要点拆解,带你一步步完成 OKX API 对接,覆盖行情、账户、杠杆、下单与风控等关键环节。无论你是量化新手还是资深开发者,读完即可上手跑通完整链路。👉 一站式开通测试环境,立即体验真实行情推送
1. 行情与交易品种配置
1.1 获取交易品种(Instrument)
调用 GET /api/v5/public/instruments 即可一次性拉取所有现货、永续、期货、期权的静态信息。返回值包含最小下单量(minSz)、最小挂单变动单位(tickSz)等关键字段。
{
"instType": "SPOT",
"instId": "BTC-USDT",
"baseCcy": "BTC",
"quoteCcy": "USDT",
"tickSz": "0.01"
}
后续若出现新币上架或精度调整,WebSocket instruments 频道 会主动推送增量更新,无需反复轮询 REST 接口,极大节省带宽。
1.2 多档位深度数据
竞价撮合深度共有 5 档快照、全量 books 与 增量 L2-TBT 三种粒度:
- books5:每 100 ms 推送,无变动不发送。
- books-l2-tbt:每 10 ms 推送增量包,需登录且 VIP≥5。
- books50-l2-tbt:VIP≥4 专享,同样 10 ms 实时增量。
行情数据内部每 10 ms 生成一份快照,对外按照频道级别做裁剪。无论连接几个 WebSocket,都能收到完全一致的深度图像。
若在短时间内价格 A→B→A 又复原,系统不会为快照频道发送重复数据;若深度长期无变化,会发送 “空心跳”,方便维护连接状态。
2. 账户体系与权限配置
2.1 主账户 & 子账户
- Web/APP 端 创建子账号并分发 API Key。
接口端
/api/v5/account/config
查看账户模式:- Spot(现货)
- Futures(逐仓期货)
- Multi-currency margin(多币种保证金)
- Portfolio margin(组合保证金)
两种 持仓模式 择一:
- Net:同一标的只能有一边仓位,系统会自动净额。
- Long/Short:可同时持多空,互不抵消。
欲切换模式,请先确保全部仓位为零且无挂单,然后调用 POST /api/v5/account/set-position-mode。
2.2 自动借贷与杠杆
跨币种保证金模式支持 Auto-Borrow:差额部分由其他币种自动折算借入。风险可由 twap
字段观察。
杠杆层级 不能全局设定,需按“币种(现货)/标的家族(衍生品)+ 保证金模式”细粒度调节:
{
"lever": "3.0",
"mgnMode": "cross",
"ccy": "BTC"
}
👉 深度示例代码:如何在 6 次 API 调用内完成 8 个品种 3 倍杠杆初始化
3. 下单全流程拆解
3.1 交易模式 tdMode 一览
账户模式 | 产品类型 | 保证金模式 | tdMode |
---|---|---|---|
Spot | 现货 | - | cash |
Multi-currency | 永续合约 | cross | cross |
Multi-currency | 永续合约 | isolated | isolated |
示例场景:
- 账户:Multi-currency margin
- 标的:BTC-USDT-SWAP
- tdMode 必须设为
cross
3.2 WebSocket 订阅 Orders 频道
启动 WebSocket 后,通过 private channel 订阅粒度可选:
- 按品种 instId :最细,仅监听单个标的。
- 按品种族 instFamily :所有该家族合约。
- 按品种类型 instType=ANY :一次性监听全产品。
提示:频道不会推送历史挂单快照,只能接收实时状态更新 live / partially_filled / filled / canceled
。
3.3 REST 与 WebSocket 下单对比
REST 下单
POST /api/v5/trade/order
{
"instId": "BTC-USDT-SWAP",
"tdMode": "cross",
"clOrdId": "algo20250601",
"side": "buy",
"ordType": "limit",
"px": "66000",
"sz": "10"
}
WebSocket 下单(更轻量)
{
"id": "ws_order_001",
"op": "order",
"args": [{
"instId": "BTC-USDT-SWAP",
"tdMode": "cross",
"clOrdId": "algo20250601",
"side": "buy",
"ordType": "limit",
"px": "66000",
"sz": "10"
}]
}
服务器回执仅表示“已收到订单”,是否进入撮合引擎需继续监听 orders
频道。
3.4 修改、撤单与批量操作
功能 | REST | WebSocket |
---|---|---|
改单 | POST /api/v5/trade/amend-order | "op": "amend-order" |
撤单 | POST /api/v5/trade/cancel-order | "op": "cancel-order" |
批量 | POST /api/v5/trade/batch-orders | "op": "batch-orders" |
批量单次上限 20 笔,结果并非“全成功/全失败”;需逐条检查 sCode + sMsg
。
4. 账户、资金与仓位实时同步
4.1 账户频道(account)
订阅后立刻获得 币种余额快照,随后 每 5 秒 or 事件触发 推送变动数据。返回字段包含 totalEq(美元总权益)/ imr / mmr / upl 等。
4.2 资金、仓位最速推送:balance and position 频道
数据量更小、延迟更低,仅包含 现金余额变化 与 仓位调整,适合对速度极度敏感的交易策略。
4.3 Position ID 不变性规则
由组合字段 instId + mgnMode + posSide + ccy
拼接生成,
- 同品种重开仓位:同一 ID。
- 长期平仓后再开或切换账户模式:将生成 新 ID。
5. 高频开发中的细节锦囊
5.1 交易 ID(tradeId)与仓位对账
每个成交都会产生 唯一 tradeId,可用以下顺序与仓位字段交叉验证:
- 订单频道推送
fillSz
、fillTime
、tradeId
。 - 仓位频道以
tradeId
标记最后一次变动的来源成交。
陷阱提醒:
- 强平或 ADL 不会生成订单事件,且无 tradeId 无法直接对账,需依赖仓位
uTime
判断是否被系统强平。
5.2 防自成交(STP)
系统级默认 Cancel Maker。下单可通过 stpMode
指定:
- cancel_maker:保留吃单,取消挂单;
- cancel_taker:保留挂单,取消吃单;
- cancel_both:两边一起撤销(FOK 订单不支持)。
5.3 分页与时间过滤
所有包含历史数据的接口(订单、成交、账单、仓位历史)均支持 before/after + limit 的经典游标分页,也支持 begin/end 时间戳区间过滤。两者叠加时,先按时间筛再分页,避免漏单。
6. 常见问题 FAQ
Q1:为什么 orders 频道收不到挂单初始化数据?
A:该频道仅推送状态变化,如需完整未成交列表,请先用 REST GET /api/v5/trade/orders-pending 拉取再订阅。
Q2:杠杆状态修改一直返回“invalid lever”?
A:检查三点:币种(ccy)填写是否正确、当前账户模式是否支持跨币种、对应标的家族是否统一。
Q3:同账户在不同机器同时连接 WebSocket 会被踢线吗?
A:不会被踢线,多连接会同时收到相同的数据流,方便灾备。
Q4:如何优雅地监听超过二十个子账户?
A:为每个子账户独立建立连接与心跳即可;也可在服务器端代理转发,实现中心化风控后再分发事件。
Q5:仓位频道 Positions 与 balance and position 频道有什么区别?
A:Positions 返回更全的 持仓估算字段(liqPx、margin、uplRatio 等), balance and position 频道仅返回核心的 余额 + 持仓变化,延迟更低。
Q6:测试订单总是被立刻拒绝?
A:检查 clOrdId
是否重复,或者 tdMode
与账户模式/品种不匹配,最后确认是否在可交易时段。
7. 最后一英里:系统状态与运维
- REST:GET /api/v5/system/status 获取当前 全服务健康度。
- WebSocket status 频道 实时广播停服/升级计划。
对于 ≤5 秒的短维护窗口,平台默认停止撮合并让 WebSocket 断线;客户端只需 立即重连 即可,无需额外公告。
本文涵盖了 OKX API 从行情到下单的核心链路。读完立刻拥有可跑通的 Python、JavaScript 或 Go 模板代码。👉 点我一键下载无品牌专属示例工程