cefi_rs_bybit/rest/
trade.rs

1use std::collections::HashMap;
2
3use serde_json::{Map, json};
4
5use crate::{
6    errors::BybitResult,
7    http::BybitHttp,
8    types::{CancelAllOrdersResponse, GetOrderResponse, OrderResponse},
9};
10
11impl BybitHttp {
12    pub async fn get_open_order(
13        &self,
14        symbol: &String,
15        cloid: Option<String>,
16    ) -> BybitResult<GetOrderResponse> {
17        let mut params = HashMap::new();
18        params.insert("category", "linear");
19        params.insert("symbol", symbol);
20        params.insert("settleCoin", "USDT");
21        let cloid_value: String;
22        if let Some(cloid) = cloid {
23            cloid_value = cloid;
24            params.insert("orderLinkId", cloid_value.as_str());
25        }
26
27        self.send_get_request::<GetOrderResponse>("v5/order/realtime", params, true)
28            .await
29    }
30
31    pub async fn place_order(
32        &self,
33        _cloid: &String,
34        symbol: &String,
35        side: &String,
36        price: &String,
37        qty: &String,
38    ) -> BybitResult<OrderResponse> {
39        let mut params = Map::new();
40        // params.insert("orderLinkId".to_string(), json!(cloid));
41        params.insert("category".to_string(), json!("linear"));
42        params.insert("symbol".to_string(), json!(symbol));
43        params.insert("side".to_string(), json!(side));
44        params.insert("positionIdx".to_string(), json!(0));
45        params.insert("orderType".to_string(), json!("Limit"));
46        params.insert("qty".to_string(), json!(qty));
47        params.insert("price".to_string(), json!(price));
48        params.insert("timeInForce".to_string(), json!("GTC"));
49
50        self.send_post_request::<OrderResponse>("v5/order/create", params)
51            .await
52    }
53
54    pub async fn cancel_order(
55        &self,
56        symbol: &String,
57        cloid: &String,
58    ) -> BybitResult<OrderResponse> {
59        let mut params = Map::new();
60        params.insert("category".to_string(), json!("linear"));
61        params.insert("symbol".to_string(), json!(symbol));
62        params.insert("orderLinkId".to_string(), json!(cloid));
63
64        self.send_post_request::<OrderResponse>("v5/order/cancel", params)
65            .await
66    }
67
68    pub async fn cancel_all_orders(&self, symbol: &String) -> BybitResult<CancelAllOrdersResponse> {
69        let mut params = Map::new();
70        params.insert("category".to_string(), json!("linear"));
71        params.insert("symbol".to_string(), json!(symbol));
72
73        self.send_post_request::<CancelAllOrdersResponse>("v5/order/cancel-all", params)
74            .await
75    }
76
77    pub async fn amend_order(
78        &self,
79        symbol: &String,
80        cloid: &String,
81        price: &String,
82        // qty: &String,
83    ) -> BybitResult<OrderResponse> {
84        let mut params = Map::new();
85        params.insert("category".to_string(), json!("linear"));
86        params.insert("orderLinkId".to_string(), json!(cloid));
87        params.insert("symbol".to_string(), json!(symbol));
88        params.insert("price".to_string(), json!(price));
89        // params.insert("qty".to_string(), json!(qty));
90
91        self.send_post_request::<OrderResponse>("v5/order/amend", params)
92            .await
93    }
94}
95
96#[cfg(test)]
97mod tests {
98    use super::*;
99    use dotenv::dotenv;
100
101    #[tokio::test]
102    async fn test_place_order() -> BybitResult<()> {
103        dotenv().ok();
104        let api_key = std::env::var("BYBIT_API_KEY").expect("BYBIT_API_KEY");
105        let api_secret = std::env::var("BYBIT_API_SECRET").expect("BYBIT_API_SECRET");
106        let client = BybitHttp::new(api_key.to_string(), api_secret.to_string());
107        let res = client
108            .place_order(
109                &"".to_string(),
110                &"SOLUSDT".to_string(),
111                &"Buy".to_string(),
112                &"110".to_string(),
113                &"0.1".to_string(),
114            )
115            .await;
116        println!("{:?}", res);
117        Ok(())
118    }
119
120    #[tokio::test]
121    async fn test_get_open_order() -> BybitResult<()> {
122        dotenv().ok();
123        let api_key = std::env::var("BYBIT_API_KEY").expect("BYBIT_API_KEY");
124        let api_secret = std::env::var("BYBIT_API_SECRET").expect("BYBIT_API_SECRET");
125        let client = BybitHttp::new(api_key.to_string(), api_secret.to_string());
126        let res = client.get_open_order(&"SOLUSDT".to_string(), None).await;
127        println!("{:?}", res);
128        Ok(())
129    }
130
131    #[tokio::test]
132    async fn test_cancel_all_orders() -> BybitResult<()> {
133        dotenv().ok();
134        let api_key = std::env::var("BYBIT_API_KEY").expect("BYBIT_API_KEY");
135        let api_secret = std::env::var("BYBIT_API_SECRET").expect("BYBIT_API_SECRET");
136        let client = BybitHttp::new(api_key.to_string(), api_secret.to_string());
137        let res = client.cancel_all_orders(&"SOLUSDT".to_string()).await;
138        println!("{:?}", res);
139        Ok(())
140    }
141}