Skip to main content

nautilus_bybit/http/
query.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16//! Builder types for Bybit REST query parameters and filters.
17
18use derive_builder::Builder;
19use serde::{Deserialize, Serialize};
20
21use crate::common::enums::{
22    BybitAccountType, BybitExecType, BybitInstrumentStatus, BybitKlineInterval, BybitMarginMode,
23    BybitOpenOnly, BybitOptionType, BybitOrderFilter, BybitOrderSide, BybitOrderStatus,
24    BybitOrderType, BybitPositionIdx, BybitPositionMode, BybitProductType, BybitTimeInForce,
25    BybitTpSlMode, BybitTriggerDirection, BybitTriggerType,
26};
27
28/// Query parameters for `GET /v5/market/instruments-info`.
29///
30/// # References
31/// - <https://bybit-exchange.github.io/docs/v5/market/instrument>
32#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
33#[serde(rename_all = "camelCase")]
34#[builder(default)]
35#[builder(setter(into))]
36pub struct BybitInstrumentsInfoParams {
37    pub category: BybitProductType,
38    #[builder(setter(strip_option))]
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub symbol: Option<String>,
41    #[builder(setter(strip_option))]
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub status: Option<BybitInstrumentStatus>,
44    #[builder(setter(strip_option))]
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub base_coin: Option<String>,
47    #[builder(setter(strip_option))]
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub limit: Option<u32>,
50    #[builder(setter(strip_option))]
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub cursor: Option<String>,
53}
54
55/// Query parameters for `GET /v5/market/tickers`.
56///
57/// # References
58/// - <https://bybit-exchange.github.io/docs/v5/market/tickers>
59#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
60#[serde(rename_all = "camelCase")]
61#[builder(default)]
62#[builder(setter(into))]
63pub struct BybitTickersParams {
64    pub category: BybitProductType,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    #[builder(setter(strip_option))]
67    pub symbol: Option<String>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    #[builder(setter(strip_option))]
70    pub base_coin: Option<String>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    #[builder(setter(strip_option))]
73    pub exp_date: Option<String>,
74}
75
76/// Query parameters for `GET /v5/market/kline`.
77///
78/// # References
79/// - <https://bybit-exchange.github.io/docs/v5/market/kline>
80#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
81#[serde(rename_all = "camelCase")]
82#[builder(setter(into, strip_option), default)]
83pub struct BybitKlinesParams {
84    pub category: BybitProductType,
85    pub symbol: String,
86    pub interval: BybitKlineInterval,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub start: Option<i64>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub end: Option<i64>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub limit: Option<u32>,
93}
94
95impl Default for BybitKlinesParams {
96    fn default() -> Self {
97        Self {
98            category: BybitProductType::Linear,
99            symbol: String::new(),
100            interval: BybitKlineInterval::Minute1,
101            start: None,
102            end: None,
103            limit: None,
104        }
105    }
106}
107
108/// Query parameters for `GET /v5/market/recent-trade`.
109///
110/// # References
111/// - <https://bybit-exchange.github.io/docs/v5/market/recent-trade>
112#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
113#[serde(rename_all = "camelCase")]
114#[builder(setter(into, strip_option), default)]
115pub struct BybitTradesParams {
116    pub category: BybitProductType,
117    pub symbol: String,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub base_coin: Option<String>,
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub option_type: Option<BybitOptionType>,
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub limit: Option<u32>,
124}
125
126impl Default for BybitTradesParams {
127    fn default() -> Self {
128        Self {
129            category: BybitProductType::Linear,
130            symbol: String::new(),
131            base_coin: None,
132            option_type: None,
133            limit: None,
134        }
135    }
136}
137
138/// Query parameters for `GET /v5/market/funding/history`.
139///
140/// # References
141/// - <https://bybit-exchange.github.io/docs/v5/market/history-fund-rate>
142#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
143#[serde(rename_all = "camelCase")]
144#[builder(setter(into, strip_option), default)]
145pub struct BybitFundingParams {
146    pub category: BybitProductType,
147    pub symbol: String,
148    #[serde(skip_serializing_if = "Option::is_none")]
149    pub start_time: Option<i64>,
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub end_time: Option<i64>,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub limit: Option<u32>,
154}
155
156impl Default for BybitFundingParams {
157    fn default() -> Self {
158        Self {
159            category: BybitProductType::Linear,
160            symbol: String::new(),
161            start_time: None,
162            end_time: None,
163            limit: None,
164        }
165    }
166}
167
168/// Query parameters for `GET /v5/market/orderbook`.
169///
170/// # References
171/// - <https://bybit-exchange.github.io/docs/v5/market/orderbook>
172#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
173#[builder(setter(into, strip_option), default)]
174pub struct BybitOrderbookParams {
175    pub category: BybitProductType,
176    pub symbol: String,
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub limit: Option<u32>,
179}
180
181impl Default for BybitOrderbookParams {
182    fn default() -> Self {
183        Self {
184            category: BybitProductType::Linear,
185            symbol: String::new(),
186            limit: None,
187        }
188    }
189}
190
191/// Query parameters for `GET /v5/asset/coin/query-info`.
192///
193/// # References
194/// - <https://bybit-exchange.github.io/docs/v5/asset/coin-info>
195#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
196#[serde(rename_all = "camelCase")]
197#[builder(default)]
198#[builder(setter(into))]
199pub struct BybitCoinInfoParams {
200    #[serde(skip_serializing_if = "Option::is_none")]
201    #[builder(setter(strip_option))]
202    pub coin: Option<String>,
203}
204
205/// Query parameters for `GET /v5/account/fee-rate`.
206///
207/// # References
208/// - <https://bybit-exchange.github.io/docs/v5/account/fee-rate>
209#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
210#[serde(rename_all = "camelCase")]
211#[builder(default)]
212#[builder(setter(into))]
213pub struct BybitFeeRateParams {
214    pub category: BybitProductType,
215    #[builder(setter(strip_option))]
216    #[serde(skip_serializing_if = "Option::is_none")]
217    pub symbol: Option<String>,
218    #[builder(setter(strip_option))]
219    #[serde(skip_serializing_if = "Option::is_none")]
220    pub base_coin: Option<String>,
221}
222
223/// Query parameters for `GET /v5/account/wallet-balance`.
224///
225/// # References
226/// - <https://bybit-exchange.github.io/docs/v5/account/wallet-balance>
227#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
228#[serde(rename_all = "camelCase")]
229pub struct BybitWalletBalanceParams {
230    pub account_type: BybitAccountType,
231    #[serde(skip_serializing_if = "Option::is_none")]
232    #[builder(setter(strip_option))]
233    pub coin: Option<String>,
234}
235
236/// Query parameters for `GET /v5/position/list`.
237///
238/// # References
239/// - <https://bybit-exchange.github.io/docs/v5/position>
240#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
241#[serde(rename_all = "camelCase")]
242#[builder(default)]
243#[builder(setter(into))]
244pub struct BybitPositionListParams {
245    pub category: BybitProductType,
246    #[serde(skip_serializing_if = "Option::is_none")]
247    #[builder(setter(strip_option))]
248    pub symbol: Option<String>,
249    #[serde(skip_serializing_if = "Option::is_none")]
250    #[builder(setter(strip_option))]
251    pub base_coin: Option<String>,
252    #[serde(skip_serializing_if = "Option::is_none")]
253    #[builder(setter(strip_option))]
254    pub settle_coin: Option<String>,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    #[builder(setter(strip_option))]
257    pub limit: Option<u32>,
258    #[serde(skip_serializing_if = "Option::is_none")]
259    #[builder(setter(strip_option))]
260    pub cursor: Option<String>,
261}
262
263/// Body parameters for `POST /v5/account/set-margin-mode`.
264///
265/// # References
266/// - <https://bybit-exchange.github.io/docs/v5/account/set-margin-mode>
267#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
268#[serde(rename_all = "camelCase")]
269pub struct BybitSetMarginModeParams {
270    pub set_margin_mode: BybitMarginMode,
271}
272
273/// Body parameters for `POST /v5/position/set-leverage`.
274///
275/// # References
276/// - <https://bybit-exchange.github.io/docs/v5/position/leverage>
277#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
278#[serde(rename_all = "camelCase")]
279pub struct BybitSetLeverageParams {
280    pub category: BybitProductType,
281    pub symbol: String,
282    pub buy_leverage: String,
283    pub sell_leverage: String,
284}
285
286/// Body parameters for `POST /v5/position/switch-mode`.
287///
288/// # References
289/// - <https://bybit-exchange.github.io/docs/v5/position/position-mode>
290#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
291#[serde(rename_all = "camelCase")]
292pub struct BybitSwitchModeParams {
293    pub category: BybitProductType,
294    #[builder(default)]
295    #[serde(skip_serializing_if = "Option::is_none")]
296    #[builder(setter(strip_option))]
297    pub symbol: Option<String>,
298    #[builder(default)]
299    #[serde(skip_serializing_if = "Option::is_none")]
300    #[builder(setter(strip_option))]
301    pub coin: Option<String>,
302    pub mode: BybitPositionMode,
303}
304
305/// Body parameters for `POST /v5/position/trading-stop`.
306///
307/// # References
308/// - <https://bybit-exchange.github.io/docs/v5/position/trading-stop>
309#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
310#[serde(rename_all = "camelCase")]
311pub struct BybitSetTradingStopParams {
312    pub category: BybitProductType,
313    pub symbol: String,
314    pub position_idx: BybitPositionIdx,
315    #[serde(skip_serializing_if = "Option::is_none")]
316    pub take_profit: Option<String>,
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub stop_loss: Option<String>,
319    #[serde(skip_serializing_if = "Option::is_none")]
320    pub trailing_stop: Option<String>,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    pub tp_trigger_by: Option<BybitTriggerType>,
323    #[serde(skip_serializing_if = "Option::is_none")]
324    pub sl_trigger_by: Option<BybitTriggerType>,
325    #[serde(skip_serializing_if = "Option::is_none")]
326    pub active_price: Option<String>,
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub tpsl_mode: Option<BybitTpSlMode>,
329    #[serde(skip_serializing_if = "Option::is_none")]
330    pub tp_size: Option<String>,
331    #[serde(skip_serializing_if = "Option::is_none")]
332    pub sl_size: Option<String>,
333    #[serde(skip_serializing_if = "Option::is_none")]
334    pub tp_limit_price: Option<String>,
335    #[serde(skip_serializing_if = "Option::is_none")]
336    pub sl_limit_price: Option<String>,
337    #[serde(skip_serializing_if = "Option::is_none")]
338    pub tp_order_type: Option<BybitOrderType>,
339    #[serde(skip_serializing_if = "Option::is_none")]
340    pub sl_order_type: Option<BybitOrderType>,
341}
342
343/// Body parameters for `POST /v5/account/borrow`.
344///
345/// # References
346///
347/// - <https://bybit-exchange.github.io/docs/v5/account/borrow>
348#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
349#[serde(rename_all = "camelCase")]
350pub struct BybitBorrowParams {
351    pub coin: String,
352    pub amount: String,
353}
354
355/// Body parameters for `POST /v5/account/no-convert-repay`.
356///
357/// # References
358///
359/// - <https://bybit-exchange.github.io/docs/v5/account/no-convert-repay>
360#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
361#[serde(rename_all = "camelCase")]
362pub struct BybitNoConvertRepayParams {
363    pub coin: String,
364    #[serde(skip_serializing_if = "Option::is_none")]
365    #[builder(setter(strip_option), default)]
366    pub amount: Option<String>,
367}
368
369/// Order entry payload for `POST /v5/order/create-batch`.
370///
371/// # References
372/// - <https://bybit-exchange.github.io/docs/v5/order/batch-place>
373#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
374#[serde(rename_all = "camelCase")]
375pub struct BybitBatchPlaceOrderEntry {
376    pub symbol: String,
377    #[builder(default)]
378    #[serde(skip_serializing_if = "Option::is_none")]
379    pub is_leverage: Option<i32>,
380    pub side: BybitOrderSide,
381    pub order_type: BybitOrderType,
382    pub qty: String,
383    #[builder(default)]
384    #[serde(skip_serializing_if = "Option::is_none")]
385    pub price: Option<String>,
386    #[builder(default)]
387    #[serde(skip_serializing_if = "Option::is_none")]
388    pub market_unit: Option<String>,
389    #[builder(default)]
390    #[serde(skip_serializing_if = "Option::is_none")]
391    pub trigger_direction: Option<BybitTriggerDirection>,
392    #[builder(default)]
393    #[serde(skip_serializing_if = "Option::is_none")]
394    pub order_filter: Option<String>,
395    #[builder(default)]
396    #[serde(skip_serializing_if = "Option::is_none")]
397    pub trigger_price: Option<String>,
398    #[builder(default)]
399    #[serde(skip_serializing_if = "Option::is_none")]
400    pub trigger_by: Option<BybitTriggerType>,
401    #[builder(default)]
402    #[serde(skip_serializing_if = "Option::is_none")]
403    pub order_iv: Option<String>,
404    #[builder(default)]
405    #[serde(skip_serializing_if = "Option::is_none")]
406    pub time_in_force: Option<BybitTimeInForce>,
407    #[builder(default)]
408    #[serde(skip_serializing_if = "Option::is_none")]
409    pub position_idx: Option<i32>,
410    #[builder(default)]
411    #[serde(skip_serializing_if = "Option::is_none")]
412    #[builder(setter(strip_option))]
413    pub order_link_id: Option<String>,
414    #[builder(default)]
415    #[serde(skip_serializing_if = "Option::is_none")]
416    pub take_profit: Option<String>,
417    #[builder(default)]
418    #[serde(skip_serializing_if = "Option::is_none")]
419    pub stop_loss: Option<String>,
420    #[builder(default)]
421    #[serde(skip_serializing_if = "Option::is_none")]
422    pub tp_trigger_by: Option<BybitTriggerType>,
423    #[builder(default)]
424    #[serde(skip_serializing_if = "Option::is_none")]
425    pub sl_trigger_by: Option<BybitTriggerType>,
426    #[builder(default)]
427    #[serde(skip_serializing_if = "Option::is_none")]
428    pub reduce_only: Option<bool>,
429    #[builder(default)]
430    #[serde(skip_serializing_if = "Option::is_none")]
431    pub close_on_trigger: Option<bool>,
432    #[builder(default)]
433    #[serde(skip_serializing_if = "Option::is_none")]
434    pub smp_type: Option<String>,
435    #[builder(default)]
436    #[serde(skip_serializing_if = "Option::is_none")]
437    pub mmp: Option<bool>,
438    #[builder(default)]
439    #[serde(skip_serializing_if = "Option::is_none")]
440    pub tpsl_mode: Option<BybitTpSlMode>,
441    #[builder(default)]
442    #[serde(skip_serializing_if = "Option::is_none")]
443    pub tp_limit_price: Option<String>,
444    #[builder(default)]
445    #[serde(skip_serializing_if = "Option::is_none")]
446    pub sl_limit_price: Option<String>,
447    #[builder(default)]
448    #[serde(skip_serializing_if = "Option::is_none")]
449    pub tp_order_type: Option<BybitOrderType>,
450    #[builder(default)]
451    #[serde(skip_serializing_if = "Option::is_none")]
452    pub sl_order_type: Option<BybitOrderType>,
453}
454
455/// Body parameters for `POST /v5/order/create-batch`.
456///
457/// # References
458/// - <https://bybit-exchange.github.io/docs/v5/order/batch-place>
459#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
460#[serde(rename_all = "camelCase")]
461pub struct BybitBatchPlaceOrderParams {
462    pub category: BybitProductType,
463    pub request: Vec<BybitBatchPlaceOrderEntry>,
464}
465
466/// Body parameters for `POST /v5/order/create`.
467///
468/// # References
469/// - <https://bybit-exchange.github.io/docs/v5/order/create-order>
470#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
471#[serde(rename_all = "camelCase")]
472pub struct BybitPlaceOrderParams {
473    #[serde(flatten)]
474    pub order: BybitBatchPlaceOrderEntry,
475    pub category: BybitProductType,
476    #[builder(default)]
477    #[serde(skip_serializing_if = "Option::is_none")]
478    pub slippage_tolerance_type: Option<String>,
479    #[builder(default)]
480    #[serde(skip_serializing_if = "Option::is_none")]
481    pub slippage_tolerance: Option<String>,
482}
483
484/// Amend entry for `POST /v5/order/amend-batch`.
485///
486/// # References
487/// - <https://bybit-exchange.github.io/docs/v5/order/batch-amend>
488#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
489#[serde(rename_all = "camelCase")]
490pub struct BybitBatchAmendOrderEntry {
491    pub symbol: String,
492    #[serde(skip_serializing_if = "Option::is_none")]
493    #[builder(setter(strip_option))]
494    pub order_id: Option<String>,
495    #[serde(skip_serializing_if = "Option::is_none")]
496    #[builder(setter(strip_option))]
497    pub order_link_id: Option<String>,
498    #[serde(skip_serializing_if = "Option::is_none")]
499    pub order_iv: Option<String>,
500    #[serde(skip_serializing_if = "Option::is_none")]
501    pub trigger_price: Option<String>,
502    #[serde(skip_serializing_if = "Option::is_none")]
503    pub qty: Option<String>,
504    #[serde(skip_serializing_if = "Option::is_none")]
505    pub price: Option<String>,
506    #[serde(skip_serializing_if = "Option::is_none")]
507    pub tpsl_mode: Option<BybitTpSlMode>,
508    #[serde(skip_serializing_if = "Option::is_none")]
509    pub take_profit: Option<String>,
510    #[serde(skip_serializing_if = "Option::is_none")]
511    pub stop_loss: Option<String>,
512    #[serde(skip_serializing_if = "Option::is_none")]
513    pub tp_trigger_by: Option<BybitTriggerType>,
514    #[serde(skip_serializing_if = "Option::is_none")]
515    pub sl_trigger_by: Option<BybitTriggerType>,
516    #[serde(skip_serializing_if = "Option::is_none")]
517    pub trigger_by: Option<BybitTriggerType>,
518    #[serde(skip_serializing_if = "Option::is_none")]
519    pub tp_limit_price: Option<String>,
520    #[serde(skip_serializing_if = "Option::is_none")]
521    pub sl_limit_price: Option<String>,
522}
523
524/// Body parameters for `POST /v5/order/amend-batch`.
525///
526/// # References
527/// - <https://bybit-exchange.github.io/docs/v5/order/batch-amend>
528#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
529#[serde(rename_all = "camelCase")]
530pub struct BybitBatchAmendOrderParams {
531    pub category: BybitProductType,
532    pub request: Vec<BybitBatchAmendOrderEntry>,
533}
534
535/// Body parameters for `POST /v5/order/amend`.
536///
537/// # References
538/// - <https://bybit-exchange.github.io/docs/v5/order/amend-order>
539#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
540#[serde(rename_all = "camelCase")]
541pub struct BybitAmendOrderParams {
542    #[serde(flatten)]
543    pub order: BybitBatchAmendOrderEntry,
544    pub category: BybitProductType,
545}
546
547/// Cancel entry for `POST /v5/order/cancel-batch`.
548///
549/// # References
550/// - <https://bybit-exchange.github.io/docs/v5/order/batch-cancel>
551#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
552#[serde(rename_all = "camelCase")]
553pub struct BybitBatchCancelOrderEntry {
554    pub symbol: String,
555    #[serde(skip_serializing_if = "Option::is_none")]
556    #[builder(setter(strip_option))]
557    pub order_id: Option<String>,
558    #[serde(skip_serializing_if = "Option::is_none")]
559    #[builder(setter(strip_option))]
560    pub order_link_id: Option<String>,
561    #[serde(skip_serializing_if = "Option::is_none")]
562    pub order_filter: Option<String>,
563}
564
565/// Body parameters for `POST /v5/order/cancel-batch`.
566///
567/// # References
568/// - <https://bybit-exchange.github.io/docs/v5/order/batch-cancel>
569#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
570#[serde(rename_all = "camelCase")]
571pub struct BybitBatchCancelOrderParams {
572    pub category: BybitProductType,
573    pub request: Vec<BybitBatchCancelOrderEntry>,
574}
575
576/// Body parameters for `POST /v5/order/cancel`.
577///
578/// # References
579/// - <https://bybit-exchange.github.io/docs/v5/order/cancel-order>
580#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
581#[serde(rename_all = "camelCase")]
582pub struct BybitCancelOrderParams {
583    #[serde(flatten)]
584    pub order: BybitBatchCancelOrderEntry,
585    pub category: BybitProductType,
586}
587
588/// Body parameters for `POST /v5/order/cancel-all`.
589///
590/// # References
591/// - <https://bybit-exchange.github.io/docs/v5/order/cancel-all>
592#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
593#[serde(rename_all = "camelCase")]
594#[builder(default)]
595#[builder(setter(into))]
596pub struct BybitCancelAllOrdersParams {
597    pub category: BybitProductType,
598    #[serde(skip_serializing_if = "Option::is_none")]
599    #[builder(setter(strip_option))]
600    pub symbol: Option<String>,
601    #[serde(skip_serializing_if = "Option::is_none")]
602    #[builder(setter(strip_option))]
603    pub base_coin: Option<String>,
604    #[serde(skip_serializing_if = "Option::is_none")]
605    #[builder(setter(strip_option))]
606    pub settle_coin: Option<String>,
607    #[serde(skip_serializing_if = "Option::is_none")]
608    #[builder(setter(strip_option))]
609    pub order_filter: Option<String>,
610    #[serde(skip_serializing_if = "Option::is_none")]
611    #[builder(setter(strip_option))]
612    pub stop_order_type: Option<String>,
613}
614
615/// Query parameters for `GET /v5/order/realtime`.
616///
617/// # References
618/// - <https://bybit-exchange.github.io/docs/v5/order/open-order>
619#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
620#[serde(rename_all = "camelCase")]
621#[builder(default)]
622#[builder(setter(into))]
623pub struct BybitOpenOrdersParams {
624    pub category: BybitProductType,
625    #[serde(skip_serializing_if = "Option::is_none")]
626    #[builder(setter(strip_option))]
627    pub symbol: Option<String>,
628    #[serde(skip_serializing_if = "Option::is_none")]
629    #[builder(setter(strip_option))]
630    pub base_coin: Option<String>,
631    #[serde(skip_serializing_if = "Option::is_none")]
632    #[builder(setter(strip_option))]
633    pub settle_coin: Option<String>,
634    #[serde(skip_serializing_if = "Option::is_none")]
635    #[builder(setter(strip_option))]
636    pub order_id: Option<String>,
637    #[serde(skip_serializing_if = "Option::is_none")]
638    #[builder(setter(strip_option))]
639    pub order_link_id: Option<String>,
640    #[serde(skip_serializing_if = "Option::is_none")]
641    #[builder(setter(strip_option))]
642    pub open_only: Option<BybitOpenOnly>,
643    #[serde(skip_serializing_if = "Option::is_none")]
644    #[builder(setter(strip_option))]
645    pub order_filter: Option<BybitOrderFilter>,
646    #[serde(skip_serializing_if = "Option::is_none")]
647    #[builder(setter(strip_option))]
648    pub limit: Option<u32>,
649    #[serde(skip_serializing_if = "Option::is_none")]
650    #[builder(setter(strip_option))]
651    pub cursor: Option<String>,
652}
653
654/// Query parameters for `GET /v5/order/history`.
655///
656/// # References
657/// - <https://bybit-exchange.github.io/docs/v5/order/order-list>
658#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
659#[serde(rename_all = "camelCase")]
660#[builder(default)]
661#[builder(setter(into))]
662pub struct BybitOrderHistoryParams {
663    pub category: BybitProductType,
664    #[serde(skip_serializing_if = "Option::is_none")]
665    #[builder(setter(strip_option))]
666    pub symbol: Option<String>,
667    #[serde(skip_serializing_if = "Option::is_none")]
668    #[builder(setter(strip_option))]
669    pub base_coin: Option<String>,
670    #[serde(skip_serializing_if = "Option::is_none")]
671    #[builder(setter(strip_option))]
672    pub settle_coin: Option<String>,
673    #[serde(skip_serializing_if = "Option::is_none")]
674    #[builder(setter(strip_option))]
675    pub order_id: Option<String>,
676    #[serde(skip_serializing_if = "Option::is_none")]
677    #[builder(setter(strip_option))]
678    pub order_link_id: Option<String>,
679    #[serde(skip_serializing_if = "Option::is_none")]
680    #[builder(setter(strip_option))]
681    pub open_only: Option<BybitOpenOnly>,
682    #[serde(skip_serializing_if = "Option::is_none")]
683    #[builder(setter(strip_option))]
684    pub order_filter: Option<BybitOrderFilter>,
685    #[serde(skip_serializing_if = "Option::is_none")]
686    #[builder(setter(strip_option))]
687    pub order_status: Option<BybitOrderStatus>,
688    #[serde(skip_serializing_if = "Option::is_none")]
689    #[builder(setter(strip_option))]
690    pub start_time: Option<i64>,
691    #[serde(skip_serializing_if = "Option::is_none")]
692    #[serde(rename = "endTime")]
693    #[builder(setter(strip_option))]
694    pub end_time: Option<i64>,
695    #[serde(skip_serializing_if = "Option::is_none")]
696    #[builder(setter(strip_option))]
697    pub limit: Option<u32>,
698    #[serde(skip_serializing_if = "Option::is_none")]
699    #[builder(setter(strip_option))]
700    pub cursor: Option<String>,
701}
702
703/// Query parameters for `GET /v5/execution/list`.
704///
705/// # References
706/// - <https://bybit-exchange.github.io/docs/v5/order/execution>
707#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
708#[serde(rename_all = "camelCase")]
709#[builder(default)]
710#[builder(setter(into))]
711pub struct BybitTradeHistoryParams {
712    pub category: BybitProductType,
713    #[serde(skip_serializing_if = "Option::is_none")]
714    #[builder(setter(strip_option))]
715    pub symbol: Option<String>,
716    #[serde(skip_serializing_if = "Option::is_none")]
717    #[builder(setter(strip_option))]
718    pub base_coin: Option<String>,
719    #[serde(skip_serializing_if = "Option::is_none")]
720    #[builder(setter(strip_option))]
721    pub order_id: Option<String>,
722    #[serde(skip_serializing_if = "Option::is_none")]
723    #[builder(setter(strip_option))]
724    pub order_link_id: Option<String>,
725    #[serde(skip_serializing_if = "Option::is_none")]
726    #[builder(setter(strip_option))]
727    pub start_time: Option<i64>,
728    #[serde(skip_serializing_if = "Option::is_none")]
729    #[serde(rename = "endTime")]
730    #[builder(setter(strip_option))]
731    pub end_time: Option<i64>,
732    #[serde(skip_serializing_if = "Option::is_none")]
733    #[builder(setter(strip_option))]
734    pub exec_type: Option<BybitExecType>,
735    #[serde(skip_serializing_if = "Option::is_none")]
736    #[builder(setter(strip_option))]
737    pub limit: Option<u32>,
738    #[serde(skip_serializing_if = "Option::is_none")]
739    #[builder(setter(strip_option))]
740    pub cursor: Option<String>,
741}
742
743/// Body parameters for `POST /v5/user/update-sub-api`.
744///
745/// # References
746/// - <https://bybit-exchange.github.io/docs/v5/user/modify-sub-apikey>
747#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
748#[serde(rename_all = "camelCase")]
749#[builder(default)]
750#[builder(setter(into))]
751pub struct BybitUpdateSubApiParams {
752    #[serde(skip_serializing_if = "Option::is_none")]
753    #[builder(setter(strip_option))]
754    pub api_key: Option<String>,
755    #[serde(skip_serializing_if = "Option::is_none")]
756    #[builder(setter(strip_option))]
757    pub read_only: Option<i32>,
758    #[serde(skip_serializing_if = "Option::is_none")]
759    #[builder(setter(strip_option))]
760    pub ips: Option<String>,
761}