订单管理 (Orders)
创建和管理交易订单。所有订单操作都需要使用 EIP-712 签名进行验证。
创建订单
创建限价单或市价单。系统会自动验证余额、计算保证金,并提交到撮合引擎。
接口信息
- Method:
POST - Path:
/api/v1/orders - Authentication: 需要 JWT Token(Bearer Token)
- Content-Type:
application/json
请求参数
| 参数 | 类型 | 必须 | 描述 |
|---|---|---|---|
| symbol | string | 是 | 交易对(如 BTCUSDT、ETHUSDT) |
| side | string | 是 | 方向:buy 或 sell |
| order_type | string | 是 | 类型:limit(限价单)或 market(市价单) |
| amount | string | 是 | 数量(Decimal 字符串,如 "0.1") |
| price | string | 否 | 价格(Decimal 字符串,限价单必填,市价单填 "0") |
| leverage | number | 是 | 杠杆倍数(1-50) |
| signature | string | 是 | EIP-712 签名(0x 开头) |
| timestamp | number | 是 | Unix 时间戳(秒,需在 5 分钟内有效) |
EIP-712 签名
订单需要使用 EIP-712 结构化签名。签名的 typed data 结构如下:
{
"types": {
"EIP712Domain": [
{ "name": "name", "type": "string" },
{ "name": "version", "type": "string" },
{ "name": "chainId", "type": "uint256" },
{ "name": "verifyingContract", "type": "address" }
],
"CreateOrder": [
{ "name": "wallet", "type": "address" },
{ "name": "symbol", "type": "string" },
{ "name": "side", "type": "string" },
{ "name": "orderType", "type": "string" },
{ "name": "price", "type": "string" },
{ "name": "amount", "type": "string" },
{ "name": "leverage", "type": "uint32" },
{ "name": "timestamp", "type": "uint256" }
]
},
"primaryType": "CreateOrder",
"domain": {
"name": "ZTDX",
"version": "1",
"chainId": 421614, // Arbitrum Sepolia
"verifyingContract": "<VaultContractAddress>"
},
"message": {
"wallet": "0x742d35cc6634c0532925a3b844bc9e7595f0beb",
"symbol": "BTCUSDT",
"side": "buy",
"orderType": "limit",
"price": "65000",
"amount": "0.1",
"leverage": 10,
"timestamp": "1704067200"
}
}
重要
side和orderType必须是小写字符串("buy"/"sell"、"limit"/"market")price、amount必 须是 Decimal 字符串(不是 number)- 市价单的
price填"0" timestamp是秒级时间戳(不是毫秒)
前端签名示例(ethers.js v6)
import { BrowserProvider } from 'ethers';
async function createOrder(order) {
const wallet = await getConnectedWallet();
const timestamp = Math.floor(Date.now() / 1000);
// 构造 EIP-712 typed data
const domain = {
name: "ZTDX",
version: "1",
chainId: 421614,
verifyingContract: vaultAddress
};
const types = {
CreateOrder: [
{ name: "wallet", type: "address" },
{ name: "symbol", type: "string" },
{ name: "side", type: "string" },
{ name: "orderType", type: "string" },
{ name: "price", type: "string" },
{ name: "amount", type: "string" },
{ name: "leverage", type: "uint32" },
{ name: "timestamp", type: "uint256" }
]
};
const message = {
wallet: wallet.address.toLowerCase(),
symbol: order.symbol,
side: order.side, // "buy" or "sell"
orderType: order.order_type, // "limit" or "market"
price: order.price || "0",
amount: order.amount,
leverage: order.leverage,
timestamp: timestamp.toString()
};
// 签名
const provider = new BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const signature = await signer.signTypedData(domain, types, message);
// 发送请求
const response = await fetch('/api/v1/orders', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${jwtToken}`
},
body: JSON.stringify({
symbol: order.symbol,
side: order.side,
order_type: order.order_type,
amount: order.amount,
price: order.price || undefined,
leverage: order.leverage,
signature,
timestamp
})
});
return response.json();
}
请求示例
限价单
{
"symbol": "BTCUSDT",
"side": "buy",
"order_type": "limit",
"amount": "0.1",
"price": "65000",
"leverage": 10,
"signature": "0xabcdef123456...",
"timestamp": 1704067200
}
市价单
{
"symbol": "ETHUSDT",
"side": "sell",
"order_type": "market",
"amount": "1.5",
"leverage": 5,
"signature": "0x123456abcdef...",
"timestamp": 1704067200
}
市价单说明
- 市价单不需要提供
price参数(或填null) - 市价单会以当前最优价格立即成交
- 系统有自动做市商确保市价单始终有流动性
响应示例
{
"order_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "open",
"filled_amount": "0",
"remaining_amount": "0.1",
"average_price": "0",
"created_at": 1704067200000
}
响应字段说明
| 字段 | 类型 | 描述 |
|---|---|---|
| order_id | string | 订单 UUID |
| status | string | 订单状态(见下表) |
| filled_amount | string | 已成交数量(Decimal 字符串) |
| remaining_amount | string | 剩余未成交数量(Decimal 字符串) |
| average_price | string | 平均成交价格(Decimal 字符串,未成交时为 "0") |
| created_at | number | 创建时间(毫秒级时间戳) |
订单状态说明
| 状态 | 说明 | 可取消 |
|---|---|---|
| pending | 待处理(刚提交,尚未进入撮合) | ✅ |
| open | 已挂单(活动中,等待成交) | ✅ |
| partially_filled | 部分成交 | ✅ |
| filled | 完全成交 | ❌ |
| cancelled | 已取消 | ❌ |
| rejected | 已拒绝(参数错误或余额不足) | ❌ |
智能保证金计算
系统会根据订单类型智能计算所需保证金:
1. 开仓/加仓订单
基础保证金 = (数量 × 价格) ÷ 杠杆
手续费缓冲 = 基础保证金 × 0.5%
所需保证金 = 基础保证金 + 手续费缓冲
示例:买入 0.1 BTC @ 65000 USD,10x 杠杆
- 名义价值 = 0.1 × 65000 = 6500 USD
- 基础保证金 = 6500 ÷ 10 = 650 USD
- 手续费缓冲 = 650 × 0.005 = 3.25 USD
- 所需保证金 = 653.25 USD
2. 平仓订单(智能优化)
如果订单是平仓(买入平空仓,或卖出平多仓),系统会大幅减少保证金要求:
- 完全平仓:只需手续费(约 0.5%)
- 部分平仓:只需净开仓部分的保证金
示例:已有 0.2 BTC 多仓,现卖出 0.15 BTC
- 平仓部分(0.15 BTC):只需手续费
- 无需额外保证金!
示例:已有 0.1 BTC 多仓,现卖出 0.2 BTC
- 平仓部分(0.1 BTC):只需手续费
- 开仓部分(0.1 BTC):需要正常保证金
- 所需保证金 = 0.1 BTC 的开仓保证金
资金利用率
这个智能保证金机制可以让您用更少的资金进行平仓操作,提高资金利用率!
错误响应
| HTTP 状态码 | 错误码 | 描述 |
|---|---|---|
| 400 | INVALID_SYMBOL | 不支持的交易对 |
| 400 | TIMESTAMP_EXPIRED | 时间戳已过期(超过 5 分钟) |
| 400 | INVALID_LEVERAGE | 杠杆倍数必须在 1-50 之间 |
| 400 | INVALID_AMOUNT | 订单数量必须大于 0 |
| 400 | PRICE_REQUIRED | 限价单必须指定价格 |
| 400 | INSUFFICIENT_BALANCE | 可用余额不足(需要 xxx USDT 作为保证金) |
| 400 | INVALID_SIGNATURE_FORMAT | 签名格式无效 |
| 401 | SIGNATURE_INVALID | EIP-712 签名验证失败 |
| 500 | MATCHING_ERROR | 撮合引擎错误 |
| 500 | DB_ERROR | 数据库错误 |
查询订单
查询单个订单的详细信息。
接口信息
- Method:
GET - Path:
/api/v1/orders/:order_id - Authentication: 需要 JWT Token