bybit_async/rest/
trade.rs

1use crate::models::order::{CancelOrderResponse, CanceledOrder, NewOrderResponse};
2use crate::models::{
3    NewOrderResponseType, OrderType, PositionSide, Product, Side, TimeInForce, WorkingType,
4};
5use crate::parser::string_or;
6use fehler::throw;
7use reqwest::Method;
8use rust_decimal::Decimal;
9use serde::{Deserialize, Deserializer};
10
11crate::define_request! {
12    Name => NewOrder;
13    Product => Product::UsdMFutures;
14    Method => Method::POST;
15    Endpoint => "/fapi/v1/order";
16    Signed => true;
17    Request => {
18        pub symbol: String,
19        pub side: Side,
20        pub position_side: Option<PositionSide>,
21        pub r#type: OrderType,
22        pub time_in_force: Option<TimeInForce>,
23        pub quantity: Option<Decimal>,
24        pub reduce_only: Option<bool>,
25        pub price: Option<Decimal>,
26        pub new_client_order_id: Option<String>,
27        pub stop_price: Option<Decimal>,
28        pub close_position: Option<bool>,
29        pub activation_price: Option<Decimal>,
30        pub callback_rate: Option<Decimal>,
31        pub working_type: Option<WorkingType>,
32        pub price_protect: Option<Decimal>,
33        pub new_order_resp_type: Option<NewOrderResponseType>,
34    };
35    Response => NewOrderResponse;
36}
37
38crate::define_request! {
39    Name => CancelOrder;
40    Product => Product::UsdMFutures;
41    Method => Method::DELETE;
42    Endpoint => "/fapi/v1/order";
43    Signed => true;
44    Request => {
45        pub symbol: String,
46        pub order_id: Option<u64>,
47        pub orig_client_order_id: Option<String>
48    };
49    Response => CancelOrderResponse;
50}
51
52crate::define_request! {
53    Name => CancelMultipleOrders;
54    Product => Product::UsdMFutures;
55    Method => Method::DELETE;
56    Endpoint => "/fapi/v1/batchOrders";
57    Signed => true;
58    Request => {
59        pub symbol: String,
60        pub order_id_list: Vec<u64>,
61        pub orig_client_order_id_list: Vec<String>,
62    };
63    Response => Vec<CanceledOrder>;
64}
65
66crate::define_request! {
67    Name => CancelAllOpenOrders;
68    Product => Product::UsdMFutures;
69    Method => Method::DELETE;
70    Endpoint => "/fapi/v1/allOpenOrders";
71    Signed => true;
72    Request => {
73        pub symbol: String,
74    };
75    Response => CancelAllOpenOrdersResponse;
76}
77
78#[derive(Deserialize, Debug, Clone)]
79pub struct CancelAllOpenOrdersResponse {
80    #[serde(deserialize_with = "check")]
81    pub code: u64,
82    pub msg: String,
83}
84
85pub fn check<'de, D>(d: D) -> Result<u64, D::Error>
86where
87    D: Deserializer<'de>,
88{
89    let v = u64::deserialize(d)?;
90    if v != 200 {
91        throw!(serde::de::Error::custom("not success code"))
92    }
93    Ok(v)
94}
95
96crate::define_request! {
97    Name => AutoCancelAllOpenOrders;
98    Product => Product::UsdMFutures;
99    Method => Method::POST;
100    Endpoint => "/fapi/v1/countdownCancelAll";
101    Signed => true;
102    Request => {
103        pub symbol: String,
104        pub countdown_time: u64,
105    };
106    Response => {
107        pub symbol: String,
108        #[serde(with="string_or")]
109        pub countdown_time: u64,
110    };
111}