Skip to content

Commit 7e74aca

Browse files
author
liumiao
committed
Add get_leverage_brackets api for future
1 parent 6a1eb43 commit 7e74aca

7 files changed

Lines changed: 90 additions & 4 deletions

File tree

src/api.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ pub enum Futures {
9393
OpenOrders,
9494
UserDataStream,
9595
Income,
96+
LeverageBracket,
9697
}
9798

9899
impl From<API> for String {
@@ -169,6 +170,7 @@ impl From<API> for String {
169170
Futures::OpenOrders => "/fapi/v1/openOrders",
170171
Futures::UserDataStream => "/fapi/v1/listenKey",
171172
Futures::Income => "/fapi/v1/income",
173+
Futures::LeverageBracket => "/fapi/v1/leverageBracket",
172174
},
173175
})
174176
}

src/futures/account.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,4 +689,19 @@ impl FuturesAccount {
689689
self.client
690690
.get_signed(API::Futures(Futures::Income), Some(request))
691691
}
692+
693+
pub fn leverage_brackets<S>(
694+
&self, symbol: S,
695+
) -> Result<Vec<crate::futures::model::LeverageBrackets>>
696+
where
697+
S: Into<Option<String>>,
698+
{
699+
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
700+
if let Some(symbol) = symbol.into() {
701+
parameters.insert("symbol".into(), symbol.into());
702+
}
703+
let request = build_signed_request(parameters, self.recv_window)?;
704+
self.client
705+
.get_signed(API::Futures(Futures::LeverageBracket), Some(request))
706+
}
692707
}

src/futures/model.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,3 +625,26 @@ pub struct Income {
625625
pub tran_id: u64,
626626
pub trade_id: String,
627627
}
628+
629+
#[derive(Debug, Serialize, Deserialize, Clone)]
630+
#[serde(rename_all = "camelCase")]
631+
pub struct LeverageBrackets {
632+
pub symbol: String,
633+
pub notional_coef: Option<f64>,
634+
pub brackets: Vec<Bracket>,
635+
}
636+
637+
#[derive(Debug, Serialize, Deserialize, Clone)]
638+
#[serde(rename_all = "camelCase")]
639+
pub struct Bracket {
640+
pub bracket: i32,
641+
pub initial_leverage: u8,
642+
#[serde(with = "string_or_float")]
643+
pub notional_cap: f64,
644+
#[serde(with = "string_or_float")]
645+
pub notional_floor: f64,
646+
#[serde(with = "string_or_float")]
647+
pub maint_margin_ratio: f64,
648+
#[serde(with = "string_or_float")]
649+
pub cum: f64,
650+
}

src/futures/websockets.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,15 +195,15 @@ impl<'a> FuturesWebSockets<'a> {
195195
pub fn event_loop(&mut self, running: &AtomicBool) -> Result<()> {
196196
while running.load(Ordering::Relaxed) {
197197
if let Some(ref mut socket) = self.socket {
198-
let message = socket.0.read_message()?;
198+
let message = socket.0.read()?;
199199
match message {
200200
Message::Text(msg) => {
201201
if let Err(e) = self.handle_msg(&msg) {
202202
bail!(format!("Error on handling stream message: {}", e));
203203
}
204204
}
205205
Message::Ping(payload) => {
206-
socket.0.write_message(Message::Pong(payload)).unwrap();
206+
socket.0.write(Message::Pong(payload)).unwrap();
207207
}
208208
Message::Pong(_) | Message::Binary(_) | Message::Frame(_) => (),
209209
Message::Close(e) => bail!(format!("Disconnected {:?}", e)),

src/websockets.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,15 @@ impl<'a> WebSockets<'a> {
153153
pub fn event_loop(&mut self, running: &AtomicBool) -> Result<()> {
154154
while running.load(Ordering::Relaxed) {
155155
if let Some(ref mut socket) = self.socket {
156-
let message = socket.0.read_message()?;
156+
let message = socket.0.read()?;
157157
match message {
158158
Message::Text(msg) => {
159159
if let Err(e) = self.handle_msg(&msg) {
160160
bail!(format!("Error on handling stream message: {}", e));
161161
}
162162
}
163163
Message::Ping(payload) => {
164-
socket.0.write_message(Message::Pong(payload)).unwrap();
164+
socket.0.write(Message::Pong(payload)).unwrap();
165165
}
166166
Message::Pong(_) | Message::Binary(_) | Message::Frame(_) => (),
167167
Message::Close(e) => bail!(format!("Disconnected {:?}", e)),

tests/futures_account_tests.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,4 +254,26 @@ mod tests {
254254

255255
mock.assert();
256256
}
257+
258+
#[test]
259+
fn get_leverage_brackets() {
260+
let mut server = Server::new();
261+
let mock = server
262+
.mock("GET", "/fapi/v1/leverageBracket")
263+
.with_header("content-type", "application/json;charset=UTF-8")
264+
.match_query(Matcher::Regex(
265+
"recvWindow=1234&timestamp=\\d+&signature=.*".into(),
266+
))
267+
.with_body_from_file("tests/mocks/futures/account/leverage_brackets.json")
268+
.create();
269+
270+
let config = Config::default()
271+
.set_futures_rest_api_endpoint(server.url())
272+
.set_recv_window(1234);
273+
let account: FuturesAccount = Binance::new_with_config(None, None, &config);
274+
let _ = env_logger::try_init();
275+
account.leverage_brackets(None).unwrap();
276+
277+
mock.assert();
278+
}
257279
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[
2+
{
3+
"symbol": "ETHUSDT",
4+
"notionalCoef": 1.50,
5+
"brackets": [
6+
{
7+
"bracket": 1,
8+
"initialLeverage": 75,
9+
"notionalCap": 10000,
10+
"notionalFloor": 0,
11+
"maintMarginRatio": 0.0065,
12+
"cum": 0
13+
},
14+
{
15+
"bracket": 2,
16+
"initialLeverage": 50,
17+
"notionalCap": 20000,
18+
"notionalFloor": 10000,
19+
"maintMarginRatio": 0.005,
20+
"cum": 10
21+
}
22+
]
23+
}
24+
]

0 commit comments

Comments
 (0)