rust_okx/ws/model/algo.rs
1//! Algo trading channel models (`orders-algo`, `algo-advance`).
2//!
3//! Private channels; login required.
4
5use serde::Deserialize;
6use serde_json::Value;
7
8use super::ExtraFields;
9use crate::model::NumberString;
10
11/// Linked regular order reference carried on an algo order.
12#[derive(Debug, Clone, Default, Deserialize)]
13#[serde(rename_all = "camelCase")]
14#[non_exhaustive]
15pub struct LinkedOrder {
16 /// OKX-assigned order ID of the linked regular order.
17 #[serde(default)]
18 pub ord_id: String,
19}
20
21/// Private `orders-algo` channel row.
22///
23/// OKX docs: <https://www.okx.com/docs-v5/en/#order-book-trading-algo-trading-ws-algo-orders-channel>
24#[derive(Debug, Clone, Default, Deserialize)]
25#[serde(rename_all = "camelCase")]
26#[non_exhaustive]
27pub struct AlgoOrderUpdate {
28 /// Instrument type, e.g., `SPOT`, `MARGIN`, `SWAP`, `FUTURES`, `OPTION`.
29 #[serde(default)]
30 pub inst_type: String,
31 /// Instrument ID, e.g., `BTC-USDT`.
32 #[serde(default)]
33 pub inst_id: String,
34 /// Margin currency (cross-margin orders only).
35 #[serde(default)]
36 pub ccy: String,
37 /// OKX-assigned regular order ID (populated when the algo fires and places an order).
38 #[serde(default)]
39 pub ord_id: String,
40 /// List of regular order IDs associated with this algo order.
41 #[serde(default)]
42 pub ord_id_list: Vec<String>,
43 /// Client-supplied order ID, if any.
44 #[serde(default)]
45 pub cl_ord_id: String,
46 /// OKX-assigned algo order ID.
47 #[serde(default)]
48 pub algo_id: String,
49 /// Client-supplied algo order ID.
50 #[serde(default)]
51 pub algo_cl_ord_id: String,
52 /// Order size.
53 #[serde(default)]
54 pub sz: NumberString,
55 /// Algo order type.
56 ///
57 /// Documented values: `conditional`, `oco`, `trigger`, `move_order_stop`,
58 /// `chase_order`, `iceberg`, `twap`.
59 #[serde(default)]
60 pub ord_type: String,
61 /// Order side: `buy` or `sell`.
62 #[serde(default)]
63 pub side: String,
64 /// Position side: `long`, `short`, or `net`.
65 #[serde(default)]
66 pub pos_side: String,
67 /// Trade mode: `cross`, `isolated`, or `cash`.
68 #[serde(default)]
69 pub td_mode: String,
70 /// Target currency for quantity (spot currency-trade only): `base_ccy` or `quote_ccy`.
71 #[serde(default)]
72 pub tgt_ccy: String,
73 /// Algo order state.
74 ///
75 /// Documented values: `live`, `pause`, `partially_effective`, `effective`,
76 /// `canceled`, `order_failed`, `partially_failed`.
77 #[serde(default)]
78 pub state: String,
79 /// Leverage.
80 #[serde(default)]
81 pub lever: NumberString,
82 /// Estimated notional value in USD.
83 #[serde(default)]
84 pub notional_usd: NumberString,
85 /// Last traded price at the time of the push.
86 #[serde(default)]
87 pub last: NumberString,
88 /// Actual order size when the algo fires.
89 #[serde(default)]
90 pub actual_sz: NumberString,
91 /// Actual order price when the algo fires.
92 #[serde(default)]
93 pub actual_px: NumberString,
94 /// Effective side of the actual order when the algo fires.
95 #[serde(default)]
96 pub actual_side: String,
97 /// Trigger price (for `trigger` and `move_order_stop` types).
98 #[serde(default)]
99 pub trigger_px: NumberString,
100 /// Trigger price type: `last`, `index`, or `mark`.
101 #[serde(default)]
102 pub trigger_px_type: String,
103 /// Trigger time (Unix milliseconds).
104 #[serde(default)]
105 pub trigger_time: NumberString,
106 /// Take-profit trigger price.
107 #[serde(default)]
108 pub tp_trigger_px: NumberString,
109 /// Take-profit trigger price type: `last`, `index`, or `mark`.
110 #[serde(default)]
111 pub tp_trigger_px_type: String,
112 /// Take-profit order price; `-1` means market order.
113 #[serde(default)]
114 pub tp_ord_px: NumberString,
115 /// Stop-loss trigger price.
116 #[serde(default)]
117 pub sl_trigger_px: NumberString,
118 /// Stop-loss trigger price type: `last`, `index`, or `mark`.
119 #[serde(default)]
120 pub sl_trigger_px_type: String,
121 /// Stop-loss order price; `-1` means market order.
122 #[serde(default)]
123 pub sl_ord_px: NumberString,
124 /// Order price used when the algo fires.
125 #[serde(default)]
126 pub ord_px: NumberString,
127 /// Trailing callback ratio (for `move_order_stop` and `chase_order` types).
128 #[serde(default)]
129 pub callback_ratio: NumberString,
130 /// Trailing callback spread (for `move_order_stop` and `chase_order` types).
131 #[serde(default)]
132 pub callback_spread: NumberString,
133 /// Activated tracking price (for `move_order_stop` and `chase_order` types).
134 #[serde(default)]
135 pub active_px: NumberString,
136 /// Price that activated the trailing move trigger.
137 #[serde(default)]
138 pub move_trigger_px: NumberString,
139 /// Whether this is a reduce-only order: `"true"` or `"false"`.
140 #[serde(default)]
141 pub reduce_only: String,
142 /// Order tag.
143 #[serde(default)]
144 pub tag: String,
145 /// Error code when state is `order_failed`; empty otherwise.
146 #[serde(default)]
147 pub fail_code: String,
148 /// Human-readable reason for failure.
149 #[serde(default)]
150 pub fail_reason: String,
151 /// Amend-price-on-trigger type.
152 ///
153 /// Documented values: `0` (no amend), `1` (amend to market price at trigger).
154 #[serde(default)]
155 pub amend_px_on_trigger_type: String,
156 /// Result of the last amend request.
157 #[serde(default)]
158 pub amend_result: String,
159 /// Fraction of the position to close.
160 #[serde(default)]
161 pub close_fraction: String,
162 /// Quick margin type.
163 #[serde(default)]
164 pub quick_mgn_type: String,
165 /// Client-supplied request ID for the latest amend.
166 #[serde(default)]
167 pub req_id: String,
168 /// The quote currency used for trading.
169 #[serde(default)]
170 pub trade_quote_ccy: String,
171 /// Linked regular order; present when the algo has fired and placed an order.
172 #[serde(default)]
173 pub linked_ord: Option<LinkedOrder>,
174 /// Whether the order uses borrow mode.
175 ///
176 /// OKX sends `""` for non-applicable order types and a JSON boolean (`true`/`false`)
177 /// for applicable ones, so this field uses `Value` to handle both.
178 #[serde(default)]
179 pub is_trade_borrow_mode: Value,
180 /// Attached TP/SL algo orders.
181 #[serde(default)]
182 pub attach_algo_ords: Vec<Value>,
183 /// Algo order creation time (Unix milliseconds).
184 #[serde(default)]
185 pub c_time: NumberString,
186 /// Last update time (Unix milliseconds).
187 #[serde(default)]
188 pub u_time: NumberString,
189 /// Push time (Unix milliseconds).
190 #[serde(default)]
191 pub p_time: NumberString,
192 /// Unrecognized fields retained for forward compatibility.
193 #[serde(flatten, default)]
194 pub extra: ExtraFields,
195}
196
197/// Private `algo-advance` channel row.
198///
199/// OKX docs: <https://www.okx.com/docs-v5/en/#order-book-trading-algo-trading-ws-advance-algo-orders-channel>
200#[derive(Debug, Clone, Default, Deserialize)]
201#[serde(rename_all = "camelCase")]
202#[non_exhaustive]
203pub struct AdvancedAlgoOrderUpdate {
204 /// Instrument type, e.g., `SPOT`, `SWAP`, `FUTURES`.
205 #[serde(default)]
206 pub inst_type: String,
207 /// Instrument ID, e.g., `BTC-USDT`.
208 #[serde(default)]
209 pub inst_id: String,
210 /// Margin currency.
211 #[serde(default)]
212 pub ccy: String,
213 /// OKX-assigned order ID of the associated regular order.
214 #[serde(default)]
215 pub ord_id: String,
216 /// OKX-assigned algo order ID.
217 #[serde(default)]
218 pub algo_id: String,
219 /// Client-supplied order ID.
220 #[serde(default)]
221 pub cl_ord_id: String,
222 /// Client-supplied algo order ID.
223 #[serde(default)]
224 pub algo_cl_ord_id: String,
225 /// Advanced algo order type: `iceberg` or `twap`.
226 #[serde(default)]
227 pub ord_type: String,
228 /// Order side: `buy` or `sell`.
229 #[serde(default)]
230 pub side: String,
231 /// Position side: `long`, `short`, or `net`.
232 #[serde(default)]
233 pub pos_side: String,
234 /// Trade mode: `cross`, `isolated`, or `cash`.
235 #[serde(default)]
236 pub td_mode: String,
237 /// Target currency for quantity: `base_ccy` or `quote_ccy` (spot market orders only).
238 #[serde(default)]
239 pub tgt_ccy: String,
240 /// Total order size.
241 #[serde(default)]
242 pub sz: NumberString,
243 /// Leverage.
244 #[serde(default)]
245 pub lever: NumberString,
246 /// Order state.
247 ///
248 /// Documented values: `live`, `pause`, `partially_effective`, `effective`,
249 /// `canceled`, `order_failed`.
250 #[serde(default)]
251 pub state: String,
252 /// Take-profit trigger price.
253 #[serde(default)]
254 pub tp_trigger_px: NumberString,
255 /// Take-profit order price.
256 #[serde(default)]
257 pub tp_ord_px: NumberString,
258 /// Stop-loss trigger price.
259 #[serde(default)]
260 pub sl_trigger_px: NumberString,
261 /// Stop-loss order price.
262 #[serde(default)]
263 pub sl_ord_px: NumberString,
264 /// Trigger price.
265 #[serde(default)]
266 pub trigger_px: NumberString,
267 /// Limit price for each child order placed by the algo.
268 #[serde(default)]
269 pub ord_px: NumberString,
270 /// Size executed so far.
271 #[serde(default)]
272 pub actual_sz: NumberString,
273 /// Average fill price of executed child orders.
274 #[serde(default)]
275 pub actual_px: NumberString,
276 /// Estimated notional value in USD.
277 #[serde(default)]
278 pub notional_usd: NumberString,
279 /// Order tag.
280 #[serde(default)]
281 pub tag: String,
282 /// Effective side of executed child orders.
283 #[serde(default)]
284 pub actual_side: String,
285 /// Trigger time (Unix milliseconds).
286 #[serde(default)]
287 pub trigger_time: NumberString,
288 /// Price ratio (iceberg / twap orders).
289 #[serde(default)]
290 pub px_var: NumberString,
291 /// Price variance (iceberg / twap orders).
292 #[serde(default)]
293 pub px_spread: NumberString,
294 /// Average amount per child order (iceberg / twap orders).
295 #[serde(default)]
296 pub sz_limit: NumberString,
297 /// Price limit (iceberg / twap orders).
298 #[serde(default)]
299 pub px_limit: NumberString,
300 /// Time interval between child orders (twap orders).
301 #[serde(default)]
302 pub time_interval: NumberString,
303 /// Total number of child orders placed (iceberg / twap orders).
304 #[serde(default)]
305 pub count: NumberString,
306 /// Trailing callback ratio (move_order_stop orders).
307 #[serde(default)]
308 pub callback_ratio: NumberString,
309 /// Trailing callback spread (move_order_stop orders).
310 #[serde(default)]
311 pub callback_spread: NumberString,
312 /// Activated tracking price (move_order_stop orders).
313 #[serde(default)]
314 pub active_px: NumberString,
315 /// Price that activated the trailing move trigger.
316 #[serde(default)]
317 pub move_trigger_px: NumberString,
318 /// Error code when state is `order_failed`; empty otherwise.
319 #[serde(default)]
320 pub fail_code: String,
321 /// Whether the order can only reduce the position size: `"true"` or `"false"`.
322 #[serde(default)]
323 pub reduce_only: String,
324 /// The quote currency used for trading.
325 #[serde(default)]
326 pub trade_quote_ccy: String,
327 /// Whether borrowing currency automatically.
328 ///
329 /// OKX sends a JSON boolean (`true`/`false`) for applicable order types; uses `Value`
330 /// to accommodate any future variation.
331 #[serde(default)]
332 pub is_trade_borrow_mode: Value,
333 /// Algo order creation time (Unix milliseconds).
334 #[serde(default)]
335 pub c_time: NumberString,
336 /// Push time (Unix milliseconds).
337 #[serde(default)]
338 pub p_time: NumberString,
339 /// Unrecognized fields retained for forward compatibility.
340 #[serde(flatten, default)]
341 pub extra: ExtraFields,
342}