|
|
@@ -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×tamp=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
|
|
|
}
|