在学习如何高效调用 限价单 API 之前,先理清几个核心关键词:限价单、DEX 接口、链上撮合、钱包签名、订单参数、最小成交量。以下内容将围绕这些概念,带你一步步把理论转化为可落地的 Web3 交易脚本。
1. 了解限价单及其价值
限价单(Limit Order) 允许用户提前挂出“买低卖高”的预期价格,只有当市场价格触及此阈值时才自动撮合。相较于传统的“市价单”,它可以:
- 避免滑点,锁定利润;
- 放大 去中心化交易所(DEX) 的策略空间;
- 在低流动性市场中照样精准成交。
正因如此,各大 钱包即服务(WaaS) 都将“限价单创建”列为开发者的刚需功能。
2. 接口概览:稳妥的 POST 调用
POST https://web3.okx.com/api/v5/dex/aggregator/limit-order/save-order该接口支持以下 区块链网络:Ethereum、Polygon、BSC、Arbitrum、Optimism、Base 等主流 EVM 链。你只需确认目标链的 链 ID,即可轻松跨链挂单。
3. 关键参数全景解读
下面把请求体拆解成 12 个字段,每个都配真实案例,方便直接“抄作业”:
| 字段 | 是否必填 | 示例值 | 提示 |
|---|---|---|---|
| orderHash | ✅ | 0xabcd...1234 | 前端本地计算订单哈希,必须匹配链上结构 |
| signature | ✅ | 0xdead...beef | 钱包私钥对 orderHash 的 ECDSA 签名 |
| chainId | ✅ | 1 | Ethereum 主网 ID,不同测试网对应 5、11155111 等 |
| salt | ✅ | 1717043200 | Unix 时间戳,确保单次幂等 |
| makingAmount | ✅ | 1000000 | 卖出 USDT 1.00 单位,6 位精度 |
| takingAmount | ✅ | 450000000000000000 | 进账 DAI 0.45 单位,18 位精度,说明卖出价高于当前市价 |
| makerToken | ✅ | 0xdAC17... | USDT 合约,EIP-55 格式校验 |
| takerToken | ✅ | 0x6b17... | DAI 合约 |
| maker | ✅ | 0xYourWallet... | 自己的钱包地址 |
| deadLine | ✅ | 1725129600 | 订单 30 天后失效 |
| allowedSender | ✅ | 0x0000...0000 | 允许任意撮合者参与 |
| receiver | ✅ | 0xYourWallet... | 成交后资产接收地址,可与 maker 相同 |
| minReturn | ✅ | 440000000000000000 | 最少要到账 DAI 0.44,防止矿工作恶 |
| partiallyAble | ✅ | true | 允许部分成交而非一次性吃单 |
3.1 精度换算防踩坑
EVM 链代币精度从 6 到 18 不等,务必对照合约 decimals。误把 1 DAI 写成 1 会导致挂单金额缩水 1e18 倍,血本无归。
3.2 签名算法
- EIP-712 结构化哈希 为推荐标准;
- 使用
eth_signTypedData_v4调用即可快速签名; - 主流库:
@metamask/eth-sig-util(Node.js)或ethers.js(前端)。
4. 完整请求示例(curl + JSON)
curl -X POST https://web3.okx.com/api/v5/dex/aggregator/limit-order/save-order \
-H "Content-Type: application/json" \
-d '{
"orderHash": "0xfba0...c123",
"signature": "0x42f1...9b",
"chainId": "1",
"data": {
"salt": "1717043200",
"makingAmount": "1000000",
"takingAmount": "450000000000000000",
"makerToken": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"takerToken": "0x6B175474E89094C44Da98b954EedeAC495271d0F",
"maker": "0xYourWallet...",
"deadLine": "1725129600",
"allowedSender": "0x0000000000000000000000000000000000000000",
"receiver": "0xYourWallet...",
"minReturn": "440000000000000000",
"partiallyAble": true
}
}'5. 解析响应:成功与异常
返回体只有两个字段:
{
"code": "0",
"msg": ""
}code==0代表已广播至网络并进入撮合队列;code==51000意味着必填参数为空,检查makerToken、takerToken是否为 checkSum 格式;- 其余错误码可参考官方文档或 FAQ。
6. 实战案例:三步完成“DeFi 套利挂单”
假设你发现链上 DEX 的 ETH/USDC 价格偏离 CEX 4%。
链上报价:
- makerToken = USDC(6 位精度);
- takerToken = WETH(18 位精度);
- takingAmount 比市场价高 4%,挂出 1000 USDC 换 0.45 ETH;
- 本地签名 完成后立即 POST;
- 链上监控 当价格回落,Relay 机器人 30 秒内撮合,自动到账 0.447 ETH(已扣除矿工费与 0.1% 手续费)。
结果:无托管风险、链上透明、0 滑点完成套利。
7. 高频疑问 FAQ
Q1:为什么调用成功却迟迟不见成交?
A:限价单本质是先挂单后撮合。市场价格未达到设定点位时,就会一直处于 开放订单 状态。只要 deadLine 未过,完全可安心等待。
Q2:orderHash 计算能不能偷懒直接用后端接口?
A:不建议。链下计算再签名才能确保 无私钥泄露风险。公开 RPC 或被篡改的后端均可能伪造订单。
Q3:部分成交后剩余数量还能修改吗?
A:不能。若想调整,用原 salt 计算新版本并重新签名,deadLine 建议同步更新防止冲突。
Q4:签名方法兼容 Gnosis Safe 等多签钱包吗?
A:可以。只需在 Safe 的 “交互” 模块填入相同的 JSON 对象,多签成员逐条审批即可。
Q5:测试网是否有水龙头领 gas?
A:Ethereum Goerli、Polygon Mumbai、Arbitrum Goerli 等官方水龙头每日限量发放,也可加入社区推特转发活动获取小额 测试币。
Q6:如何批量创建 50 条限价单?
A:并发 POST 即可,目前单账户每分钟限 120 次;大量需求建议使用 队列+重试机制,并记录本地 orderHash 做幂等监控。
掌握以上要点后,你已具备在 Web3 世界里高效布阵 DEX 限价单 的能力。从接口字段到签名策略,再到实战套利脚本,环环相扣。立即动手,把“挂单即策略”的理念嵌入你的下一款 DApp 吧!