Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
06df696
creating send_quote_request for convert
ulibte Apr 8, 2023
fb15864
Merge pull request #1 from ulibte/binance-rs
ulibte Apr 8, 2023
c48e365
converter_order_to_btree_map
ulibte Apr 9, 2023
90267df
Merge pull request #2 from ulibte/binance-rs
ulibte Apr 9, 2023
fecedd8
I finished building the convert api, needs testing
ulibte Apr 10, 2023
9a0cc99
Merge pull request #3 from ulibte/binance-rs
ulibte Apr 10, 2023
98f92d7
did the convert test
ulibte Apr 11, 2023
9b597a3
qty from convert() now accepts QtyType
ulibte Apr 11, 2023
25cf54f
i change the QtyType
ulibte Apr 11, 2023
0040f29
Merge pull request #4 from ulibte/binance-rs
ulibte Apr 11, 2023
a4c9c75
convert doc
ulibte Apr 12, 2023
5b053c5
Merge pull request #5 from ulibte/binance-rs
ulibte Apr 12, 2023
90df8c8
Update account_tests.rs
ulibte Apr 12, 2023
b23a456
accept_quote not enough funds
ulibte Apr 27, 2023
42eebc9
daily_account_snapshot
May 2, 2023
25d7ec0
Update rust.yml
ulibte May 23, 2023
45af3c4
examples
May 23, 2023
08c9914
Merge branch 'master' of https://github.com/ulibte/binance-rs
May 23, 2023
5dde804
Update rust.yml
ulibte May 23, 2023
0bf3128
reqwest update
May 23, 2023
ff2c5a7
Merge branch 'master' of https://github.com/ulibte/binance-rs
May 23, 2023
6e236d4
tungstenite update
May 23, 2023
1bae91f
last
May 26, 2023
376b1a8
Merge branch 'wisespace-io:master' into master
ulibte Jun 28, 2023
0891f3a
fix doc test error
ulibte Jun 28, 2023
ee7f8fa
Merge pull request #6 from ulibte/fix-docs-test
ulibte Jun 28, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ jobs:
override: true
components: clippy
- run: cargo clippy --all-targets
# - name: Clean Cargo cache and reinstall dependencies
# run: |
# cargo clean
# cargo update -p openssl-src


test:
name: test
Expand Down Expand Up @@ -69,4 +74,4 @@ jobs:
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
args: --all -- --check
2 changes: 1 addition & 1 deletion .rustfmt.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
binop_separator = "Back"
fn_args_layout = "Compressed"
newline_style = "Unix"
reorder_imports = false
reorder_imports = false
12 changes: 7 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,21 @@ serde = { version = "1.0.126", features = ["derive"] }
serde_json = "1.0"
error-chain = { version = "0.12.4", default-features = false }
reqwest = { version = "0.11.4", features = ["blocking", "json"] }
tungstenite = { version = "0.18.0", features = ["native-tls"] }
tungstenite = { version = "0.19.0", features = ["native-tls"] }
url = "2.2.2"

[features]
vendored-tls = ["reqwest/native-tls-vendored", "tungstenite/native-tls-vendored"]
vendored-tls = [
"reqwest/native-tls-vendored",
"tungstenite/native-tls-vendored",
]

[dev-dependencies]
csv ="1.1.6"
mockito = "0.31.0"
csv = "1.1.6"
mockito = "0.32.5"
env_logger = "0.9.0"
criterion = "0.3"
float-cmp = "0.9.0"
serde_json = "1.0"

[[bench]]
name = "websocket_benchmark"
Expand Down
30 changes: 18 additions & 12 deletions benches/websocket_benchmark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,33 @@ use core::time::Duration;
fn criterion_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("websockets-decoder");

let all_symbols_json = reqwest::blocking::get("https://api.binance.com/api/v3/ticker/price")
.unwrap()
.text()
.unwrap();

let btc_symbol_json =
reqwest::blocking::get("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT")
.unwrap()
.text()
.unwrap();
let all_symbols_json = reqwest::blocking::get(
"https://api.binance.com/api/v3/ticker/price",
)
.unwrap()
.text()
.unwrap();

let btc_symbol_json = reqwest::blocking::get(
"https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT",
)
.unwrap()
.text()
.unwrap();

let mut web_socket_subscribed: WebSockets<'_> =
WebSockets::new(|_event: WebsocketEvent| Ok(()));
web_socket_subscribed.connect("!ticker@arr").unwrap();

let mut web_socket: WebSockets<'_> = WebSockets::new(|_event: WebsocketEvent| Ok(()));
let mut web_socket: WebSockets<'_> =
WebSockets::new(|_event: WebsocketEvent| Ok(()));

group.sample_size(200);
group.measurement_time(Duration::new(35, 0));
group.bench_function("handle_msg all symbols", |b| {
b.iter(|| web_socket_subscribed.test_handle_msg(&all_symbols_json));
b.iter(|| {
web_socket_subscribed.test_handle_msg(&all_symbols_json)
});
});
group.bench_function("handle_msg BTCUSDT symbol", |b| {
b.iter(|| web_socket.test_handle_msg(&btc_symbol_json));
Expand Down
13 changes: 8 additions & 5 deletions examples/binance_endpoints.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use binance::account::*;
use binance::api::*;
use binance::savings::*;
use binance::config::*;
use binance::errors::ErrorKind as BinanceLibErrorKind;
use binance::general::*;
use binance::account::*;
use binance::market::*;
use binance::model::KlineSummary;
use binance::errors::ErrorKind as BinanceLibErrorKind;
use binance::savings::*;

fn main() {
// The general spot API endpoints; shown with
Expand All @@ -24,7 +24,8 @@ fn main() {

fn general(use_testnet: bool) {
let general: General = if use_testnet {
let config = Config::default().set_rest_api_endpoint("https://testnet.binance.vision");
let config = Config::default()
.set_rest_api_endpoint("https://testnet.binance.vision");
Binance::new_with_config(None, None, &config)
} else {
Binance::new(None, None)
Expand Down Expand Up @@ -231,7 +232,9 @@ fn market_data() {
match market.get_klines("BNBETH", "5m", 10, None, None) {
Ok(klines) => {
match klines {
binance::model::KlineSummaries::AllKlineSummaries(klines) => {
binance::model::KlineSummaries::AllKlineSummaries(
klines,
) => {
let kline: KlineSummary = klines[0].clone(); // You need to iterate over the klines
println!(
"Open: {}, High: {}, Low: {}",
Expand Down
26 changes: 19 additions & 7 deletions examples/binance_futures_endpoints.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use binance::api::*;
use binance::errors::ErrorKind as BinanceLibErrorKind;
use binance::futures::general::*;
use binance::futures::market::*;
use binance::futures::model::*;
use binance::errors::ErrorKind as BinanceLibErrorKind;

fn main() {
general();
Expand Down Expand Up @@ -47,22 +47,30 @@ fn market_data() {
let market: FuturesMarket = Binance::new(None, None);

match market.get_depth("btcusdt") {
Ok(answer) => println!("Depth update ID: {:?}", answer.last_update_id),
Ok(answer) => {
println!("Depth update ID: {:?}", answer.last_update_id)
}
Err(e) => println!("Error: {}", e),
}

match market.get_trades("btcusdt") {
Ok(Trades::AllTrades(answer)) => println!("First trade: {:?}", answer[0]),
Ok(Trades::AllTrades(answer)) => {
println!("First trade: {:?}", answer[0])
}
Err(e) => println!("Error: {}", e),
}

match market.get_agg_trades("btcusdt", None, None, None, None) {
Ok(AggTrades::AllAggTrades(answer)) => println!("First aggregated trade: {:?}", answer[0]),
Ok(AggTrades::AllAggTrades(answer)) => {
println!("First aggregated trade: {:?}", answer[0])
}
Err(e) => println!("Error: {}", e),
}

match market.get_klines("btcusdt", "5m", 10, None, None) {
Ok(KlineSummaries::AllKlineSummaries(answer)) => println!("First kline: {:?}", answer[0]),
Ok(KlineSummaries::AllKlineSummaries(answer)) => {
println!("First kline: {:?}", answer[0])
}
Err(e) => println!("Error: {}", e),
}

Expand All @@ -77,7 +85,9 @@ fn market_data() {
}

match market.get_all_book_tickers() {
Ok(BookTickers::AllBookTickers(answer)) => println!("First book ticker: {:?}", answer[0]),
Ok(BookTickers::AllBookTickers(answer)) => {
println!("First book ticker: {:?}", answer[0])
}
Err(e) => println!("Error: {}", e),
}

Expand All @@ -87,7 +97,9 @@ fn market_data() {
}

match market.get_mark_prices() {
Ok(MarkPrices::AllMarkPrices(answer)) => println!("First mark Prices: {:?}", answer[0]),
Ok(MarkPrices::AllMarkPrices(answer)) => {
println!("First mark Prices: {:?}", answer[0])
}
Err(e) => println!("Error: {}", e),
}

Expand Down
11 changes: 8 additions & 3 deletions examples/binance_futures_userstream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@ fn main() {

fn user_stream() {
let api_key_user = Some("YOUR_API_KEY".into());
let user_stream: FuturesUserStream = Binance::new(api_key_user, None);
let user_stream: FuturesUserStream =
Binance::new(api_key_user, None);

if let Ok(answer) = user_stream.start() {
println!("Data Stream Started ...");
let listen_key = answer.listen_key;

match user_stream.keep_alive(&listen_key) {
Ok(msg) => println!("Keepalive user data stream: {:?}", msg),
Ok(msg) => {
println!("Keepalive user data stream: {:?}", msg)
}
Err(e) => println!("Error: {}", e),
}

Expand All @@ -23,6 +26,8 @@ fn user_stream() {
Err(e) => println!("Error: {}", e),
}
} else {
println!("Not able to start an User Stream (Check your API_KEY)");
println!(
"Not able to start an User Stream (Check your API_KEY)"
);
}
}
30 changes: 16 additions & 14 deletions examples/binance_futures_websockets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ fn market_websocket() {
let keep_running = AtomicBool::new(true);
let stream_examples_usd_m = vec![
// taken from https://binance-docs.github.io/apidocs/futures/en/#websocket-market-streams
"btcusdt@aggTrade", // <symbol>@aggTrade
"btcusdt@markPrice", // <symbol>@markPrice OR <symbol>@markPrice@1s
"btcusdt@kline_1m", // <symbol>@kline_<interval>
"btcusdt@aggTrade", // <symbol>@aggTrade
"btcusdt@markPrice", // <symbol>@markPrice OR <symbol>@markPrice@1s
"btcusdt@kline_1m", // <symbol>@kline_<interval>
"btcusdt_perpetual@continuousKline_1m", // <pair>_<contractType>@continuousKline_<interval> e.g. "btcusd_next_quarter@continuousKline_1m"
"btcusdt@miniTicker", // <symbol>@miniTicker
"!miniTicker@arr",
Expand All @@ -27,7 +27,7 @@ fn market_websocket() {
"btcusdt@forceOrder", // <symbol>@forceOrder
"!forceOrder@arr",
"btcusdt@depth20@100ms", // <symbol>@depth<levels> OR <symbol>@depth<levels>@500ms OR <symbol>@depth<levels>@100ms.
"btcusdt@depth@100ms", // <symbol>@depth OR <symbol>@depth@500ms OR <symbol>@depth@100ms
"btcusdt@depth@100ms", // <symbol>@depth OR <symbol>@depth@500ms OR <symbol>@depth@100ms
];

let stream_examples_coin_m = vec![
Expand All @@ -36,15 +36,15 @@ fn market_websocket() {
// A possible symbol is btcusd_210924. This needs updates if the current date
// is greater than 2021-09-24. It'd be nice to make this symbol automatically
// generated, or find a <symbol> that always works.
"btcusd_210924@aggTrade", // <symbol>@aggTrade
"btcusd@indexPrice@1s", //<pair>@indexPrice OR <pair>@indexPrice@1s
"btcusd_210924@markPrice", // <symbol>@markPrice OR <symbol>@markPrice@1s
"btcusd@markPrice", // <pair>@markPrice OR <pair>@markPrice@1s
"btcusd_210924@kline_1m", // <symbol>@kline_<interval>
"btcusd_210924@aggTrade", // <symbol>@aggTrade
"btcusd@indexPrice@1s", //<pair>@indexPrice OR <pair>@indexPrice@1s
"btcusd_210924@markPrice", // <symbol>@markPrice OR <symbol>@markPrice@1s
"btcusd@markPrice", // <pair>@markPrice OR <pair>@markPrice@1s
"btcusd_210924@kline_1m", // <symbol>@kline_<interval>
"btcusd_next_quarter@continuousKline_1m", // <pair>_<contractType>@continuousKline_<interval>
"btcusd@indexPriceKline_1m", // <pair>@indexPriceKline_<interval>
"btcusd_210924@markPriceKline_1m", // <symbol>@markPriceKline_<interval>
"btcusd_210924@miniTicker", // <symbol>@miniTicker
"btcusd@indexPriceKline_1m", // <pair>@indexPriceKline_<interval>
"btcusd_210924@markPriceKline_1m", // <symbol>@markPriceKline_<interval>
"btcusd_210924@miniTicker", // <symbol>@miniTicker
"!miniTicker@arr",
"btcusd_210924@ticker", // <symbol>@ticker
"!ticker@arr",
Expand Down Expand Up @@ -75,7 +75,8 @@ fn market_websocket() {
println!("Starting with USD_M {:?}", stream_example);
keep_running.swap(true, Ordering::Relaxed);

let mut web_socket: FuturesWebSockets<'_> = FuturesWebSockets::new(callback_fn);
let mut web_socket: FuturesWebSockets<'_> =
FuturesWebSockets::new(callback_fn);
web_socket
.connect(&FuturesMarket::USDM, stream_example)
.unwrap();
Expand All @@ -88,7 +89,8 @@ fn market_websocket() {
println!("Starting with COIN_M {:?}", stream_example);
keep_running.swap(true, Ordering::Relaxed);

let mut web_socket: FuturesWebSockets<'_> = FuturesWebSockets::new(callback_fn);
let mut web_socket: FuturesWebSockets<'_> =
FuturesWebSockets::new(callback_fn);
web_socket
.connect(&FuturesMarket::COINM, stream_example)
.unwrap();
Expand Down
32 changes: 19 additions & 13 deletions examples/binance_save_all_trades.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use csv::Writer;
use std::error::Error;
use std::fs::File;
use csv::Writer;
use std::sync::atomic::{AtomicBool};
use std::sync::atomic::AtomicBool;

use binance::model::DayTickerEvent;
use binance::websockets::*;
use binance::model::{DayTickerEvent};

fn main() {
save_all_trades_websocket();
Expand All @@ -21,7 +21,10 @@ fn save_all_trades_websocket() {
}

// serialize DayTickerEvent as CSV records
pub fn write_to_file(&mut self, events: Vec<DayTickerEvent>) -> Result<(), Box<dyn Error>> {
pub fn write_to_file(
&mut self,
events: Vec<DayTickerEvent>,
) -> Result<(), Box<dyn Error>> {
for event in events {
self.wrt.serialize(event)?;
}
Expand All @@ -35,17 +38,20 @@ fn save_all_trades_websocket() {

let mut web_socket_handler = WebSocketHandler::new(local_wrt);
let agg_trade = String::from("!ticker@arr");
let mut web_socket = WebSockets::new(move |event: WebsocketEvent| {
if let WebsocketEvent::DayTickerAll(events) = event {
// You can break the event_loop if some condition is met be setting keep_running to false
// keep_running.store(false, Ordering::Relaxed);
if let Err(error) = web_socket_handler.write_to_file(events) {
println!("{}", error);
let mut web_socket =
WebSockets::new(move |event: WebsocketEvent| {
if let WebsocketEvent::DayTickerAll(events) = event {
// You can break the event_loop if some condition is met be setting keep_running to false
// keep_running.store(false, Ordering::Relaxed);
if let Err(error) =
web_socket_handler.write_to_file(events)
{
println!("{}", error);
}
}
}

Ok(())
});
Ok(())
});

web_socket.connect(&agg_trade).unwrap(); // check error
if let Err(e) = web_socket.event_loop(&keep_running) {
Expand Down
Loading