bybit-api 0.1.2

A Rust SDK for the Bybit V5 API - async, type-safe, zero-panic
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
//! Position models.

use crate::models::common::*;
use serde::{Deserialize, Serialize};

/// Position list response.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PositionList {
    /// Category
    pub category: String,
    /// List of positions
    pub list: Vec<Position>,
    /// Next page cursor
    #[serde(default)]
    pub next_page_cursor: String,
}

/// Position info.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Position {
    /// Position index
    pub position_idx: i32,
    /// Risk ID
    #[serde(default)]
    pub risk_id: i32,
    /// Risk limit value
    #[serde(default)]
    pub risk_limit_value: String,
    /// Symbol
    pub symbol: String,
    /// Side
    pub side: String,
    /// Size
    pub size: String,
    /// Average entry price
    #[serde(default)]
    pub avg_price: String,
    /// Position value
    #[serde(default)]
    pub position_value: String,
    /// Trade mode (0=cross, 1=isolated)
    #[serde(default)]
    pub trade_mode: i32,
    /// Position status
    #[serde(default)]
    pub position_status: String,
    /// Leverage
    #[serde(default)]
    pub leverage: String,
    /// Mark price
    #[serde(default)]
    pub mark_price: String,
    /// Liquidation price
    #[serde(default)]
    pub liq_price: String,
    /// Bust price
    #[serde(default)]
    pub bust_price: String,
    /// Position margin
    #[serde(default)]
    pub position_mm: String,
    /// Position initial margin
    #[serde(default)]
    pub position_im: String,
    /// Take profit price
    #[serde(default)]
    pub take_profit: String,
    /// Stop loss price
    #[serde(default)]
    pub stop_loss: String,
    /// Trailing stop
    #[serde(default)]
    pub trailing_stop: String,
    /// Unrealised PnL
    #[serde(default)]
    pub unrealised_pnl: String,
    /// Cumulative realised PnL
    #[serde(default)]
    pub cum_realised_pnl: String,
    /// Created time
    #[serde(default)]
    pub created_time: String,
    /// Updated time
    #[serde(default)]
    pub updated_time: String,
}

/// Set leverage request.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SetLeverageParams {
    /// Category
    pub category: Category,
    /// Symbol
    pub symbol: String,
    /// Buy leverage
    pub buy_leverage: String,
    /// Sell leverage
    pub sell_leverage: String,
}

/// Trading stop request.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TradingStopParams {
    /// Category
    pub category: Category,
    /// Symbol
    pub symbol: String,
    /// Take profit price
    #[serde(skip_serializing_if = "Option::is_none")]
    pub take_profit: Option<String>,
    /// Stop loss price
    #[serde(skip_serializing_if = "Option::is_none")]
    pub stop_loss: Option<String>,
    /// Trailing stop
    #[serde(skip_serializing_if = "Option::is_none")]
    pub trailing_stop: Option<String>,
    /// Take profit trigger
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tp_trigger_by: Option<TriggerBy>,
    /// Stop loss trigger
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sl_trigger_by: Option<TriggerBy>,
    /// Position index
    #[serde(skip_serializing_if = "Option::is_none")]
    pub position_idx: Option<i32>,
}

/// Switch position mode request.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SwitchPositionModeParams {
    /// Category
    pub category: Category,
    /// Symbol (optional)
    #[serde(skip_serializing_if = "Option::is_none")]
    pub symbol: Option<String>,
    /// Coin (optional)
    #[serde(skip_serializing_if = "Option::is_none")]
    pub coin: Option<String>,
    /// Mode (0=merged, 3=both sides)
    pub mode: i32,
}

/// Set risk limit request.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SetRiskLimitParams {
    /// Category
    pub category: Category,
    /// Symbol
    pub symbol: String,
    /// Risk ID
    pub risk_id: i32,
    /// Position index
    #[serde(skip_serializing_if = "Option::is_none")]
    pub position_idx: Option<i32>,
}

/// Add margin request.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddMarginParams {
    /// Category
    pub category: Category,
    /// Symbol
    pub symbol: String,
    /// Margin amount
    pub margin: String,
    /// Position index
    #[serde(skip_serializing_if = "Option::is_none")]
    pub position_idx: Option<i32>,
}

/// Closed PnL response.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ClosedPnlList {
    /// Category
    pub category: String,
    /// List of closed PnL records
    pub list: Vec<ClosedPnl>,
    /// Next page cursor
    #[serde(default)]
    pub next_page_cursor: String,
}

/// Closed PnL record.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ClosedPnl {
    /// Symbol
    pub symbol: String,
    /// Order ID
    pub order_id: String,
    /// Side
    pub side: String,
    /// Qty
    pub qty: String,
    /// Order price
    pub order_price: String,
    /// Order type
    pub order_type: String,
    /// Exec type
    pub exec_type: String,
    /// Closed size
    pub closed_size: String,
    /// Cumulative entry value
    pub cum_entry_value: String,
    /// Average entry price
    pub avg_entry_price: String,
    /// Cumulative exit value
    pub cum_exit_value: String,
    /// Average exit price
    pub avg_exit_price: String,
    /// Closed PnL
    pub closed_pnl: String,
    /// Fill count
    pub fill_count: String,
    /// Leverage
    pub leverage: String,
    /// Created time
    pub created_time: String,
    /// Updated time
    pub updated_time: String,
}

/// Execution list response.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecutionList {
    /// Category
    pub category: String,
    /// List of executions
    pub list: Vec<Execution>,
    /// Next page cursor
    #[serde(default)]
    pub next_page_cursor: String,
}

/// Execution record.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Execution {
    /// Symbol
    pub symbol: String,
    /// Order ID
    pub order_id: String,
    /// Order link ID
    #[serde(default)]
    pub order_link_id: String,
    /// Side
    pub side: String,
    /// Order price
    pub order_price: String,
    /// Order qty
    pub order_qty: String,
    /// Order type
    pub order_type: String,
    /// Exec ID
    pub exec_id: String,
    /// Exec price
    pub exec_price: String,
    /// Exec qty
    pub exec_qty: String,
    /// Exec fee
    pub exec_fee: String,
    /// Exec type
    pub exec_type: String,
    /// Exec value
    pub exec_value: String,
    /// Fee rate
    #[serde(default)]
    pub fee_rate: String,
    /// Exec time
    pub exec_time: String,
}

pub type AddReduceMarginResponse = AddReduceMarginResult;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddReduceMarginResult {
    #[serde(default)]
    pub category: String,
    #[serde(default)]
    pub symbol: String,
    #[serde(default)]
    pub position_idx: i32,
    #[serde(default)]
    pub risk_id: i32,
    #[serde(default)]
    pub risk_limit_value: String,
    #[serde(default)]
    pub size: String,
    #[serde(default)]
    pub avg_price: String,
    #[serde(default)]
    pub liq_price: String,
    #[serde(default)]
    pub bust_price: String,
    #[serde(default)]
    pub mark_price: String,
    #[serde(default)]
    pub position_value: String,
    #[serde(default)]
    pub leverage: String,
    #[serde(default)]
    pub auto_add_margin: i32,
    #[serde(default)]
    pub position_status: String,
    #[serde(rename = "positionIM", default)]
    pub position_im: String,
    #[serde(rename = "positionMM", default)]
    pub position_mm: String,
    #[serde(default)]
    pub take_profit: String,
    #[serde(default)]
    pub stop_loss: String,
    #[serde(default)]
    pub trailing_stop: String,
    #[serde(default)]
    pub unrealised_pnl: String,
    #[serde(default)]
    pub cum_realised_pnl: String,
    #[serde(default)]
    pub created_time: String,
    #[serde(default)]
    pub updated_time: String,
}

pub type ConfirmNewRiskLimitResponse = serde_json::Value;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConfirmNewRiskLimitParams {
    pub category: String,
    pub symbol: String,
}

pub type GetClosePositionResponse = GetClosePositionResult;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetClosePositionResult {
    #[serde(default)]
    pub category: String,
    #[serde(default)]
    pub list: Vec<GetClosePositionItem>,
    #[serde(default)]
    pub next_page_cursor: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetClosePositionItem {
    #[serde(default)]
    pub symbol: String,
    #[serde(default)]
    pub side: String,
    #[serde(default)]
    pub qty: String,
    #[serde(default)]
    pub avg_entry_price: String,
    #[serde(default)]
    pub avg_exit_price: String,
    #[serde(default)]
    pub delivery_price: String,
    #[serde(default)]
    pub total_open_fee: String,
    #[serde(default)]
    pub total_close_fee: String,
    #[serde(default)]
    pub delivery_fee: String,
    #[serde(default)]
    pub total_pnl: String,
    #[serde(default)]
    pub open_time: i64,
    #[serde(default)]
    pub close_time: i64,
}

pub type GetClosedPnlResponse = GetClosedPnlResult;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetClosedPnlResult {
    #[serde(default)]
    pub category: String,
    #[serde(default)]
    pub list: Vec<ClosedPnlItem>,
    #[serde(default)]
    pub next_page_cursor: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ClosedPnlItem {
    #[serde(default)]
    pub symbol: String,
    #[serde(default)]
    pub order_id: String,
    #[serde(default)]
    pub side: String,
    #[serde(default)]
    pub qty: String,
    #[serde(default)]
    pub order_price: String,
    #[serde(default)]
    pub order_type: String,
    #[serde(default)]
    pub exec_type: String,
    #[serde(default)]
    pub closed_size: String,
    #[serde(default)]
    pub cum_entry_value: String,
    #[serde(default)]
    pub avg_entry_price: String,
    #[serde(default)]
    pub cum_exit_value: String,
    #[serde(default)]
    pub avg_exit_price: String,
    #[serde(default)]
    pub closed_pnl: String,
    #[serde(default)]
    pub fill_count: String,
    #[serde(default)]
    pub leverage: String,
    #[serde(default)]
    pub open_fee: String,
    #[serde(default)]
    pub close_fee: String,
    #[serde(default)]
    pub created_time: String,
    #[serde(default)]
    pub updated_time: String,
}

pub type GetMovePositionHistoryResponse = GetMovePositionHistoryResult;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetMovePositionHistoryResult {
    #[serde(default)]
    pub list: Vec<GetMovePositionHistoryItem>,
    #[serde(default)]
    pub next_page_cursor: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetMovePositionHistoryItem {
    #[serde(default)]
    pub block_trade_id: String,
    #[serde(default)]
    pub category: String,
    #[serde(default)]
    pub order_id: String,
    #[serde(default)]
    pub user_id: i64,
    #[serde(default)]
    pub symbol: String,
    #[serde(default)]
    pub side: String,
    #[serde(default)]
    pub price: String,
    #[serde(default)]
    pub qty: String,
    #[serde(default)]
    pub exec_fee: String,
    #[serde(default)]
    pub status: String,
    #[serde(default)]
    pub exec_id: String,
    #[serde(default)]
    pub result_code: i32,
    #[serde(default)]
    pub result_message: String,
    #[serde(default)]
    pub created_at: i64,
    #[serde(default)]
    pub updated_at: i64,
    #[serde(default)]
    pub reject_party: String,
}

pub type GetPositionInfoResponse = GetPositionInfoResult;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetPositionInfoResult {
    #[serde(default)]
    pub category: String,
    #[serde(default)]
    pub list: Vec<PositionInfo>,
    #[serde(default)]
    pub next_page_cursor: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PositionInfo {
    #[serde(default)]
    pub position_idx: i32,
    #[serde(default)]
    pub risk_id: i32,
    #[serde(default)]
    pub risk_limit_value: String,
    #[serde(default)]
    pub symbol: String,
    #[serde(default)]
    pub side: String,
    #[serde(default)]
    pub size: String,
    #[serde(default)]
    pub avg_price: String,
    #[serde(default)]
    pub position_value: String,
    #[serde(default)]
    pub trade_mode: i32,
    #[serde(default)]
    pub auto_add_margin: i32,
    #[serde(default)]
    pub position_status: String,
    #[serde(default)]
    pub leverage: String,
    #[serde(default)]
    pub mark_price: String,
    #[serde(default)]
    pub liq_price: String,
    #[serde(default)]
    pub bust_price: String,
    #[serde(rename = "positionIM", default)]
    pub position_im: String,
    #[serde(rename = "positionMM", default)]
    pub position_mm: String,
    #[serde(default)]
    pub position_balance: String,
    #[serde(default)]
    pub tpsl_mode: String,
    #[serde(default)]
    pub take_profit: String,
    #[serde(default)]
    pub stop_loss: String,
    #[serde(default)]
    pub trailing_stop: String,
    #[serde(default)]
    pub unrealised_pnl: String,
    #[serde(default)]
    pub cur_realised_pnl: String,
    #[serde(default)]
    pub cum_realised_pnl: String,
    #[serde(default)]
    pub break_even_price: String,
    #[serde(default)]
    pub adl_rank_indicator: i32,
    #[serde(default)]
    pub is_reduce_only: bool,
    #[serde(default)]
    pub mmr_sys_updated_time: String,
    #[serde(default)]
    pub leverage_sys_updated_time: String,
    #[serde(rename = "positionIMByMp", default)]
    pub position_im_by_mp: String,
    #[serde(rename = "positionMMByMp", default)]
    pub position_mm_by_mp: String,
    #[serde(default)]
    pub session_avg_price: String,
    #[serde(default)]
    pub delta: String,
    #[serde(default)]
    pub gamma: String,
    #[serde(default)]
    pub vega: String,
    #[serde(default)]
    pub theta: String,
    #[serde(default)]
    pub seq: i64,
    #[serde(default)]
    pub created_time: String,
    #[serde(default)]
    pub updated_time: String,
}

pub type MovePositionResponse = MovePositionResult;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MovePositionResult {
    #[serde(default)]
    pub block_trade_id: String,
    #[serde(default)]
    pub status: String,
    #[serde(default)]
    pub reject_party: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MovePositionLeg {
    pub category: String,
    pub symbol: String,
    pub price: String,
    pub side: String,
    pub qty: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MovePositionParams {
    pub from_uid: String,
    pub to_uid: String,
    pub list: Vec<MovePositionLeg>,
}

pub type SetAutoAddMarginResponse = serde_json::Value;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SetAutoAddMarginParams {
    pub category: String,
    pub symbol: String,
    pub auto_add_margin: i32,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub position_idx: Option<i32>,
}

pub type SetLeverageResponse = serde_json::Value;

pub type SwitchPositionModeResponse = serde_json::Value;