# OKX Algo Order Types (止盈止损/条件单)

## `conditional` vs `oco`

| 类型 | 用途 | TP/SL同时设? | 说明 |
|------|------|:---:|------|
| `conditional` | 单个触发条件 | ❌ 只能设一个 | 要么设TP、要么设SL，不能同时传两个 |
| `oco` | One-Cancels-Other | ✅ 同时设TP+SL | 一个触发后自动取消另一个 |

### 实测教训 (2026-07-02)

用 `ordType: 'conditional'` 同时传 `tpTriggerPx` + `slTriggerPx`：
- 响应 code=0（成功）
- 但数据结构中只有 SL 被设置，TP 字段为空
- 需单独再发第二个 conditional 订单补设 TP

**正确做法**：直接用 `ordType: 'oco'`，一次设好TP和SL。

## 参数对照

### OCO (推荐 - 一键TP+SL)

```json
{
  "instId": "SOL-USDT-SWAP",
  "tdMode": "cross",
  "side": "buy",          // 平空=买入, 平多=卖出
  "posSide": "net",
  "ordType": "oco",
  "sz": "0.1",
  "tpTriggerPx": "80.00",
  "tpOrdPx": "-1",        // -1 = 市价
  "tpTriggerPxType": "last",
  "slTriggerPx": "84.50",
  "slOrdPx": "-1",        // -1 = 市价
  "slTriggerPxType": "last",
  "reduceOnly": "true"
}
```

### Conditional (单边 - 仅TP或仅SL)

```json
{
  "instId": "SOL-USDT-SWAP",
  "tdMode": "cross",
  "side": "buy",
  "posSide": "net",
  "ordType": "conditional",
  "sz": "0.1",
  "tpTriggerPx": "80.00",
  "tpOrdPx": "-1",
  "tpTriggerPxType": "last"
}
```

## 多开预防 (重要)

**每次开仓设止盈止损前必须做：**

1. `GET /api/v5/trade/orders-algo-pending?instType=SWAP&instId=SOL-USDT-SWAP&ordType=conditional`
2. `GET /api/v5/trade/orders-algo-pending?instType=SWAP&instId=SOL-USDT-SWAP&ordType=oco`
3. 如有 pending algo，调用 `POST /api/v5/trade/cancel-algos` 逐个取消
4. 等 0.5s 让取消传播后，再设新的 OCO

`okx_position_advisor.py` 的 `execute_order()` 已内置此检查步骤。
