Bläddra i källkod

rest接口封装、测试完毕。

skyffire 1 år sedan
förälder
incheckning
f4b4936fad

+ 1 - 1
exchanges/src/binance_swap_rest.rs

@@ -344,7 +344,7 @@ impl BinanceSwapRest {
         //是否需要登陆-- 组装sing
         if is_login {
             if !is_login_param {
-                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
                 return e;
             } else {//需要登陆-且登陆参数齐全
                 //组装sing

+ 1 - 1
exchanges/src/bitget_spot_rest.rs

@@ -667,7 +667,7 @@
 //         //是否需要登陆-- 组装sing
 //         if is_login {
 //             if !is_login_param {
-//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
 //                 return e;
 //             } else {
 //                 //需要登陆-且登陆参数齐全

+ 94 - 5
exchanges/src/bitget_swap_rest.rs

@@ -7,6 +7,7 @@ use crate::http_tool::RestTool;
 use crate::response_base::ResponseData;
 use ring::hmac;
 use rust_decimal::prelude::FromPrimitive;
+use serde_json::Value;
 
 #[derive(Clone, Debug)]
 pub struct BitgetSwapRest {
@@ -49,6 +50,94 @@ impl BitgetSwapRest {
         }
     }
 
+    // 获取账户信息
+    pub async fn get_account_info(&mut self) -> ResponseData {
+        let params = serde_json::json!({
+            "productType": "USDT-FUTURES"
+        });
+
+        self.request("GET".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/account/accounts".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
+    // 获取仓位信息(单个)
+    pub async fn get_single_position(&mut self, params: Value) -> ResponseData {
+        self.request("GET".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/position/single-position".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
+    // 下单
+    pub async fn swap_order(&mut self, params: Value) -> ResponseData {
+        self.request("POST".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/order/place-order".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
+    // 撤单
+    pub async fn cancel_order(&mut self, params: Value) -> ResponseData {
+        self.request("POST".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/order/cancel-order".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
+    // 获取订单详情
+    pub async fn get_order(&mut self, params: Value) -> ResponseData {
+        self.request("GET".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/order/detail".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
+    // 获取当前未成交订单
+    pub async fn get_pending_orders(&mut self) -> ResponseData {
+        let params = serde_json::json!({
+            "productType": "USDT-FUTURES"
+        });
+
+        self.request("GET".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/order/orders-pending".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
+    // 调整杠杆
+    pub async fn set_leverage(&mut self, params: Value) -> ResponseData {
+        self.request("POST".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/account/set-leverage".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
+    // 调整持仓模式(单向、双向)
+    pub async fn set_position_mode(&mut self, params: Value) -> ResponseData {
+        self.request("POST".to_string(),
+                     "/api/v2".to_string(),
+                     "/mix/account/set-position-mode".to_string(),
+                     true,
+                     params.to_string(),
+        ).await
+    }
+
     // 发送请求
     pub async fn request(&mut self,
                          method: String,
@@ -89,7 +178,7 @@ impl BitgetSwapRest {
         //是否需要登陆-- 组装sing
         if is_login {
             if !is_login_param {
-                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
                 return e;
             } else {
                 //需要登陆-且登陆参数齐全
@@ -130,11 +219,12 @@ impl BitgetSwapRest {
         match result {
             Ok(res_data) => {
                 if res_data.code != "200" {
+                    info!(?res_data);
                     let json_value = res_data.data;
-                    let code = json_value["code"].as_str().unwrap();
+                    let code = res_data.code;
                     let error = ResponseData::new("".to_string(),
                                                   format!("{}", code),
-                                                  format!("请求地址:{}, 请求参数:{}, 响应结果:{}", base_url, params, json_value.as_str().unwrap()),
+                                                  format!("请求地址:{}, 请求参数:{}, 响应结果:{}", base_url, params, res_data.message),
                                                   json_value);
                     error
                 } else {
@@ -232,8 +322,7 @@ impl BitgetSwapRest {
     // 对请求进行签名处理
     pub fn sign(secret_key: String,
             method: String, prefix_url: String, request_url: String,
-            params: String, body: String, timestamp: String) -> String
-    {
+            params: String, body: String, timestamp: String) -> String {
         let url_param_str = RestTool::parse_params_to_str(params);
         let base_url = if method == "GET" && url_param_str.len() > 0 {
             format!("{}{}?{}", prefix_url, request_url, url_param_str)

+ 1 - 1
exchanges/src/bybit_swap_rest.rs

@@ -341,7 +341,7 @@ impl BybitSwapRest {
         //是否需要登陆-- 组装sing
         if is_login {
             if !is_login_param {
-                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
                 return e;
             } else {
                 //需要登陆-且登陆参数齐全

+ 1 - 1
exchanges/src/gate_swap_rest.rs

@@ -477,7 +477,7 @@ impl GateSwapRest {
         //是否需要登陆-- 组装sing
         if is_login {
             if !is_login_param {
-                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+                let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
                 return e;
             } else {//需要登陆-且登陆参数齐全
                 //组装sing

+ 1 - 1
exchanges/src/kucoin_spot_rest.rs

@@ -339,7 +339,7 @@
 //         //是否需要登陆-- 组装sing
 //         if is_login {
 //             if !is_login_param {
-//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
 //                 return e;
 //             } else {
 //                 //需要登陆-且登陆参数齐全

+ 1 - 1
exchanges/src/kucoin_swap_rest.rs

@@ -444,7 +444,7 @@
 //         //是否需要登陆-- 组装sing
 //         if is_login {
 //             if !is_login_param {
-//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
 //                 return e;
 //             } else {
 //                 //需要登陆-且登陆参数齐全

+ 1 - 1
exchanges/src/okx_swap_rest.rs

@@ -407,7 +407,7 @@
 //         //是否需要登陆-- 组装sing
 //         if is_login {
 //             if !is_login_param {
-//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
+//                 let e = ResponseData::error(self.label.clone(), "登参数错误!".to_string());
 //                 return e;
 //             } else {
 //                 //需要登陆-且登陆参数齐全

+ 147 - 0
exchanges/tests/bitget_swap_test.rs

@@ -0,0 +1,147 @@
+use std::collections::BTreeMap;
+use serde_json::json;
+use tracing::{info};
+use exchanges::bitget_swap_rest::BitgetSwapRest;
+
+const ACCESS_KEY: &str = "";
+const SECRET_KEY: &str = "";
+const PASS_KEY: &str = "";
+
+// 测试账户信息获取
+#[tokio::test]
+async fn rest_get_account_info_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+    let rep_data = rest.get_account_info().await;
+    info!(?rep_data)
+}
+
+// 下单测试
+#[tokio::test]
+async fn post_order_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+    let params = json!({
+        "symbol": "ethusdt",
+        "productType": "USDT-FUTURES",
+        "marginMode": "crossed",
+        "marginCoin": "USDT",
+        "size": "0.1",
+        "price": "1999",
+        "side": "buy",
+        "tradeSide": "open",
+        "orderType": "limit",
+        "clientOid": "1130615111",
+        "reduceOnly": "NO"
+    });
+    let response = rest.swap_order(params).await;
+
+    info!(?response)
+}
+
+// 撤单测试
+#[tokio::test]
+async fn cancel_order_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+    let params = json!({
+        "symbol": "ethusdt",
+        "productType": "USDT-FUTURES",
+        "clientOid": "1130615111",
+    });
+    let response = rest.cancel_order(params).await;
+
+    info!(?response)
+}
+
+// 获取订单详情测试
+#[tokio::test]
+async fn get_order_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+    let params = json!({
+        "symbol": "ETHUSDT",
+        "productType": "USDT-FUTURES",
+        "clientOid": "1130615132",
+    });
+    let response = rest.get_order(params).await;
+
+    info!(?response)
+}
+
+// 获取当前的pending订单
+#[tokio::test]
+async fn get_pending_orders_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+    let response = rest.get_pending_orders().await;
+
+    info!(?response)
+}
+
+// 设置杠杆测试
+#[tokio::test]
+async fn set_leverage_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+
+
+    let params = json!({
+        "symbol": "ETHUSDT",
+        "productType": "USDT-FUTURES",
+        "marginCoin": "USDT",
+        "leverage": "5"
+    });
+    let response = rest.set_leverage(params).await;
+
+    info!(?response)
+}
+
+// 设置持仓模式
+#[tokio::test]
+async fn set_position_mode_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+
+
+    let params = json!({
+        "productType": "USDT-FUTURES",
+        "posMode": "hedge_mode",
+    });
+    let response = rest.set_position_mode(params).await;
+
+    info!(?response)
+}
+
+// 获取仓位信息
+#[tokio::test]
+async fn get_single_position_test() {
+    global::log_utils::init_log_with_info();
+
+    let mut rest = get_rest();
+    let params = json!({
+        "productType": "USDT-FUTURES",
+        "symbol": "ETHUSDT",
+        "marginCoin": "USDT"
+    });
+    let response = rest.get_single_position(params).await;
+
+    info!(?response)
+}
+
+fn get_rest() -> BitgetSwapRest {
+    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+
+    btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
+    btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
+    btree_map.insert("pass_key".to_string(), PASS_KEY.to_string());
+
+    BitgetSwapRest::new(false, btree_map)
+}