下单
接口描述
创建并提交一个新订单。
HTTP请求
POST /fapi/v1/order (HMAC SHA256)
请求权重
0 (下单接口不消耗通用权重,但受下单频率限制)
请求参数
| 名称 | 类型 | 是否必需 | 描述 |
|---|---|---|---|
| symbol | STRING | YES | 交易对 |
| side | ENUM | YES | 买卖方向: BUY, SELL |
| positionSide | ENUM | NO | 持仓方向: BOTH, LONG, SHORT(当前仅支持 BOTH —— ZTDX 仅支持单向持仓模式) |
| type | ENUM | YES | 订单类型: LIMIT, MARKET, STOP, TAKE_PROFIT, STOP_MARKET, TAKE_PROFIT_MARKET, TRAILING_STOP_MARKET。STOP_LIMIT 与 TAKE_PROFIT_LIMIT 接受为 STOP 与 TAKE_PROFIT 的别名。 |
| reduceOnly | BOOL 或 STRING | NO | true / false / "true" / "false"。reduceOnly 单在 admission 时按对侧持仓数量上限收口;如果该单本应开仓或反向,将被拒。reduceOnly=true 订单豁免 MIN_NOTIONAL 过滤器,确保 < 10 USD 的残余仓位也能平掉;LOT_SIZE 与 MAX_NOTIONAL 仍然适用。 |
| quantity | DECIMAL | NO | 下单数量。会向下对齐到 symbol 的 lot size;产生的名义额必须满足 symbol 的最小/最大边界,否则返回 -1013。错误消息以 Filter failure: <FILTER>. 开头,<FILTER> 为 LOT_SIZE / MIN_NOTIONAL / MAX_NOTIONAL 之一,客户端可据此 switch。 |
| price | DECIMAL | NO | 委托价格 |
| newClientOrderId | STRING | NO | 用户自定义 ID。会持久化,query-order / all-orders 会原样返回。 |
| stopPrice | DECIMAL | NO | 触发价格。提交时若触发条件已被满足,直接返回 -2021 拒绝。 |
| activationPrice | DECIMAL | NO | 激活价格 (仅限跟踪止损单) |
| callbackRate | DECIMAL | NO | 回调幅度 (仅限跟踪止损单) |
| timeInForce | ENUM | NO | 有效方式: GTC, IOC, FOK, GTX。GTX 是 post-only —— 与对手价交叉的 GTX 单返回 -2010。IOC / FOK 语义在引擎层严格执行。 |
| workingType | ENUM | NO | 触发类型: MARK_PRICE, CONTRACT_PRICE |
| recvWindow | LONG | NO | 详见 接口鉴权 |
| timestamp | LONG | YES | 时间戳 |
在市价入场单上挂止盈 / 止损
需要在开仓的同时挂止盈和/或止损时,先单独下市价入场单,再用一两笔 反向 reduceOnly 触发单挂在对应触发价上:
| 订单 | type | side | stopPrice | reduceOnly |
|---|---|---|---|---|
| 入场 | MARKET | 你的开仓方向 (BUY / SELL) | — | false |
| 止盈 | TAKE_PROFIT_MARKET | 与入场相反 | 止盈触发价 | true |
| 止损 | STOP_MARKET | 与入场相反 | 止损触发价 | true |
触发单的 stopPrice 按 workingType(MARK_PRICE 或
CONTRACT_PRICE)被命中时按市价执行。如果你以其他方式手动平仓,
请通过 DELETE /fapi/v1/order 显式撤销这些触发单 —— 它们与入场单
之间没有联动关系。
响应示例
{
"clientOrderId": "testOrder1",
"cumQty": "0",
"cumQuote": "0",
"executedQty": "0",
"orderId": 2254222045,
"avgPrice": "0.00000",
"origQty": "10",
"price": "0",
"reduceOnly": false,
"side": "SELL",
"positionSide": "BOTH",
"status": "NEW",
"stopPrice": "0",
"closePosition": false,
"symbol": "BTCUSDT",
"timeInForce": "GTC",
"type": "TRAILING_STOP_MARKET",
"origType": "TRAILING_STOP_MARKET",
"activatePrice": "9020",
"priceRate": "0.3",
"updateTime": 1566818724722,
"workingType": "CONTRACT_PRICE",
"priceProtect": false
}
代码示例
cURL
API_KEY="your_api_key"
API_SECRET="your_api_secret"
TIMESTAMP=$(date +%s%3N)
QUERY_STRING="symbol=BTCUSDT&side=BUY&type=LIMIT&timeInForce=GTC&quantity=0.01&price=60000×tamp=${TIMESTAMP}"
SIGNATURE=$(echo -n "${QUERY_STRING}" | openssl dgst -sha256 -hmac "${API_SECRET}" | awk '{print $2}')
curl -s -X POST \
-H "X-MBX-APIKEY: ${API_KEY}" \
"https://api-sepolia.ztdx.io/fapi/v1/order?${QUERY_STRING}&signature=${SIGNATURE}"
Python
import time, hmac, hashlib, requests, json
API_KEY = "your_api_key"
API_SECRET = "your_api_secret"
BASE_URL = "https://api.ztdx.io"
def sign(msg: str) -> str:
return hmac.new(API_SECRET.encode(), msg.encode(), hashlib.sha256).hexdigest()
def signed_post(path, body={}):
ts = int(time.time() * 1000)
qs = f"timestamp={ts}"
body_str = json.dumps(body, separators=(',', ':'))
sig = sign(qs + body_str)
return requests.post(
f"{BASE_URL}{path}?timestamp={ts}&signature={sig}",
data=body_str,
headers={"X-MBX-APIKEY": API_KEY, "Content-Type": "application/json"},
)
# Place a LIMIT BUY order for BTCUSDT
resp = signed_post("/fapi/v1/order", body={
"symbol": "BTCUSDT",
"side": "BUY",
"type": "LIMIT",
"timeInForce": "GTC",
"quantity": "0.01",
"price": "60000",
})
print(resp.json())