cefi_rs_bybit/rest/
trade.rs1use 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("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 ) -> 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 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}