欧易 · API 下单
attachAlgoOrds 里的止盈止损要等母单成交才会生效
用欧易 API 下单时顺手带上止盈止损,是在下单接口 POST /api/v5/trade/order 的请求体里加一个 attachAlgoOrds 数组。止盈填 tpTriggerPx(触发价)和 tpOrdPx(委托价),止损填 slTriggerPx 和 slOrdPx,委托价写 -1,触发后按市价执行。要分几批止盈,就往数组里放几个对象,每个对象带自己的数量。
这样挂上的止盈止损跟着母单走。想让它不依附任何一笔新单单独存在,用策略委托接口 POST /api/v5/trade/order-algo 另下。
止盈止损的触发价和委托价要成对填
触发价和委托价是一对:填了 tpTriggerPx 就必须填 tpOrdPx,止损那边同理。只有限价止盈例外,它只填委托价,不需要触发价。触发价还有一种比例写法,适用范围见下表。
| 字段 | 用途 | 怎么填 |
|---|---|---|
| attachAlgoClOrdId | 自定义的策略订单 ID | 字母和数字,1 到 32 位 |
| tpTriggerPx / tpOrdPx | 止盈触发价 / 止盈委托价 | 条件止盈两个都填;限价止盈只填 tpOrdPx;委托价 -1 为市价止盈 |
| tpTriggerRatio | 止盈触发比例 | 只用于交割、永续;和 tpTriggerPx 只能传一个 |
| slTriggerPx / slOrdPx | 止损触发价 / 止损委托价 | 填一个就必须填另一个;委托价 -1 为市价止损 |
| slTriggerRatio | 止损触发比例 | 只用于交割、永续;和 slTriggerPx 只能传一个 |
| tpOrdKind | 止盈订单类型 | condition 条件单(默认)或 limit 限价单 |
| tpTriggerPxType / slTriggerPxType | 触发价类型 | last、index、mark 三选一 |
| sz | 这一笔止盈的数量 | 只用于多笔止盈的止盈单,用时必填 |
| amendPxOnTriggerType | 开仓价止损 | 只用于分批止盈的止损单;0 不开启(默认),1 开启 |
| callbackRatio / callbackSpread / activePx | 移动止盈止损 | 只用于 ordType = move_order_stop |
给永续开多单附上止盈和止损的请求体这样写
下面这段在 BTC-USDT-SWAP 上挂一张限价开多单,成交后带一组止盈、一组止损,两边都按标记价判断触发、按市价执行。价格和张数都是占位,换成你自己的。
{
"instId": "BTC-USDT-SWAP",
"tdMode": "cross",
"side": "buy",
"posSide": "long",
"ordType": "limit",
"px": "60000",
"sz": "1",
"clOrdId": "open001",
"attachAlgoOrds": [
{
"attachAlgoClOrdId": "tpsl001",
"tpTriggerPx": "66000",
"tpOrdPx": "-1",
"tpTriggerPxType": "mark",
"slTriggerPx": "57000",
"slOrdPx": "-1",
"slTriggerPxType": "mark"
}
]
}
不分批时,止盈和止损按理可以写在同一个对象里:51076 的单向限制只针对分批止盈。
外层几项要和账户设置对上。side 填 buy、posSide 填 long,在开平仓模式下就是买入开多;账户是买卖模式的,posSide 不传或传 net。全仓永续的 tdMode 填 cross。永续的 sz 是合约张数,填 1 就是 1 张。
发出去以后先看返回:code 为 0 只说明请求成功,这笔单下没下成,要看 data 里的 sCode,为 0 才算成功,不为 0 时读 sMsg 和 subCode。被拒的单在脚本里怎么接住、别让循环原样重发,见OKX API 自动交易风控:仓位上限、防重单与异常处理。这段请求先用模拟盘的 Key 发一遍,再换实盘 Key;模拟盘怎么开,见欧易模拟盘怎么用:先拿假钱把策略跑通(ccxt 实操)。
母单没成交就被撤时附带的止盈止损会一起丢掉
附带的止盈止损在母单成交后才生成并激活。母单在任何成交之前被撤,它们一并丢弃。
拿下面这张表对一下自己的情况:
| 你的情况 | attachAlgoOrds | order-algo |
|---|---|---|
| 开仓单成交后要自动带上止盈止损,开仓单撤了它也不用留 | 适用 | 不必 |
| 止盈止损要独立于开仓单存在 | 不适用 | 用它另下 |
| 币币市价买单,tgtCcy 为 base_ccy | 不支持 | 用它另下 |
| 币币市价卖单,tgtCcy 为 quote_ccy | 不支持 | 用它另下 |
tgtCcy 两个取值分别让 sz 按什么单位算,见欧易 API 市价单 sz 填币数还是 USDT。order-algo 的 ordType 等参数不在下单接口的说明里,要到文档里 order-algo 自己那一节去查。
分批止盈怎么填才不报 51076、51083 这类错?
分批止盈就是在 attachAlgoOrds 里放多个止盈对象,每个对象带 sz,止损最多再加一个对象。限价止盈和触发止盈都能分批,填错时接口直接返回对应的错误码:
| 要求 | 不满足时的错误码 |
|---|---|
| 每个对象只能单向:止盈一组或止损一组,不能两组都填 | 51076 |
| 各笔止盈的触发价类型(tpTriggerPxType)一致 | 51080 |
| 各笔止盈的触发价不能相等 | 51081 |
| 每笔止盈的数量不能为空 | 51089 |
| 各笔止盈数量之和等于母单的委托数量 | 51083 |
| 止盈委托不超过 10 笔 | 51079 |
| 止损委托不超过 1 笔 | 51084 |
| 各笔止盈的类型一致 | 51091 |
| 各笔止盈的委托价不能相等 | 51092 |
| 限价止盈的委托价不能填 -1 | 51093 |
| 币币、杠杆、期权不支持限价止盈 | 51094 |
| 币币、杠杆不支持开仓价止损 | 51077 |
| 开了开仓价止损(amendPxOnTriggerType = 1),止盈至少 2 笔 | 51085 |
开仓价止损的意思是:第一笔止盈触发时,止损触发价移到开仓均价。开启时止损触发价不能为空。
把上一节那张开多单改成 2 张、分两批止盈,再加一个开仓价止损,attachAlgoOrds 这样写:
"sz": "2",
"attachAlgoOrds": [
{ "attachAlgoClOrdId": "tp001", "tpTriggerPx": "64000", "tpOrdPx": "64000", "sz": "1" },
{ "attachAlgoClOrdId": "tp002", "tpTriggerPx": "68000", "tpOrdPx": "68000", "sz": "1" },
{ "attachAlgoClOrdId": "sl001", "slTriggerPx": "57000", "slOrdPx": "-1", "amendPxOnTriggerType": "1" }
]
逐条对一下:两笔止盈数量 1 + 1 = 2,等于母单的 2 张(51083);止盈 2 笔,开仓价止损的下限刚好够(51085);两笔触发价 64000 和 68000 不同(51081);触发价类型都用默认值,类型一致(51080);止损对象只有一个,只填止损一组(51084、51076)。两笔止盈的委托价都填 -1 算不算「相等」,文档里找不到说明,示例里填了两个不同的价格,不去碰 51092。
止盈止损按哪种价触发、现货能否按比例、怎么单独编号
止盈止损默认按最新价还是标记价触发?
不传 tpTriggerPxType、slTriggerPxType 时按最新价(last)触发。这两个字段还可以选 index(指数价格)和 mark(标记价格)。做分批止盈时,同一笔订单上各笔止盈的触发价类型必须一致,否则报 51080。
现货单能按百分比设止盈止损吗?
tpTriggerRatio、slTriggerRatio 只适用于交割和永续合约,现货单要写 tpTriggerPx、slTriggerPx 这样的具体价格。比例用小数表示,0.3 代表 30%,和对应的触发价只能传一个。主单是买单时,tpTriggerRatio 要大于 0,slTriggerRatio 在 0 到 1 之间;主单是卖单时,tpTriggerRatio 在 -1 到 0 之间,slTriggerRatio 大于 0。
下单时传的 clOrdId 能查到附带的止盈止损吗?
clOrdId 不会传到附带的止盈止损策略订单上。要给它们单独编号,填 attachAlgoClOrdId:订单完全成交、下附带策略委托单时,这个值会传给 algoClOrdId。tpOrdKind 为 limit 且只有一笔单边止盈时,attachAlgoClOrdId 还能当作 clOrdId 在获取订单信息接口里查。