Skip to main content

rust_okx/api/trade/
responses.rs

1use serde::Deserialize;
2
3use crate::{
4    NumberString,
5    model::{OrderSide, OrderState, OrderType, PositionSide, TradeMode},
6};
7
8mod advanced;
9mod algo;
10
11pub use advanced::*;
12pub use algo::*;
13
14/// The result of placing an order.
15#[derive(Debug, Clone, Deserialize)]
16#[serde(rename_all = "camelCase")]
17#[non_exhaustive]
18pub struct PlaceOrderResult {
19    /// OKX order ID.
20    #[serde(default)]
21    pub ord_id: String,
22    /// Client-supplied order ID, if any.
23    #[serde(default)]
24    pub cl_ord_id: String,
25    /// Order tag.
26    #[serde(default)]
27    pub tag: String,
28    /// Per-order status code (`"0"` on success).
29    pub s_code: String,
30    /// Per-order status message.
31    #[serde(default)]
32    pub s_msg: String,
33    /// Per-order sub status code.
34    #[serde(default)]
35    pub sub_code: String,
36    /// Timestamp (Unix milliseconds).
37    #[serde(default)]
38    pub ts: NumberString,
39}
40
41/// The result of cancelling an order.
42#[derive(Debug, Clone, Deserialize)]
43#[serde(rename_all = "camelCase")]
44#[non_exhaustive]
45pub struct CancelOrderResult {
46    /// OKX order ID.
47    #[serde(default)]
48    pub ord_id: String,
49    /// Client-supplied order ID, if any.
50    #[serde(default)]
51    pub cl_ord_id: String,
52    /// Per-order status code (`"0"` on success).
53    pub s_code: String,
54    /// Per-order status message.
55    #[serde(default)]
56    pub s_msg: String,
57    /// Timestamp (Unix milliseconds).
58    #[serde(default)]
59    pub ts: NumberString,
60}
61
62/// The result of amending an order.
63#[derive(Debug, Clone, Deserialize)]
64#[serde(rename_all = "camelCase")]
65#[non_exhaustive]
66pub struct AmendOrderResult {
67    /// OKX order ID.
68    #[serde(default)]
69    pub ord_id: String,
70    /// Client-supplied order ID, if any.
71    #[serde(default)]
72    pub cl_ord_id: String,
73    /// Request ID, if supplied.
74    #[serde(default)]
75    pub req_id: String,
76    /// Per-order status code (`"0"` on success).
77    pub s_code: String,
78    /// Per-order status message.
79    #[serde(default)]
80    pub s_msg: String,
81    /// Per-order sub status code.
82    #[serde(default)]
83    pub sub_code: String,
84    /// Timestamp (Unix milliseconds).
85    #[serde(default)]
86    pub ts: NumberString,
87}
88
89/// The result of closing a position.
90#[derive(Debug, Clone, Deserialize)]
91#[serde(rename_all = "camelCase")]
92#[non_exhaustive]
93pub struct ClosePositionResult {
94    /// Instrument ID.
95    #[serde(default)]
96    pub inst_id: String,
97    /// Position side.
98    #[serde(default)]
99    pub pos_side: String,
100    /// Client order ID, if supplied.
101    #[serde(default)]
102    pub cl_ord_id: String,
103    /// Tag, if supplied.
104    #[serde(default)]
105    pub tag: String,
106}
107
108/// An attached SL/TP algo order nested inside an [`Order`] (`attachAlgoOrds`).
109#[derive(Debug, Clone, Deserialize)]
110#[serde(rename_all = "camelCase")]
111#[non_exhaustive]
112pub struct OrderAttachAlgoOrder {
113    /// Value returned by OKX in the `attachAlgoId` field.
114    #[serde(default)]
115    pub attach_algo_id: String,
116    /// Value returned by OKX in the `attachAlgoClOrdId` field.
117    #[serde(default)]
118    pub attach_algo_cl_ord_id: String,
119    /// Value returned by OKX in the `tpOrdKind` field.
120    #[serde(default)]
121    pub tp_ord_kind: String,
122    /// Value returned by OKX in the `tpTriggerPx` field.
123    #[serde(default)]
124    pub tp_trigger_px: NumberString,
125    /// Value returned by OKX in the `tpTriggerRatio` field.
126    #[serde(default)]
127    pub tp_trigger_ratio: NumberString,
128    /// Value returned by OKX in the `tpTriggerPxType` field.
129    #[serde(default)]
130    pub tp_trigger_px_type: String,
131    /// Value returned by OKX in the `tpOrdPx` field.
132    #[serde(default)]
133    pub tp_ord_px: NumberString,
134    /// Value returned by OKX in the `slTriggerPx` field.
135    #[serde(default)]
136    pub sl_trigger_px: NumberString,
137    /// Value returned by OKX in the `slTriggerRatio` field.
138    #[serde(default)]
139    pub sl_trigger_ratio: NumberString,
140    /// Value returned by OKX in the `slTriggerPxType` field.
141    #[serde(default)]
142    pub sl_trigger_px_type: String,
143    /// Value returned by OKX in the `slOrdPx` field.
144    #[serde(default)]
145    pub sl_ord_px: NumberString,
146    /// Value returned by OKX in the `sz` field.
147    #[serde(default)]
148    pub sz: NumberString,
149    /// Value returned by OKX in the `amendPxOnTriggerType` field.
150    #[serde(default)]
151    pub amend_px_on_trigger_type: String,
152    /// Value returned by OKX in the `callbackRatio` field.
153    #[serde(default)]
154    pub callback_ratio: NumberString,
155    /// Value returned by OKX in the `callbackSpread` field.
156    #[serde(default)]
157    pub callback_spread: NumberString,
158    /// Value returned by OKX in the `activePx` field.
159    #[serde(default)]
160    pub active_px: NumberString,
161    /// Value returned by OKX in the `failCode` field.
162    #[serde(default)]
163    pub fail_code: String,
164    /// Value returned by OKX in the `failReason` field.
165    #[serde(default)]
166    pub fail_reason: String,
167}
168
169/// A linked algo order nested inside an [`Order`] (`linkedAlgoOrd`).
170#[derive(Debug, Clone, Deserialize)]
171#[serde(rename_all = "camelCase")]
172#[non_exhaustive]
173pub struct OrderLinkedAlgoOrder {
174    /// Value returned by OKX in the `algoId` field.
175    #[serde(default)]
176    pub algo_id: String,
177}
178
179/// Details of an existing order.
180#[derive(Debug, Clone, Deserialize)]
181#[serde(rename_all = "camelCase")]
182#[non_exhaustive]
183pub struct Order {
184    /// Instrument type.
185    #[serde(default)]
186    pub inst_type: String,
187    /// Instrument ID.
188    pub inst_id: String,
189    /// Order quantity unit setting for spot market orders (`tgtCcy`).
190    #[serde(default)]
191    pub tgt_ccy: String,
192    /// Margin currency.
193    #[serde(default)]
194    pub ccy: String,
195    /// OKX order ID.
196    pub ord_id: String,
197    /// Client-supplied order ID, if any.
198    #[serde(default)]
199    pub cl_ord_id: String,
200    /// Order tag.
201    #[serde(default)]
202    pub tag: String,
203    /// Order price.
204    #[serde(default)]
205    pub px: NumberString,
206    /// Order price in USD (options).
207    #[serde(default)]
208    pub px_usd: NumberString,
209    /// Implied volatility of the order price (options).
210    #[serde(default)]
211    pub px_vol: NumberString,
212    /// Price type (`px`/`pxVol`/`pxUsd`).
213    #[serde(default)]
214    pub px_type: String,
215    /// Order size.
216    #[serde(default)]
217    pub sz: NumberString,
218    /// Profit and loss.
219    #[serde(default)]
220    pub pnl: NumberString,
221    /// Order type.
222    pub ord_type: OrderType,
223    /// Order side.
224    pub side: OrderSide,
225    /// Position side.
226    pub pos_side: PositionSide,
227    /// Trade mode.
228    pub td_mode: TradeMode,
229    /// Accumulated filled size.
230    #[serde(default)]
231    pub acc_fill_sz: NumberString,
232    /// Last fill price.
233    #[serde(default)]
234    pub fill_px: NumberString,
235    /// Last trade ID.
236    #[serde(default)]
237    pub trade_id: String,
238    /// Last filled size.
239    #[serde(default)]
240    pub fill_sz: NumberString,
241    /// Last fill time (Unix milliseconds).
242    #[serde(default)]
243    pub fill_time: NumberString,
244    /// Average fill price.
245    #[serde(default)]
246    pub avg_px: NumberString,
247    /// Order state.
248    pub state: OrderState,
249    /// Self-trade prevention ID.
250    #[serde(default)]
251    pub stp_id: String,
252    /// Self-trade prevention mode.
253    #[serde(default)]
254    pub stp_mode: String,
255    /// Leverage.
256    #[serde(default)]
257    pub lever: NumberString,
258    /// Client-supplied ID of the attached SL/TP order.
259    #[serde(default)]
260    pub attach_algo_cl_ord_id: String,
261    /// Take-profit trigger price.
262    #[serde(default)]
263    pub tp_trigger_px: NumberString,
264    /// Take-profit trigger price type.
265    #[serde(default)]
266    pub tp_trigger_px_type: String,
267    /// Take-profit order price.
268    #[serde(default)]
269    pub tp_ord_px: NumberString,
270    /// Stop-loss trigger price.
271    #[serde(default)]
272    pub sl_trigger_px: NumberString,
273    /// Stop-loss trigger price type.
274    #[serde(default)]
275    pub sl_trigger_px_type: String,
276    /// Stop-loss order price.
277    #[serde(default)]
278    pub sl_ord_px: NumberString,
279    /// Attached SL/TP algo orders.
280    #[serde(default)]
281    pub attach_algo_ords: Vec<OrderAttachAlgoOrder>,
282    /// Linked algo order, if any.
283    #[serde(default)]
284    pub linked_algo_ord: Option<OrderLinkedAlgoOrder>,
285    /// Fee currency.
286    #[serde(default)]
287    pub fee_ccy: String,
288    /// Fee amount.
289    #[serde(default)]
290    pub fee: NumberString,
291    /// Rebate currency.
292    #[serde(default)]
293    pub rebate_ccy: String,
294    /// Rebate amount.
295    #[serde(default)]
296    pub rebate: NumberString,
297    /// Order source.
298    #[serde(default)]
299    pub source: String,
300    /// Order category.
301    #[serde(default)]
302    pub category: String,
303    /// Whether the order is reduce-only (`"true"`/`"false"`).
304    #[serde(default)]
305    pub reduce_only: String,
306    /// Whether the take-profit order is a limit order.
307    #[serde(default)]
308    pub is_tp_limit: String,
309    /// Cancellation source.
310    #[serde(default)]
311    pub cancel_source: String,
312    /// Cancellation source reason.
313    #[serde(default)]
314    pub cancel_source_reason: String,
315    /// Quick margin type.
316    #[serde(default)]
317    pub quick_mgn_type: String,
318    /// Client-supplied algo order ID.
319    #[serde(default)]
320    pub algo_cl_ord_id: String,
321    /// Algo order ID.
322    #[serde(default)]
323    pub algo_id: String,
324    /// Update time (Unix milliseconds).
325    #[serde(default)]
326    pub u_time: NumberString,
327    /// Creation time (Unix milliseconds).
328    #[serde(default)]
329    pub c_time: NumberString,
330    /// Trade quote currency.
331    #[serde(default)]
332    pub trade_quote_ccy: String,
333    /// Order outcome.
334    #[serde(default)]
335    pub outcome: String,
336}
337
338/// A trade fill.
339#[derive(Debug, Clone, Deserialize)]
340#[serde(rename_all = "camelCase")]
341#[non_exhaustive]
342pub struct Fill {
343    /// Instrument type.
344    #[serde(default)]
345    pub inst_type: String,
346    /// Instrument ID.
347    pub inst_id: String,
348    /// Trade ID.
349    #[serde(default)]
350    pub trade_id: String,
351    /// OKX order ID.
352    #[serde(default)]
353    pub ord_id: String,
354    /// Client order ID.
355    #[serde(default)]
356    pub cl_ord_id: String,
357    /// Bill ID.
358    #[serde(default)]
359    pub bill_id: String,
360    /// Bill sub-type.
361    #[serde(default)]
362    pub sub_type: String,
363    /// Order tag.
364    #[serde(default)]
365    pub tag: String,
366    /// Fill price.
367    #[serde(default)]
368    pub fill_px: NumberString,
369    /// Fill size.
370    #[serde(default)]
371    pub fill_sz: NumberString,
372    /// Index price at fill time.
373    #[serde(default)]
374    pub fill_idx_px: NumberString,
375    /// Fill profit and loss.
376    #[serde(default)]
377    pub fill_pnl: NumberString,
378    /// Implied volatility at fill price.
379    #[serde(default)]
380    pub fill_px_vol: NumberString,
381    /// Fill price in USD.
382    #[serde(default)]
383    pub fill_px_usd: NumberString,
384    /// Mark volatility at fill time.
385    #[serde(default)]
386    pub fill_mark_vol: NumberString,
387    /// Forward price at fill time.
388    #[serde(default)]
389    pub fill_fwd_px: NumberString,
390    /// Mark price at fill time.
391    #[serde(default)]
392    pub fill_mark_px: NumberString,
393    /// Fill side.
394    pub side: OrderSide,
395    /// Position side.
396    #[serde(default)]
397    pub pos_side: String,
398    /// Liquidity role, e.g. `T` or `M`.
399    #[serde(default)]
400    pub exec_type: String,
401    /// Order type, when returned by OKX.
402    ///
403    /// Retained for backwards compatibility; not part of the current documented
404    /// response and left as `None` when absent.
405    #[serde(default)]
406    pub ord_type: Option<OrderType>,
407    /// Fee currency.
408    #[serde(default)]
409    pub fee_ccy: String,
410    /// Fee amount.
411    #[serde(default)]
412    pub fee: NumberString,
413    /// Fee rate.
414    #[serde(default)]
415    pub fee_rate: NumberString,
416    /// Fill timestamp (Unix milliseconds).
417    #[serde(default)]
418    pub ts: NumberString,
419    /// Fill time (Unix milliseconds).
420    #[serde(default)]
421    pub fill_time: NumberString,
422    /// Trade quote currency.
423    #[serde(default)]
424    pub trade_quote_ccy: String,
425}
426
427/// Historical fill returned by `GET /api/v5/trade/fills-history`.
428///
429/// OKX documents this response separately from recent fills, so this type
430/// intentionally does not reuse [`Fill`] (which retains a legacy `ordType`
431/// field). The documented field set is otherwise identical.
432#[derive(Debug, Clone, Deserialize)]
433#[serde(rename_all = "camelCase")]
434#[non_exhaustive]
435pub struct FillHistory {
436    /// Instrument type.
437    #[serde(default)]
438    pub inst_type: String,
439    /// Instrument ID.
440    pub inst_id: String,
441    /// Trade ID.
442    #[serde(default)]
443    pub trade_id: String,
444    /// OKX order ID.
445    #[serde(default)]
446    pub ord_id: String,
447    /// Client order ID.
448    #[serde(default)]
449    pub cl_ord_id: String,
450    /// Bill ID.
451    #[serde(default)]
452    pub bill_id: String,
453    /// Bill sub-type.
454    #[serde(default)]
455    pub sub_type: String,
456    /// Order tag.
457    #[serde(default)]
458    pub tag: String,
459    /// Fill price.
460    #[serde(default)]
461    pub fill_px: NumberString,
462    /// Fill size.
463    #[serde(default)]
464    pub fill_sz: NumberString,
465    /// Index price at fill time.
466    #[serde(default)]
467    pub fill_idx_px: NumberString,
468    /// Fill profit and loss.
469    #[serde(default)]
470    pub fill_pnl: NumberString,
471    /// Implied volatility at fill price.
472    #[serde(default)]
473    pub fill_px_vol: NumberString,
474    /// Fill price in USD.
475    #[serde(default)]
476    pub fill_px_usd: NumberString,
477    /// Mark volatility at fill time.
478    #[serde(default)]
479    pub fill_mark_vol: NumberString,
480    /// Forward price at fill time.
481    #[serde(default)]
482    pub fill_fwd_px: NumberString,
483    /// Mark price at fill time.
484    #[serde(default)]
485    pub fill_mark_px: NumberString,
486    /// Fill side.
487    pub side: OrderSide,
488    /// Position side.
489    #[serde(default)]
490    pub pos_side: String,
491    /// Liquidity role, e.g. `T` or `M`.
492    #[serde(default)]
493    pub exec_type: String,
494    /// Fee currency.
495    #[serde(default)]
496    pub fee_ccy: String,
497    /// Fee amount.
498    #[serde(default)]
499    pub fee: NumberString,
500    /// Fee rate.
501    #[serde(default)]
502    pub fee_rate: NumberString,
503    /// Fill timestamp (Unix milliseconds).
504    #[serde(default)]
505    pub fill_time: NumberString,
506    /// Trade creation timestamp (Unix milliseconds).
507    #[serde(default)]
508    pub ts: NumberString,
509    /// Trade quote currency.
510    #[serde(default)]
511    pub trade_quote_ccy: String,
512}