|
|
@@ -1,8 +1,11 @@
|
|
|
use std::str::FromStr;
|
|
|
+use std::sync::Arc;
|
|
|
use chrono::Utc;
|
|
|
-use rust_decimal::Decimal;
|
|
|
+use lazy_static::lazy_static;
|
|
|
+use rust_decimal::{Decimal};
|
|
|
use rust_decimal::prelude::FromPrimitive;
|
|
|
use serde_json::{from_value, Value};
|
|
|
+use tokio::sync::Mutex;
|
|
|
use tokio::time::Instant;
|
|
|
use tracing::{error};
|
|
|
use exchanges::response_base::ResponseData;
|
|
|
@@ -194,27 +197,45 @@ pub fn handle_book_ticker(res_data: &ResponseData, mul: &Decimal) -> Depth {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-pub fn handle_ticker(res_data: &ResponseData) -> Ticker {
|
|
|
- let time = Decimal::from_i64(Utc::now().timestamp_millis()).unwrap();
|
|
|
- let high = Decimal::from_str(res_data.data["highPrice24h"].as_str().unwrap()).unwrap();
|
|
|
- let low = Decimal::from_str(res_data.data["lowPrice24h"].as_str().unwrap()).unwrap();
|
|
|
- let sell = Decimal::from_str(res_data.data["ask1Price"].as_str().unwrap()).unwrap();
|
|
|
- let buy = Decimal::from_str(res_data.data["bid1Price"].as_str().unwrap()).unwrap();
|
|
|
- let last = Decimal::from_str(res_data.data["lastPrice"].as_str().unwrap()).unwrap();
|
|
|
- let volume = Decimal::from_str(res_data.data["volume24h"].as_str().unwrap()).unwrap();
|
|
|
- let open_interest = Decimal::from_str(res_data.data["openInterest"].as_str().unwrap()).unwrap();
|
|
|
+lazy_static! {
|
|
|
+ static ref TICKER: Arc<Mutex<Ticker>> = Arc::new(Mutex::new(Ticker::new()));
|
|
|
+}
|
|
|
+
|
|
|
+pub async fn handle_ticker(res_data: &ResponseData) -> Ticker {
|
|
|
+ let mut ticker = TICKER.lock().await;
|
|
|
+
|
|
|
+ ticker.time = Decimal::from_i64(Utc::now().timestamp_millis()).unwrap();
|
|
|
+ ticker.high = match res_data.data["highPrice24h"].as_str() {
|
|
|
+ Some(str) => { Decimal::from_str(str).unwrap() }
|
|
|
+ None => { ticker.high }
|
|
|
+ };
|
|
|
+ ticker.low = match res_data.data["lowPrice24h"].as_str() {
|
|
|
+ Some(str) => { Decimal::from_str(str).unwrap() }
|
|
|
+ None => { ticker.low }
|
|
|
+ };
|
|
|
+ ticker.sell = match res_data.data["ask1Price"].as_str() {
|
|
|
+ Some(str) => { Decimal::from_str(str).unwrap() }
|
|
|
+ None => { ticker.sell }
|
|
|
+ };
|
|
|
+ ticker.buy = match res_data.data["bid1Price"].as_str() {
|
|
|
+ Some(str) => { Decimal::from_str(str).unwrap() }
|
|
|
+ None => { ticker.buy }
|
|
|
+ };
|
|
|
+ ticker.last = match res_data.data["lastPrice"].as_str() {
|
|
|
+ Some(str) => { Decimal::from_str(str).unwrap() }
|
|
|
+ None => { ticker.last }
|
|
|
+ };
|
|
|
+ ticker.volume = match res_data.data["volume24h"].as_str() {
|
|
|
+ Some(str) => { Decimal::from_str(str).unwrap() }
|
|
|
+ None => { ticker.volume }
|
|
|
+ };
|
|
|
+ ticker.open_interest = match res_data.data["openInterest"].as_str() {
|
|
|
+ Some(str) => { Decimal::from_str(str).unwrap() }
|
|
|
+ None => { ticker.open_interest }
|
|
|
+ };
|
|
|
// let s = res_data.data["symbol"].as_str().unwrap().replace("USDT", "_USDT");
|
|
|
|
|
|
- Ticker {
|
|
|
- time,
|
|
|
- high,
|
|
|
- low,
|
|
|
- sell,
|
|
|
- buy,
|
|
|
- last,
|
|
|
- volume,
|
|
|
- open_interest,
|
|
|
- }
|
|
|
+ ticker.clone()
|
|
|
}
|
|
|
|
|
|
pub fn format_depth_items(value: Value, mul: &Decimal) -> Vec<OrderBook> {
|