Skip to content

Commit 07953c5

Browse files
author
liumiao
committed
Finish custom batch orders api for future
1 parent e47a480 commit 07953c5

File tree

6 files changed

+47
-13
lines changed

6 files changed

+47
-13
lines changed

.rustfmt.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
binop_separator = "Back"
2-
fn_args_layout = "Compressed"
2+
fn_params_layout = "Compressed"
33
newline_style = "Unix"
44
reorder_imports = false

src/api.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ pub enum Futures {
7575
AllOrders,
7676
UserTrades,
7777
Order,
78+
BatchOrders,
7879
PositionRisk,
7980
Balance,
8081
PositionSide,
@@ -153,6 +154,7 @@ impl From<API> for String {
153154
Futures::UserTrades => "/fapi/v1/userTrades",
154155
Futures::PositionSide => "/fapi/v1/positionSide/dual",
155156
Futures::Order => "/fapi/v1/order",
157+
Futures::BatchOrders => "/fapi/v1/batchOrders",
156158
Futures::PositionRisk => "/fapi/v2/positionRisk",
157159
Futures::Balance => "/fapi/v2/balance",
158160
Futures::OpenInterest => "/fapi/v1/openInterest",

src/errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use serde::Deserialize;
22
use error_chain::error_chain;
33

4-
#[derive(Debug, Deserialize)]
4+
#[derive(Debug, Deserialize, Clone)]
55
pub struct BinanceContentError {
66
pub code: i16,
77
pub msg: String,

src/futures/account.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::BTreeMap;
22
use std::fmt::Display;
3-
use crate::util::build_signed_request;
3+
use crate::util::{build_list_of_json, build_signed_request};
44
use crate::errors::Result;
55
use crate::client::Client;
66
use crate::api::{API, Futures};
@@ -9,8 +9,8 @@ use crate::account::OrderSide;
99
use crate::futures::model::{Order, TradeHistory};
1010

1111
use super::model::{
12-
ChangeLeverageResponse, Transaction, CanceledOrder, PositionRisk, AccountBalance,
13-
AccountInformation,
12+
AccountBalance, AccountInformation, CanceledOrder, ChangeLeverageResponse, PositionRisk,
13+
Transaction, TransactionOrError,
1414
};
1515

1616
#[derive(Clone)]
@@ -422,9 +422,13 @@ impl FuturesAccount {
422422

423423
// Custom order for for professional traders
424424
pub fn custom_batch_orders(
425-
&self, _order_count: u64, order_requests: Vec<CustomOrderRequest>,
426-
) -> Result<Transaction> {
427-
let request = String::new();
425+
&self, order_requests: Vec<CustomOrderRequest>,
426+
) -> Result<Vec<TransactionOrError>> {
427+
if order_requests.is_empty() {
428+
return Ok(Vec::new());
429+
}
430+
let mut parameters = BTreeMap::new();
431+
let mut orders = Vec::new();
428432
for order_request in order_requests {
429433
let order = OrderRequest {
430434
symbol: order_request.symbol,
@@ -442,12 +446,13 @@ impl FuturesAccount {
442446
working_type: order_request.working_type,
443447
price_protect: order_request.price_protect,
444448
};
445-
let _order = self.build_order(order);
446-
// TODO : make a request string for batch orders api
447-
// let request = build_signed_request(order, self.recv_window)?;
449+
let order = self.build_order(order);
450+
orders.push(order);
448451
}
452+
parameters.insert("batchOrders".into(), build_list_of_json(orders));
453+
let request = build_signed_request(parameters, self.recv_window)?;
449454
self.client
450-
.post_signed(API::Futures(Futures::Order), request)
455+
.post_signed(API::Futures(Futures::BatchOrders), request)
451456
}
452457

453458
pub fn get_all_orders<S, F, N>(

src/futures/model.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use serde::{Deserialize, Serialize};
2-
use crate::model::{string_or_float, string_or_float_opt, string_or_bool};
2+
use crate::{
3+
errors::BinanceContentError,
4+
model::{string_or_bool, string_or_float, string_or_float_opt},
5+
};
36

47
pub use crate::model::{
58
Asks, Bids, BookTickers, Filters, KlineSummaries, KlineSummary, RateLimit, ServerTime,
@@ -282,6 +285,13 @@ pub struct Transaction {
282285
price_protect: bool,
283286
}
284287

288+
#[derive(Debug, Deserialize, Clone)]
289+
#[serde(untagged)]
290+
pub enum TransactionOrError {
291+
Transaction(Transaction),
292+
Error(BinanceContentError),
293+
}
294+
285295
#[derive(Debug, Serialize, Deserialize, Clone)]
286296
#[serde(rename_all = "camelCase")]
287297
pub struct CanceledOrder {

src/util.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,23 @@ pub fn build_request(parameters: BTreeMap<String, String>) -> String {
1414
request
1515
}
1616

17+
pub fn build_list_of_json(parameters: Vec<BTreeMap<String, String>>) -> String {
18+
let mut request = String::new();
19+
for param in parameters {
20+
let mut request_inner = String::new();
21+
for (key, value) in param {
22+
let param = format!("\"{}\":\"{}\",", key, value);
23+
request_inner.push_str(param.as_ref());
24+
}
25+
request_inner.pop();
26+
let param = format!("{{{}}},", request_inner);
27+
request.push_str(param.as_ref());
28+
}
29+
request.pop();
30+
request = format!("[{}]", request);
31+
url::form_urlencoded::byte_serialize(request.as_bytes()).collect::<String>()
32+
}
33+
1734
pub fn build_signed_request(
1835
parameters: BTreeMap<String, String>, recv_window: u64,
1936
) -> Result<String> {

0 commit comments

Comments
 (0)