skyfffire 1 年之前
父節點
當前提交
ac9702cb51
共有 2 個文件被更改,包括 283 次插入193 次删除
  1. 97 109
      exchanges/src/binance_swap_rest.rs
  2. 186 84
      exchanges/tests/binance_swap_test.rs

+ 97 - 109
exchanges/src/binance_swap_rest.rs

@@ -2,6 +2,7 @@ use std::collections::BTreeMap;
 use std::str::FromStr;
 
 use hex;
+use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
 use reqwest::{Client, Proxy};
 use reqwest::header::HeaderMap;
 use ring::hmac;
@@ -95,7 +96,6 @@ impl BinanceSwapRest {
     //账户信息
     pub async fn get_account(&mut self) -> ResponseData {
         let params = serde_json::json!({
-            "recvWindow":"2000"
          });
 
         let data = self.request("GET".to_string(),
@@ -106,20 +106,37 @@ impl BinanceSwapRest {
         ).await;
         data
     }
-
-    //查询订单
-    pub async fn get_order(&mut self, symbol: String, order_id: i64, orig_client_order_id: String) -> ResponseData {
-        let mut params = serde_json::json!({
+    //更改持仓模式
+    pub async fn change_pos_side(&mut self, dual_side_position: bool) -> ResponseData {
+        let dual_side_position_str = format!("{}", dual_side_position);
+        let params = serde_json::json!({
+            "dualSidePosition":dual_side_position_str
+         });
+        let data = self.request("POST".to_string(),
+                                "".to_string(),
+                                format!("/fapi/v1/positionSide/dual"),
+                                true,
+                                params,
+        ).await;
+        data
+    }
+    //调整开仓杠杆
+    pub async fn setting_dual_leverage(&mut self, symbol: String,leverage :i64) -> ResponseData {
+        let params = serde_json::json!({
             "symbol":symbol,
-            "recvWindow":"2000"
+            "leverage":leverage
          });
-        if order_id > 0 {
-            params["orderId"] = json!(order_id);
-        }
-        if orig_client_order_id.len() > 0 {
-            params["origClientOrderId"] = json!(orig_client_order_id);
-        }
+        let data = self.request("POST".to_string(),
+                                "".to_string(),
+                                format!("/fapi/v1/leverage"),
+                                true,
+                                params,
+        ).await;
+        data
+    }
 
+    //查询订单
+    pub async fn get_order(&mut self,params:Value) -> ResponseData {
         let data = self.request("GET".to_string(),
                                 "".to_string(),
                                 format!("/fapi/v1/order"),
@@ -128,13 +145,19 @@ impl BinanceSwapRest {
         ).await;
         data
     }
-    //查看当前全部挂单
-    pub async fn get_open_orders(&mut self, symbol: String) -> ResponseData {
-        let params = serde_json::json!({
-            "symbol":symbol,
-            "recvWindow":"2000"
-         });
 
+    //查询当前挂单
+    pub async fn get_open_order(&mut self, params: Value) -> ResponseData {
+        let data = self.request("GET".to_string(),
+                                "".to_string(),
+                                format!("/fapi/v1/openOrder"),
+                                true,
+                                params,
+        ).await;
+        data
+    }
+    //查看当前全部挂单
+    pub async fn get_open_orders(&mut self, params: Value) -> ResponseData {
         let data = self.request("GET".to_string(),
                                 "".to_string(),
                                 format!("/fapi/v1/openOrders"),
@@ -143,16 +166,9 @@ impl BinanceSwapRest {
         ).await;
         data
     }
-    //查询所有订单(包括历史订单)
-    pub async fn get_all_orders(&mut self, symbol: String, limit: u64, start_time: i64, end_time: i64) -> ResponseData {
-        let params = serde_json::json!({
-            "symbol":symbol,
-            "limit":limit,
-            "startTime":start_time,
-            "endTime":end_time,
-            "recvWindow":"2000"
-         });
 
+    //查询所有订单(包括历史订单)
+    pub async fn get_all_orders(&mut self, params: Value) -> ResponseData {
         let data = self.request("GET".to_string(),
                                 "".to_string(),
                                 format!("/fapi/v1/allOrders"),
@@ -161,6 +177,17 @@ impl BinanceSwapRest {
         ).await;
         data
     }
+    //下单
+    pub async fn swap_order(&mut self, params: serde_json::Value) -> ResponseData {
+        let data = self.request("POST".to_string(),
+                                "".to_string(),
+                                format!("/fapi/v1/order"),
+                                true,
+                                params,
+        ).await;
+        data
+    }
+
     //当前最优挂单
     pub async fn get_book_ticker(&mut self, symbol: String) -> ResponseData {
         let params = serde_json::json!({
@@ -178,8 +205,7 @@ impl BinanceSwapRest {
     //用户持仓风险V2
     pub async fn get_position_risk(&mut self, symbol: String) -> ResponseData {
         let params = serde_json::json!({
-            "symbol":symbol,
-            "recvWindow":"2000"
+            "symbol":symbol
          });
 
         let data = self.request("GET".to_string(),
@@ -191,9 +217,10 @@ impl BinanceSwapRest {
         data
     }
 
-    //下单
-    pub async fn swap_order(&mut self, params: serde_json::Value) -> ResponseData {
-        let data = self.request("POST".to_string(),
+
+    //撤销订单
+    pub async fn cancel_order(&mut self, params: Value) -> ResponseData {
+        let data = self.request("DELETE".to_string(),
                                 "".to_string(),
                                 format!("/fapi/v1/order"),
                                 true,
@@ -201,50 +228,21 @@ impl BinanceSwapRest {
         ).await;
         data
     }
-    //更改持仓模式
-    pub async fn change_pos_side(&mut self, dual_side_position: bool) -> ResponseData {
-        let dual_side_position_str = format!("{}", dual_side_position);
-        let params = serde_json::json!({
-            "dualSidePosition":dual_side_position_str,
-            "recvWindow":"2000"
-         });
-        let data = self.request("POST".to_string(),
-                                "".to_string(),
-                                format!("/fapi/v1/positionSide/dual"),
-                                true,
-                                params,
-        ).await;
-        data
-    }
-    //撤销订单
-    pub async fn cancel_order(&mut self, symbol: String, order_id: i64, orig_client_order_id: String) -> ResponseData {
-        let mut params = serde_json::json!({
-            "symbol":symbol,
-            "recvWindow":"2000"
-         });
-        if order_id > 0 {
-            params["orderId"] = json!(order_id);
-        }
-        if orig_client_order_id.len() > 0 {
-            params["origClientOrderId"] = json!(orig_client_order_id);
-        }
+    //根据币对 撤销全部订单
+    pub async fn cancel_order_all(&mut self, params: Value) -> ResponseData {
         let data = self.request("DELETE".to_string(),
                                 "".to_string(),
-                                format!("/fapi/v1/order"),
+                                format!("/fapi/v1/allOpenOrders"),
                                 true,
                                 params,
         ).await;
         data
     }
-    //根据币对 撤销全部订单
-    pub async fn cancel_order_all(&mut self, symbol: String) -> ResponseData {
-        let params = serde_json::json!({
-            "symbol":symbol,
-            "recvWindow":"2000",
-         });
+    //批量撤销订单
+    pub async fn cancel_order_batch(&mut self, params: Value) -> ResponseData {
         let data = self.request("DELETE".to_string(),
                                 "".to_string(),
-                                format!("/fapi/v1/allOpenOrders"),
+                                format!("/fapi/v1/batchOrders"),
                                 true,
                                 params,
         ).await;
@@ -254,8 +252,7 @@ impl BinanceSwapRest {
     pub async fn get_user_trades(&mut self, symbol: String, start_time: i64, end_time: i64, limit: i64) -> ResponseData {
         let mut params = serde_json::json!({
             "symbol":symbol,
-            "limit":1000,
-            "recvWindow":"1000",
+            "limit":1000
          });
         if start_time > 0 {
             params["startTime"] = json!(start_time);
@@ -331,8 +328,9 @@ impl BinanceSwapRest {
         }
 
         //请求头配置-如果需要登录则存在额外配置
-        let timestamp = chrono::Utc::now().timestamp_millis().to_string();
+        let timestamp = chrono::Utc::now().timestamp_millis();
         params_json["timestamp"] = Value::from(timestamp);
+        params_json["recvWindow"] = Value::from(2000);
 
         let mut body = "".to_string();
         let mut params = "".to_string();
@@ -349,7 +347,8 @@ impl BinanceSwapRest {
             if !is_login_param {
                 let e = ResponseData::error(self.label.clone(), "登录参数错误!".to_string());
                 return e;
-            } else {//需要登录-且登录参数齐全
+            } else { //需要登录-且登录参数齐全
+                trace!("this------params_json:{}", params_json.clone());
                 //组装sing
                 let sing = Self::sign(secret_key.clone(),
                                       params_json.to_string(),
@@ -360,13 +359,11 @@ impl BinanceSwapRest {
                 headers.extend(Self::headers(access_key));
             }
         }
-        if method == "POST" {
-            body = params_json.to_string();
-        }
-        if method == "GET" || method == "PUT" || method == "DELETE" {
-            let z = params_json.to_string();
-            params = RestTool::parse_params_to_str(z);
-        }
+
+        let z = params_json.to_string();
+        body = RestTool::parse_params_to_str(z.clone());
+        params = RestTool::parse_params_to_str(z.clone());
+
 
         trace!("headers:{:?}", headers);
         let start_time = chrono::Utc::now().timestamp_millis();
@@ -396,13 +393,25 @@ impl BinanceSwapRest {
         /*签名生成*/
         let params_str_v = RestTool::parse_params_to_str(params_str.to_string());
         let message = format!("{}", params_str_v);
+        // trace!("this------message:{}", message.clone());
+
+
+        // let hmac_key = ring::hmac::Key::new(hmac::HMAC_SHA256, secret_key.as_bytes());
+        // let result = ring::hmac::sign(&hmac_key, &message.as_bytes());
+        // let sign = base64::encode(result);
+        // // '\n'
+        // let sign_1 = sign.replace("\n", "");
+        // // '=' '/'
+        // let sign_2 = utf8_percent_encode(sign_1.as_str(), NON_ALPHANUMERIC).to_string();
+        //
+        // sign_2
 
-        // let secret_key2 = "2b5eb11e18796d12d88f13dc27dbbd02c2cc51ff7059765ed9821957d82bb4d9";
-        // let message2 = "symbol=BTCUSDT&side=BUY&type=LIMIT&quantity=1&price=9000&timeInForce=GTC&recvWindow=5000&timestamp=1591702613943";
         let signed_key = hmac::Key::new(hmac::HMAC_SHA256, secret_key.as_ref());
         let sign = hex::encode(hmac::sign(&signed_key, message.as_bytes()).as_ref());
+        let sign_1 = sign.replace("\n", "");
+        let sign_2 = utf8_percent_encode(sign_1.as_str(), NON_ALPHANUMERIC).to_string();
 
-        sign
+        sign_2
     }
 
 
@@ -421,7 +430,7 @@ impl BinanceSwapRest {
             format!("{}?{}", url.clone(), params)
         };
 
-
+        let query = params.clone();
         trace!("url-----:{}",url.clone());
         trace!("addrs_url-----:{}",addrs_url.clone());
         trace!("params-----:{}",params.clone());
@@ -429,35 +438,14 @@ impl BinanceSwapRest {
         trace!("headers-----:{:?}",headers.clone());
         trace!("request_type-----:{:?}",request_type.clone());
 
-        // let parsing_detail = proxy::ParsingDetail::parsing_environment_variables(Some("binance"));
-        // // let parsing_detail = proxy::ParsingDetail::parsing_environment_variables(None);
-        // let client = if parsing_detail.ip_address.len() > 0 && parsing_detail.port.len() > 0 {
-        //     let proxy_address = format!("http://{}:{}", parsing_detail.ip_address, parsing_detail.port);
-        //     // let proxy_address = "socks5://127.0.0.1:17890"; // 替换为你的 SOCKS5 代理地址
-        //     trace!("http_proxy-----:{:?}",proxy_address.clone());
-        //     let proxy = Proxy::all(proxy_address).unwrap();
-        //     Client::builder().proxy(proxy).build().unwrap()
-        // } else {
-        //     Client::new()
-        // };
-
-        let client = if is_login {
-            let params = proxy::ParsingDetail::http_enable_proxy(Some("binance"));
-            // let params = proxy::ParsingDetail::http_enable_proxy(None);
-            let client_re;
-            if params {
-                let proxy_address = "socks5://127.0.0.1:17890"; // 替换为你的 SOCKS5 代理地址
-                let proxy = Proxy::all(proxy_address).unwrap();
-                client_re = Client::builder().proxy(proxy).build().unwrap();
-            } else {
-                client_re =  Client::new()
-            }
-            client_re
+
+        if is_login {
+            proxy::ParsingDetail::http_enable_proxy(Some("binance"));
         } else {
             proxy::ParsingDetail::http_enable_proxy(None);
-            Client::new()
         };
 
+        let client = Client::new();
 
         let request_builder = match request_type.as_str() {
             "GET" => client.get(addrs_url.clone()).headers(headers),
@@ -473,7 +461,7 @@ impl BinanceSwapRest {
         let response = request_builder.send().await.unwrap();
         let is_success = response.status().is_success(); // 先检查状态码
         let text = response.text().await.unwrap();
-        trace!("text:???{:?}",text);
+        // trace!("text:???{:?}",text);
         return if is_success {
             self.on_success_data(text)
         } else {
@@ -496,7 +484,7 @@ impl BinanceSwapRest {
                 let message = data["msg"].as_str().unwrap();
 
                 let mut error = ResponseData::error(self.label.clone(), message.to_string());
-                error.code = i16::from_str(data["code"].as_str().unwrap()).unwrap();
+                error.code = data["code"].as_i64().unwrap() as i16;
                 error.message = format!("请求地址:{}, 请求参数:{}", base_url, params);
                 error
             }

+ 186 - 84
exchanges/tests/binance_swap_test.rs

@@ -2,7 +2,7 @@ use std::cmp::max;
 use std::collections::BTreeMap;
 use std::sync::Arc;
 use std::sync::atomic::AtomicBool;
-
+use serde_json::json;
 use tokio::sync::Mutex;
 use tracing::{info, trace};
 
@@ -19,87 +19,87 @@ const SECRET_KEY: &str = "";
 #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
 async fn ws_custom_subscribe() {
     global::log_utils::init_log_with_trace();
-    //
-    //
-    // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-    // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-    //
-    // // let (write_tx, write_rx) = tokio::sync::broadcast::channel::<Message>(10);
-    // // let (read_tx, mut read_rx) = tokio::sync::broadcast::channel::<ResponseData>(10);
-    //
-    //
-    // let mut ws = get_ws(None);
-    // ws.set_symbols(vec!["BTC_USDT".to_string()]);
-    // ws.set_subscribe(vec![
-    //     BinanceSwapSubscribeType::PuBookTicker,
-    //     // BinanceSwapSubscribeType::PuAggTrade,
-    //     // BinanceSwapSubscribeType::PuDepth20levels100ms,
-    // ]);
-    //
-    //
-    // let write_tx_am = Arc::new(Mutex::new(write_tx));
-    // let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-    //
-    // //读取
-    // let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-    // let _tr = tokio::spawn(async move {
-    //     trace!("线程-数据读取-开启");
-    //     let mut max_delay = 0i64;
+
+
+    let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
+    let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
+
+    // let (write_tx, write_rx) = tokio::sync::broadcast::channel::<Message>(10);
+    // let (read_tx, mut read_rx) = tokio::sync::broadcast::channel::<ResponseData>(10);
+
+
+    let mut ws = get_ws(None);
+    ws.set_symbols(vec!["BTC_USDT".to_string()]);
+    ws.set_subscribe(vec![
+        BinanceSwapSubscribeType::PuBookTicker,
+        // BinanceSwapSubscribeType::PuAggTrade,
+        // BinanceSwapSubscribeType::PuDepth20levels100ms,
+    ]);
+
+
+    let write_tx_am = Arc::new(Mutex::new(write_tx));
+    let is_shutdown_arc = Arc::new(AtomicBool::new(true));
+
+    //读取
+    let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
+    let _tr = tokio::spawn(async move {
+        trace!("线程-数据读取-开启");
+        let mut max_delay = 0i64;
+        loop {
+            // 从通道中接收并丢弃所有的消息,直到通道为空
+            while let Ok(Some(data)) = read_rx.try_next() {
+                // 消息被忽略
+                let mut trace_stack = TraceStack::new(0, Instant::now());
+                trace_stack.on_before_unlock_core();
+                trace_stack.on_after_network(data.time);
+
+                let delay = trace_stack.before_unlock_core - trace_stack.after_network;
+                max_delay = max(max_delay, delay);
+                info!("{}us, max={}us", delay, max_delay);
+
+                // 从通道中接收并丢弃所有的消息,直到通道为空
+                while let Ok(Some(_)) = read_rx.try_next() {
+                    // 消息被忽略
+                }
+            }
+        }
+        // trace!("线程-数据读取-结束");
+    });
+
+    //写数据
+    // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
+    // let write_tx_clone = Arc::clone(&write_tx_am);
+    // let su = ws.get_subscription();
+    // let tw = tokio::spawn(async move {
+    //     trace!("线程-数据写入-开始");
     //     loop {
-    //         // 从通道中接收并丢弃所有的消息,直到通道为空
-    //         while let Ok(Some(data)) = read_rx.try_next() {
-    //             // 消息被忽略
-    //             let mut trace_stack = TraceStack::new(0, Instant::now());
-    //             trace_stack.on_before_unlock_core();
-    //             trace_stack.on_after_network(data.time);
+    //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
+    //         // let close_frame = CloseFrame {
+    //         //     code: CloseCode::Normal,
+    //         //     reason: Cow::Borrowed("Bye bye"),
+    //         // };
+    //         // let message = Message::Close(Some(close_frame));
     //
-    //             let delay = trace_stack.before_unlock_core - trace_stack.after_network;
-    //             max_delay = max(max_delay, delay);
-    //             info!("{}us, max={}us", delay, max_delay);
     //
-    //             // 从通道中接收并丢弃所有的消息,直到通道为空
-    //             while let Ok(Some(_)) = read_rx.try_next() {
-    //                 // 消息被忽略
-    //             }
-    //         }
+    //         let message = Message::Text(su.clone());
+    //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
+    //         trace!("发送指令成功");
     //     }
-    //     // trace!("线程-数据读取-结束");
+    //     trace!("线程-数据写入-结束");
     // });
-    //
-    // //写数据
-    // // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
-    // // let write_tx_clone = Arc::clone(&write_tx_am);
-    // // let su = ws.get_subscription();
-    // // let tw = tokio::spawn(async move {
-    // //     trace!("线程-数据写入-开始");
-    // //     loop {
-    // //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
-    // //         // let close_frame = CloseFrame {
-    // //         //     code: CloseCode::Normal,
-    // //         //     reason: Cow::Borrowed("Bye bye"),
-    // //         // };
-    // //         // let message = Message::Close(Some(close_frame));
-    // //
-    // //
-    // //         let message = Message::Text(su.clone());
-    // //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
-    // //         trace!("发送指令成功");
-    // //     }
-    // //     trace!("线程-数据写入-结束");
-    // // });
-    //
-    // let t1 = tokio::spawn(async move {
-    //     //链接
-    //     let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-    //     ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-    //     trace!("test 唯一线程结束--");
-    // });
-    // tokio::try_join!(t1).unwrap();
-    // trace!("当此结束");
-    // trace!("重启!");
-    // trace!("参考交易所关闭");
-    // return;
-    //
+
+    let t1 = tokio::spawn(async move {
+        //链接
+        let bool_v3_clone = Arc::clone(&is_shutdown_arc);
+        ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
+        trace!("test 唯一线程结束--");
+    });
+    tokio::try_join!(t1).unwrap();
+    trace!("当此结束");
+    trace!("重启!");
+    trace!("参考交易所关闭");
+    return;
+
 }
 
 //rest-获取服务器时间
@@ -121,7 +121,7 @@ async fn rest_get_exchange_info_test() {
     let rep_data = rest.get_exchange_info().await;
     trace!(?rep_data)
 }
-
+//---------------------------------------------------------------------
 //rest-账户信息
 #[tokio::test]
 async fn rest_get_account_test() {
@@ -132,7 +132,114 @@ async fn rest_get_account_test() {
     trace!(?rep_data)
 }
 
+//rest-更改持仓模式
+#[tokio::test]
+async fn rest_change_pos_side_test() {
+    global::log_utils::init_log_with_trace();
+
+    let mut rest = get_rest();
+    let rep_data = rest.change_pos_side(true).await;
+    trace!(?rep_data)
+}
+//rest-调整开仓杠杆
+#[tokio::test]
+async fn rest_setting_dual_leverage_test() {
+    global::log_utils::init_log_with_trace();
+
+    let mut rest = get_rest();
+    let rep_data = rest.setting_dual_leverage("CFXUSDT".to_string(),1).await;
+    trace!(?rep_data)
+}
+//rest-查询订单
+#[tokio::test]
+async fn rest_get_order_test() {
+    global::log_utils::init_log_with_trace();
+
+    // symbol	STRING	YES	交易对
+    // orderId	LONG	NO	系统订单号
+    // origClientOrderId	STRING	NO	用户自定义的订单号
+    // recvWindow	LONG	NO
+    // timestamp	LONG	YES
+
+    let mut rest = get_rest();
+    let rep_data = rest.get_order(json!({
+        "symbol":"CFXUSDT",
+         "orderId":"111",
+    })).await;
+    trace!(?rep_data)
+}
+//rest-查询当前挂单
+#[tokio::test]
+async fn rest_get_open_order_test() {
+    global::log_utils::init_log_with_trace();
+
+    // symbol	STRING	YES	交易对
+    // orderId	LONG	NO	系统订单号
+    // origClientOrderId	STRING	NO	用户自定义的订单号
+    // recvWindow	LONG	NO
+    // timestamp	LONG	YES
+
+    let mut rest = get_rest();
+    let rep_data = rest.get_open_order(json!({
+        "symbol":"CFXUSDT",
+         "orderId":"111",
+    })).await;
+    trace!(?rep_data)
+}
+
+//rest-查看当前全部挂单
+#[tokio::test]
+async fn rest_get_open_orders_test() {
+    global::log_utils::init_log_with_trace();
 
+    // symbol	STRING	YES	交易对
+    // orderId	LONG	NO	系统订单号
+    // origClientOrderId	STRING	NO	用户自定义的订单号
+    // recvWindow	LONG	NO
+    // timestamp	LONG	YES
+
+    let mut rest = get_rest();
+    let rep_data = rest.get_open_orders(json!({
+        "symbol":"CFXUSDT",
+         "orderId":"111",
+    })).await;
+    trace!(?rep_data)
+}
+//rest-查询所有订单(包括历史订单)
+#[tokio::test]
+async fn rest_get_all_orders_test() {
+    global::log_utils::init_log_with_trace();
+
+    // symbol	STRING	YES	交易对
+    // orderId	LONG	NO	只返回此orderID及之后的订单,缺省返回最近的订单
+    // startTime	LONG	NO	起始时间
+    // endTime	LONG	NO	结束时间
+    // limit	INT	NO	返回的结果集数量 默认值:500 最大值:1000
+    // recvWindow	LONG	NO
+    // timestamp	LONG	YES
+
+    let mut rest = get_rest();
+    let rep_data = rest.get_all_orders(json!({
+          "symbol":"CFXUSDT",
+            "limit":100
+    })).await;
+    trace!(?rep_data)
+}
+//rest-下单
+#[tokio::test]
+async fn rest_swap_order_test() {
+    global::log_utils::init_log_with_trace();
+
+    let mut rest = get_rest();
+    let rep_data = rest.swap_order(json!({
+          "symbol":"CFXUSDT",
+          "side":"BUY",
+          "type":"LIMIT",
+          "quantity":1,
+          "price":0.11
+    })).await;
+    trace!(?rep_data)
+}
 //rest-根据币对 撤销全部订单
 #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
 async fn rest_cancel_order_all_test() {
@@ -140,13 +247,8 @@ async fn rest_cancel_order_all_test() {
 
     let mut rest = get_rest();
 
-    let rep_data1 = rest.get_server_time().await;
-    trace!(?rep_data1);
-
-    trace!("开始时间:{:?}",chrono::Utc::now().timestamp_millis().to_string());
-    let rep_data = rest.cancel_order_all("BTCUSDT".to_string()).await;
+    let rep_data = rest.cancel_order_all(json!({ "symbol":"CFXUSDT"})).await;
     trace!(?rep_data);
-    trace!("结束时间:{:?}",chrono::Utc::now().timestamp_millis().to_string());
 }
 
 //rest-账户成交历史