|
@@ -1,11 +1,17 @@
|
|
|
|
|
+use std::collections::HashMap;
|
|
|
use std::sync::Arc;
|
|
use std::sync::Arc;
|
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
|
+use tokio::sync::{Mutex};
|
|
|
use actix_web::{web, App, HttpResponse, HttpServer, Responder, get};
|
|
use actix_web::{web, App, HttpResponse, HttpServer, Responder, get};
|
|
|
use serde::{Deserialize, Serialize};
|
|
use serde::{Deserialize, Serialize};
|
|
|
use serde_json::{json, Value};
|
|
use serde_json::{json, Value};
|
|
|
use tracing::{info};
|
|
use tracing::{info};
|
|
|
use actix_cors::Cors;
|
|
use actix_cors::Cors;
|
|
|
|
|
+use chrono::Utc;
|
|
|
|
|
+use rust_decimal_macros::dec;
|
|
|
use crate::{binance_usdt_swap_data_listener, bitget_usdt_swap_data_listener, bybit_usdt_swap_data_listener, coinex_usdt_swap_data_listener, gate_coin_spot_data_listener, gate_usdt_swap_data_listener, mexc_usdt_swap_data_listener, phemex_usdt_swap_data_listener, rank};
|
|
use crate::{binance_usdt_swap_data_listener, bitget_usdt_swap_data_listener, bybit_usdt_swap_data_listener, coinex_usdt_swap_data_listener, gate_coin_spot_data_listener, gate_usdt_swap_data_listener, mexc_usdt_swap_data_listener, phemex_usdt_swap_data_listener, rank};
|
|
|
|
|
+use crate::json_db_utils::{collect_special_trades_json, get_symbols_by_exchange};
|
|
|
|
|
+use crate::msv::{generate_msv_by_trades, Indicators, parse_json_to_trades};
|
|
|
|
|
|
|
|
// 定义用于反序列化查询参数的结构体
|
|
// 定义用于反序列化查询参数的结构体
|
|
|
#[derive(Serialize, Deserialize, Clone)]
|
|
#[derive(Serialize, Deserialize, Clone)]
|
|
@@ -33,61 +39,61 @@ pub struct Response {
|
|
|
code: i32,
|
|
code: i32,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// #[get("/rk/get_real_time_rank_list")]
|
|
|
|
|
-// async fn get_real_time_rank_list(query: web::Query<RankQuery>) -> impl Responder {
|
|
|
|
|
-// // ============================= 参数校验部分 =========================================
|
|
|
|
|
-// if !query.validate() {
|
|
|
|
|
-// let response = Response {
|
|
|
|
|
-// query: serde_json::to_value(&query.into_inner()).unwrap(),
|
|
|
|
|
-// msg: Some("查询内容有误,必须传递的参数:[exchange]".to_string()),
|
|
|
|
|
-// code: 500,
|
|
|
|
|
-// data: Value::Null,
|
|
|
|
|
-// };
|
|
|
|
|
-//
|
|
|
|
|
-// let json_string = serde_json::to_string(&response).unwrap();
|
|
|
|
|
-// return HttpResponse::Ok().content_type("application/json").body(json_string);
|
|
|
|
|
-// }
|
|
|
|
|
-// let supportive_exchange = vec!["gate_usdt_swap", "coinex_usdt_swap", "binance_usdt_swap", "phemex_usdt_swap", "mexc_usdt_swap", "bybit_usdt_swap", "bitget_usdt_swap", "gate_coin_spot"];
|
|
|
|
|
-// let exchange = query.exchange.clone().unwrap().clone();
|
|
|
|
|
-// if !supportive_exchange.contains(&exchange.as_str()) {
|
|
|
|
|
-// let response = Response {
|
|
|
|
|
-// query: serde_json::to_value(&query.into_inner()).unwrap(),
|
|
|
|
|
-// msg: Some("查询内容有误,exchange当前仅支持:[gate_usdt_swap, coinex_usdt_swap, binance_usdt_swap, phemex_usdt_swap, mexc_usdt_swap, bybit_usdt_swap, bitget_usdt_swap, gate_coin_spot]".to_string()),
|
|
|
|
|
-// code: 500,
|
|
|
|
|
-// data: Value::Null,
|
|
|
|
|
-// };
|
|
|
|
|
-//
|
|
|
|
|
-// let json_string = serde_json::to_string(&response).unwrap();
|
|
|
|
|
-// return HttpResponse::Ok().content_type("application/json").body(json_string);
|
|
|
|
|
-// }
|
|
|
|
|
-//
|
|
|
|
|
-// // 计算msv
|
|
|
|
|
-// let end_timestamp = Utc::now().timestamp_millis();
|
|
|
|
|
-// let start_timestamp = end_timestamp - 60 * 1000 * 60 * 4;
|
|
|
|
|
-//
|
|
|
|
|
-// let symbols = get_symbols_by_exchange(exchange.as_str());
|
|
|
|
|
-//
|
|
|
|
|
-// let indicator_map: Mutex<HashMap<String, Indicators>> = Mutex::new(HashMap::new());
|
|
|
|
|
-// for symbol in symbols.as_array().unwrap() {
|
|
|
|
|
-// let trades_value = collect_special_trades_json(start_timestamp, end_timestamp, exchange.as_str(), &symbol.as_str().unwrap()).await;
|
|
|
|
|
-// let trades = parse_json_to_trades(trades_value);
|
|
|
|
|
-// let msv = generate_msv_by_trades(trades, dec!(50), vec![], start_timestamp, end_timestamp);
|
|
|
|
|
-// let mut map = indicator_map.lock().await;
|
|
|
|
|
-// map.insert(symbol.as_str().unwrap().to_string(), msv);
|
|
|
|
|
-// }
|
|
|
|
|
-// // 逻辑执行部分
|
|
|
|
|
-// let rst = rank::generate_rank_by_indicator_map(&indicator_map.lock().await);
|
|
|
|
|
-//
|
|
|
|
|
-// let response = Response {
|
|
|
|
|
-// query: serde_json::to_value(&query.into_inner()).unwrap(),
|
|
|
|
|
-// msg: Some("查询成功".to_string()),
|
|
|
|
|
-// code: 200,
|
|
|
|
|
-// data: rst,
|
|
|
|
|
-// };
|
|
|
|
|
-//
|
|
|
|
|
-// let json_string = serde_json::to_string(&response).unwrap();
|
|
|
|
|
-// HttpResponse::Ok().content_type("application/json").body(json_string)
|
|
|
|
|
-// }
|
|
|
|
|
|
|
+#[get("/rk/get_real_time_rank_list")]
|
|
|
|
|
+async fn get_real_time_rank_list(query: web::Query<RankQuery>) -> impl Responder {
|
|
|
|
|
+ // ============================= 参数校验部分 =========================================
|
|
|
|
|
+ if !query.validate() {
|
|
|
|
|
+ let response = Response {
|
|
|
|
|
+ query: serde_json::to_value(&query.into_inner()).unwrap(),
|
|
|
|
|
+ msg: Some("查询内容有误,必须传递的参数:[exchange]".to_string()),
|
|
|
|
|
+ code: 500,
|
|
|
|
|
+ data: Value::Null,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ let json_string = serde_json::to_string(&response).unwrap();
|
|
|
|
|
+ return HttpResponse::Ok().content_type("application/json").body(json_string);
|
|
|
|
|
+ }
|
|
|
|
|
+ let supportive_exchange = vec!["gate_usdt_swap", "coinex_usdt_swap", "binance_usdt_swap", "phemex_usdt_swap", "mexc_usdt_swap", "bybit_usdt_swap", "bitget_usdt_swap", "gate_coin_spot"];
|
|
|
|
|
+ let exchange = query.exchange.clone().unwrap().clone();
|
|
|
|
|
+ if !supportive_exchange.contains(&exchange.as_str()) {
|
|
|
|
|
+ let response = Response {
|
|
|
|
|
+ query: serde_json::to_value(&query.into_inner()).unwrap(),
|
|
|
|
|
+ msg: Some("查询内容有误,exchange当前仅支持:[gate_usdt_swap, coinex_usdt_swap, binance_usdt_swap, phemex_usdt_swap, mexc_usdt_swap, bybit_usdt_swap, bitget_usdt_swap, gate_coin_spot]".to_string()),
|
|
|
|
|
+ code: 500,
|
|
|
|
|
+ data: Value::Null,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ let json_string = serde_json::to_string(&response).unwrap();
|
|
|
|
|
+ return HttpResponse::Ok().content_type("application/json").body(json_string);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算msv
|
|
|
|
|
+ let end_timestamp = Utc::now().timestamp_millis();
|
|
|
|
|
+ let start_timestamp = end_timestamp - 60 * 1000 * 60 * 4;
|
|
|
|
|
+
|
|
|
|
|
+ let symbols = get_symbols_by_exchange(exchange.as_str());
|
|
|
|
|
+
|
|
|
|
|
+ let indicator_map: Mutex<HashMap<String, Indicators>> = Mutex::new(HashMap::new());
|
|
|
|
|
+ for symbol in symbols.as_array().unwrap() {
|
|
|
|
|
+ let trades_value = collect_special_trades_json(start_timestamp, end_timestamp, exchange.as_str(), &symbol.as_str().unwrap()).await;
|
|
|
|
|
+ let trades = parse_json_to_trades(trades_value);
|
|
|
|
|
+ let msv = generate_msv_by_trades(trades, dec!(50), vec![], start_timestamp, end_timestamp);
|
|
|
|
|
+ let mut map = indicator_map.lock().await;
|
|
|
|
|
+ map.insert(symbol.as_str().unwrap().to_string(), msv);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 逻辑执行部分
|
|
|
|
|
+ let rst = rank::generate_rank_by_indicator_map(&indicator_map.lock().await);
|
|
|
|
|
+
|
|
|
|
|
+ let response = Response {
|
|
|
|
|
+ query: serde_json::to_value(&query.into_inner()).unwrap(),
|
|
|
|
|
+ msg: Some("查询成功".to_string()),
|
|
|
|
|
+ code: 200,
|
|
|
|
|
+ data: rst,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ let json_string = serde_json::to_string(&response).unwrap();
|
|
|
|
|
+ HttpResponse::Ok().content_type("application/json").body(json_string)
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
#[get("/rk/get_rank_list")]
|
|
#[get("/rk/get_rank_list")]
|
|
|
async fn get_rank_list(query: web::Query<RankQuery>) -> impl Responder {
|
|
async fn get_rank_list(query: web::Query<RankQuery>) -> impl Responder {
|
|
@@ -208,7 +214,7 @@ pub fn run_server(port: u32, running: Arc<AtomicBool>) {
|
|
|
App::new()
|
|
App::new()
|
|
|
.wrap(cors)
|
|
.wrap(cors)
|
|
|
.service(get_rank_list)
|
|
.service(get_rank_list)
|
|
|
- // .service(get_real_time_rank_list)
|
|
|
|
|
|
|
+ .service(get_real_time_rank_list)
|
|
|
.service(get_exchanges)
|
|
.service(get_exchanges)
|
|
|
})
|
|
})
|
|
|
.bind(addr)
|
|
.bind(addr)
|