Skip to main content

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}