1use derive_builder::Builder;
19use serde::{Deserialize, Serialize};
20
21use crate::common::enums::{
22 BybitAccountType, BybitExecType, BybitInstrumentStatus, BybitKlineInterval, BybitMarginMode,
23 BybitOptionType, BybitOrderSide, BybitOrderStatus, BybitOrderType, BybitPositionIdx,
24 BybitPositionMode, BybitProductType, BybitTimeInForce, BybitTpSlMode, BybitTriggerDirection,
25 BybitTriggerType,
26};
27
28#[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#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
60#[serde(rename_all = "camelCase")]
61pub struct BybitTickersParams {
62 pub category: BybitProductType,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub symbol: Option<String>,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub base_coin: Option<String>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub exp_date: Option<String>,
69}
70
71#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
76#[serde(rename_all = "camelCase")]
77#[builder(setter(into, strip_option), default)]
78pub struct BybitKlinesParams {
79 pub category: BybitProductType,
80 pub symbol: String,
81 pub interval: BybitKlineInterval,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub start: Option<i64>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub end: Option<i64>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub limit: Option<u32>,
88}
89
90impl Default for BybitKlinesParams {
91 fn default() -> Self {
92 Self {
93 category: BybitProductType::Linear,
94 symbol: String::new(),
95 interval: BybitKlineInterval::Minute1,
96 start: None,
97 end: None,
98 limit: None,
99 }
100 }
101}
102
103#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
108#[serde(rename_all = "camelCase")]
109#[builder(setter(into, strip_option), default)]
110pub struct BybitTradesParams {
111 pub category: BybitProductType,
112 pub symbol: String,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub base_coin: Option<String>,
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub option_type: Option<BybitOptionType>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub limit: Option<u32>,
119}
120
121impl Default for BybitTradesParams {
122 fn default() -> Self {
123 Self {
124 category: BybitProductType::Linear,
125 symbol: String::new(),
126 base_coin: None,
127 option_type: None,
128 limit: None,
129 }
130 }
131}
132
133#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
138#[serde(rename_all = "camelCase")]
139pub struct BybitCoinInfoParams {
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub coin: Option<String>,
142}
143
144#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
149#[serde(rename_all = "camelCase")]
150#[builder(default)]
151#[builder(setter(into))]
152pub struct BybitFeeRateParams {
153 pub category: BybitProductType,
154 #[builder(setter(strip_option))]
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub symbol: Option<String>,
157 #[builder(setter(strip_option))]
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub base_coin: Option<String>,
160}
161
162#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
167#[serde(rename_all = "camelCase")]
168pub struct BybitWalletBalanceParams {
169 pub account_type: BybitAccountType,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub coin: Option<String>,
172}
173
174#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
179#[serde(rename_all = "camelCase")]
180pub struct BybitPositionListParams {
181 pub category: BybitProductType,
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub symbol: Option<String>,
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub base_coin: Option<String>,
186 #[serde(skip_serializing_if = "Option::is_none")]
187 pub settle_coin: Option<String>,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub limit: Option<u32>,
190 #[serde(skip_serializing_if = "Option::is_none")]
191 pub cursor: Option<String>,
192}
193
194#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
199#[serde(rename_all = "camelCase")]
200pub struct BybitSetMarginModeParams {
201 pub set_margin_mode: BybitMarginMode,
202}
203
204#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
209#[serde(rename_all = "camelCase")]
210pub struct BybitSetLeverageParams {
211 pub category: BybitProductType,
212 pub symbol: String,
213 pub buy_leverage: String,
214 pub sell_leverage: String,
215}
216
217#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
222#[serde(rename_all = "camelCase")]
223pub struct BybitSwitchModeParams {
224 pub category: BybitProductType,
225 #[serde(skip_serializing_if = "Option::is_none")]
226 pub symbol: Option<String>,
227 #[serde(skip_serializing_if = "Option::is_none")]
228 pub coin: Option<String>,
229 pub mode: BybitPositionMode,
230}
231
232#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
237#[serde(rename_all = "camelCase")]
238pub struct BybitSetTradingStopParams {
239 pub category: BybitProductType,
240 pub symbol: String,
241 pub position_idx: BybitPositionIdx,
242 #[serde(skip_serializing_if = "Option::is_none")]
243 pub take_profit: Option<String>,
244 #[serde(skip_serializing_if = "Option::is_none")]
245 pub stop_loss: Option<String>,
246 #[serde(skip_serializing_if = "Option::is_none")]
247 pub trailing_stop: Option<String>,
248 #[serde(skip_serializing_if = "Option::is_none")]
249 pub tp_trigger_by: Option<BybitTriggerType>,
250 #[serde(skip_serializing_if = "Option::is_none")]
251 pub sl_trigger_by: Option<BybitTriggerType>,
252 #[serde(skip_serializing_if = "Option::is_none")]
253 pub active_price: Option<String>,
254 pub tpsl_mode: BybitTpSlMode,
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub tp_size: Option<String>,
257 #[serde(skip_serializing_if = "Option::is_none")]
258 pub sl_size: Option<String>,
259 #[serde(skip_serializing_if = "Option::is_none")]
260 pub tp_limit_price: Option<String>,
261 #[serde(skip_serializing_if = "Option::is_none")]
262 pub sl_limit_price: Option<String>,
263 #[serde(skip_serializing_if = "Option::is_none")]
264 pub tp_order_type: Option<BybitOrderType>,
265 #[serde(skip_serializing_if = "Option::is_none")]
266 pub sl_order_type: Option<BybitOrderType>,
267}
268
269#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
274#[serde(rename_all = "camelCase")]
275pub struct BybitBatchPlaceOrderEntry {
276 pub symbol: String,
277 #[serde(skip_serializing_if = "Option::is_none")]
278 pub is_leverage: Option<i32>,
279 pub side: BybitOrderSide,
280 pub order_type: BybitOrderType,
281 pub qty: String,
282 #[serde(skip_serializing_if = "Option::is_none")]
283 pub price: Option<String>,
284 #[serde(skip_serializing_if = "Option::is_none")]
285 pub market_unit: Option<String>,
286 #[serde(skip_serializing_if = "Option::is_none")]
287 pub trigger_direction: Option<BybitTriggerDirection>,
288 #[serde(skip_serializing_if = "Option::is_none")]
289 pub order_filter: Option<String>,
290 #[serde(skip_serializing_if = "Option::is_none")]
291 pub trigger_price: Option<String>,
292 #[serde(skip_serializing_if = "Option::is_none")]
293 pub trigger_by: Option<BybitTriggerType>,
294 #[serde(skip_serializing_if = "Option::is_none")]
295 pub order_iv: Option<String>,
296 #[serde(skip_serializing_if = "Option::is_none")]
297 pub time_in_force: Option<BybitTimeInForce>,
298 #[serde(skip_serializing_if = "Option::is_none")]
299 pub position_idx: Option<i32>,
300 #[serde(skip_serializing_if = "Option::is_none")]
301 #[builder(setter(strip_option))]
302 pub order_link_id: Option<String>,
303 #[serde(skip_serializing_if = "Option::is_none")]
304 pub take_profit: Option<String>,
305 #[serde(skip_serializing_if = "Option::is_none")]
306 pub stop_loss: Option<String>,
307 #[serde(skip_serializing_if = "Option::is_none")]
308 pub tp_trigger_by: Option<BybitTriggerType>,
309 #[serde(skip_serializing_if = "Option::is_none")]
310 pub sl_trigger_by: Option<BybitTriggerType>,
311 #[serde(skip_serializing_if = "Option::is_none")]
312 pub reduce_only: Option<bool>,
313 #[serde(skip_serializing_if = "Option::is_none")]
314 pub close_on_trigger: Option<bool>,
315 #[serde(skip_serializing_if = "Option::is_none")]
316 pub smp_type: Option<String>,
317 #[serde(skip_serializing_if = "Option::is_none")]
318 pub mmp: Option<bool>,
319 #[serde(skip_serializing_if = "Option::is_none")]
320 pub tpsl_mode: Option<BybitTpSlMode>,
321 #[serde(skip_serializing_if = "Option::is_none")]
322 pub tp_limit_price: Option<String>,
323 #[serde(skip_serializing_if = "Option::is_none")]
324 pub sl_limit_price: Option<String>,
325 #[serde(skip_serializing_if = "Option::is_none")]
326 pub tp_order_type: Option<BybitOrderType>,
327 #[serde(skip_serializing_if = "Option::is_none")]
328 pub sl_order_type: Option<BybitOrderType>,
329}
330
331#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
336#[serde(rename_all = "camelCase")]
337pub struct BybitBatchPlaceOrderParams {
338 pub category: BybitProductType,
339 pub request: Vec<BybitBatchPlaceOrderEntry>,
340}
341
342#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
347#[serde(rename_all = "camelCase")]
348pub struct BybitPlaceOrderParams {
349 #[serde(flatten)]
350 pub order: BybitBatchPlaceOrderEntry,
351 pub category: BybitProductType,
352 #[serde(skip_serializing_if = "Option::is_none")]
353 pub slippage_tolerance_type: Option<String>,
354 #[serde(skip_serializing_if = "Option::is_none")]
355 pub slippage_tolerance: Option<String>,
356}
357
358#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
363#[serde(rename_all = "camelCase")]
364pub struct BybitBatchAmendOrderEntry {
365 pub symbol: String,
366 #[serde(skip_serializing_if = "Option::is_none")]
367 #[builder(setter(strip_option))]
368 pub order_id: Option<String>,
369 #[serde(skip_serializing_if = "Option::is_none")]
370 #[builder(setter(strip_option))]
371 pub order_link_id: Option<String>,
372 #[serde(skip_serializing_if = "Option::is_none")]
373 pub order_iv: Option<String>,
374 #[serde(skip_serializing_if = "Option::is_none")]
375 pub trigger_price: Option<String>,
376 #[serde(skip_serializing_if = "Option::is_none")]
377 pub qty: Option<String>,
378 #[serde(skip_serializing_if = "Option::is_none")]
379 pub price: Option<String>,
380 #[serde(skip_serializing_if = "Option::is_none")]
381 pub tpsl_mode: Option<BybitTpSlMode>,
382 #[serde(skip_serializing_if = "Option::is_none")]
383 pub take_profit: Option<String>,
384 #[serde(skip_serializing_if = "Option::is_none")]
385 pub stop_loss: Option<String>,
386 #[serde(skip_serializing_if = "Option::is_none")]
387 pub tp_trigger_by: Option<BybitTriggerType>,
388 #[serde(skip_serializing_if = "Option::is_none")]
389 pub sl_trigger_by: Option<BybitTriggerType>,
390 #[serde(skip_serializing_if = "Option::is_none")]
391 pub trigger_by: Option<BybitTriggerType>,
392 #[serde(skip_serializing_if = "Option::is_none")]
393 pub tp_limit_price: Option<String>,
394 #[serde(skip_serializing_if = "Option::is_none")]
395 pub sl_limit_price: Option<String>,
396}
397
398#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
403#[serde(rename_all = "camelCase")]
404pub struct BybitBatchAmendOrderParams {
405 pub category: BybitProductType,
406 pub request: Vec<BybitBatchAmendOrderEntry>,
407}
408
409#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
414#[serde(rename_all = "camelCase")]
415pub struct BybitAmendOrderParams {
416 #[serde(flatten)]
417 pub order: BybitBatchAmendOrderEntry,
418 pub category: BybitProductType,
419}
420
421#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
426#[serde(rename_all = "camelCase")]
427pub struct BybitBatchCancelOrderEntry {
428 pub symbol: String,
429 #[serde(skip_serializing_if = "Option::is_none")]
430 #[builder(setter(strip_option))]
431 pub order_id: Option<String>,
432 #[serde(skip_serializing_if = "Option::is_none")]
433 #[builder(setter(strip_option))]
434 pub order_link_id: Option<String>,
435 #[serde(skip_serializing_if = "Option::is_none")]
436 pub order_filter: Option<String>,
437}
438
439#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
444#[serde(rename_all = "camelCase")]
445pub struct BybitBatchCancelOrderParams {
446 pub category: BybitProductType,
447 pub request: Vec<BybitBatchCancelOrderEntry>,
448}
449
450#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
455#[serde(rename_all = "camelCase")]
456pub struct BybitCancelOrderParams {
457 #[serde(flatten)]
458 pub order: BybitBatchCancelOrderEntry,
459 pub category: BybitProductType,
460}
461
462#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
467#[serde(rename_all = "camelCase")]
468pub struct BybitCancelAllOrdersParams {
469 pub category: BybitProductType,
470 #[serde(skip_serializing_if = "Option::is_none")]
471 #[builder(setter(strip_option))]
472 pub symbol: Option<String>,
473 #[serde(skip_serializing_if = "Option::is_none")]
474 pub base_coin: Option<String>,
475 #[serde(skip_serializing_if = "Option::is_none")]
476 pub settle_coin: Option<String>,
477 #[serde(skip_serializing_if = "Option::is_none")]
478 pub order_filter: Option<String>,
479 #[serde(skip_serializing_if = "Option::is_none")]
480 pub stop_order_type: Option<String>,
481}
482
483#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
488#[serde(rename_all = "camelCase")]
489pub struct BybitOpenOrdersParams {
490 pub category: BybitProductType,
491 #[serde(skip_serializing_if = "Option::is_none")]
492 #[builder(setter(strip_option))]
493 pub symbol: Option<String>,
494 #[serde(skip_serializing_if = "Option::is_none")]
495 pub base_coin: Option<String>,
496 #[serde(skip_serializing_if = "Option::is_none")]
497 pub settle_coin: Option<String>,
498 #[serde(skip_serializing_if = "Option::is_none")]
499 #[builder(setter(strip_option))]
500 pub order_id: Option<String>,
501 #[serde(skip_serializing_if = "Option::is_none")]
502 #[builder(setter(strip_option))]
503 pub order_link_id: Option<String>,
504}
505
506#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
511#[serde(rename_all = "camelCase")]
512pub struct BybitOrderHistoryParams {
513 pub category: BybitProductType,
514 #[serde(skip_serializing_if = "Option::is_none")]
515 #[builder(setter(strip_option))]
516 pub symbol: Option<String>,
517 #[serde(skip_serializing_if = "Option::is_none")]
518 pub base_coin: Option<String>,
519 #[serde(skip_serializing_if = "Option::is_none")]
520 pub settle_coin: Option<String>,
521 #[serde(skip_serializing_if = "Option::is_none")]
522 pub order_id: Option<String>,
523 #[serde(skip_serializing_if = "Option::is_none")]
524 pub order_link_id: Option<String>,
525 #[serde(skip_serializing_if = "Option::is_none")]
526 pub open_only: Option<i32>,
527 #[serde(skip_serializing_if = "Option::is_none")]
528 pub order_filter: Option<String>,
529 #[serde(skip_serializing_if = "Option::is_none")]
530 pub order_status: Option<BybitOrderStatus>,
531 #[serde(skip_serializing_if = "Option::is_none")]
532 pub start_time: Option<i64>,
533 #[serde(skip_serializing_if = "Option::is_none")]
534 #[serde(rename = "endTime")]
535 pub end_time: Option<i64>,
536 #[serde(skip_serializing_if = "Option::is_none")]
537 #[builder(setter(strip_option))]
538 pub limit: Option<u32>,
539 #[serde(skip_serializing_if = "Option::is_none")]
540 pub cursor: Option<String>,
541}
542
543#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
548#[serde(rename_all = "camelCase")]
549pub struct BybitTradeHistoryParams {
550 pub category: BybitProductType,
551 #[serde(skip_serializing_if = "Option::is_none")]
552 pub symbol: Option<String>,
553 #[serde(skip_serializing_if = "Option::is_none")]
554 pub base_coin: Option<String>,
555 #[serde(skip_serializing_if = "Option::is_none")]
556 pub order_id: Option<String>,
557 #[serde(skip_serializing_if = "Option::is_none")]
558 pub order_link_id: Option<String>,
559 #[serde(skip_serializing_if = "Option::is_none")]
560 pub start_time: Option<i64>,
561 #[serde(skip_serializing_if = "Option::is_none")]
562 #[serde(rename = "endTime")]
563 pub end_time: Option<i64>,
564 #[serde(skip_serializing_if = "Option::is_none")]
565 pub exec_type: Option<BybitExecType>,
566 #[serde(skip_serializing_if = "Option::is_none")]
567 pub limit: Option<u32>,
568 #[serde(skip_serializing_if = "Option::is_none")]
569 pub cursor: Option<String>,
570}
571
572#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
577#[serde(rename_all = "camelCase")]
578pub struct BybitUpdateSubApiParams {
579 #[serde(skip_serializing_if = "Option::is_none")]
580 pub api_key: Option<String>,
581 #[serde(skip_serializing_if = "Option::is_none")]
582 pub read_only: Option<i32>,
583 #[serde(skip_serializing_if = "Option::is_none")]
584 pub ips: Option<String>,
585}