|
@@ -1,3 +1,38 @@
|
|
|
|
|
+use std::collections::HashMap;
|
|
|
|
|
+use rust_decimal::Decimal;
|
|
|
|
|
+use serde_json::Value;
|
|
|
|
|
+use anyhow::Result;
|
|
|
|
|
+
|
|
|
|
|
+pub struct DataManager {
|
|
|
|
|
+ pub exchange_info_map: HashMap<String, Value>,
|
|
|
|
|
+ pub klines_map: HashMap<String, Vec<Value>>,
|
|
|
|
|
+ pub asks_map: HashMap<String, HashMap<Decimal, Decimal>>,
|
|
|
|
|
+ pub bids_map: HashMap<String, HashMap<Decimal, Decimal>>,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+impl DataManager {
|
|
|
|
|
+ pub fn new(exchange_info_map: HashMap<String, Value>) -> Self {
|
|
|
|
|
+ let klines_map: HashMap<String, Vec<Value>> = HashMap::new();
|
|
|
|
|
+ let asks_map: HashMap<String, HashMap<Decimal, Decimal>> = HashMap::new();
|
|
|
|
|
+ let bids_map: HashMap<String, HashMap<Decimal, Decimal>> = HashMap::new();
|
|
|
|
|
+
|
|
|
|
|
+ DataManager {
|
|
|
|
|
+ exchange_info_map,
|
|
|
|
|
+ klines_map,
|
|
|
|
|
+ asks_map,
|
|
|
|
|
+ bids_map,
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pub async fn process_klines_map(symbol: String, depth: Value) -> Result<()> {
|
|
|
|
|
+ Ok(())
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pub async fn process_depth_data(symbol: String, depth: Value) -> Result<()> {
|
|
|
|
|
+ Ok(())
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// use std::collections::BTreeMap;
|
|
// use std::collections::BTreeMap;
|
|
|
// use std::sync::Arc;
|
|
// use std::sync::Arc;
|
|
|
// use std::sync::atomic::{AtomicBool};
|
|
// use std::sync::atomic::{AtomicBool};
|
|
@@ -15,7 +50,7 @@
|
|
|
// use crate::core::Core;
|
|
// use crate::core::Core;
|
|
|
// use crate::exchange_disguise::{on_depth, on_record, on_ticker, on_trade};
|
|
// use crate::exchange_disguise::{on_depth, on_record, on_ticker, on_trade};
|
|
|
// use crate::model::OrderInfo;
|
|
// use crate::model::OrderInfo;
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // 参考 Bybit 合约 启动
|
|
// // 参考 Bybit 合约 启动
|
|
|
// pub(crate) async fn reference_bybit_swap_run(is_shutdown_arc: Arc<AtomicBool>,
|
|
// pub(crate) async fn reference_bybit_swap_run(is_shutdown_arc: Arc<AtomicBool>,
|
|
|
// core_arc: Arc<Mutex<Core>>,
|
|
// core_arc: Arc<Mutex<Core>>,
|
|
@@ -34,7 +69,7 @@
|
|
|
// // BybitSwapSubscribeType::PuKline("1".to_string()),
|
|
// // BybitSwapSubscribeType::PuKline("1".to_string()),
|
|
|
// // BybitSwapSubscribeType::PuTickers
|
|
// // BybitSwapSubscribeType::PuTickers
|
|
|
// ]);
|
|
// ]);
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // 读取数据
|
|
// // 读取数据
|
|
|
// let core_arc_clone = Arc::clone(&core_arc);
|
|
// let core_arc_clone = Arc::clone(&core_arc);
|
|
|
// let mut rest = core_arc_clone.lock().await.platform_rest.clone_box();
|
|
// let mut rest = core_arc_clone.lock().await.platform_rest.clone_box();
|
|
@@ -42,21 +77,21 @@
|
|
|
// let mut records = rest.get_record("1".to_string()).await.unwrap();
|
|
// let mut records = rest.get_record("1".to_string()).await.unwrap();
|
|
|
// for record in records.iter_mut() {
|
|
// for record in records.iter_mut() {
|
|
|
// let core_arc_clone = core_arc.clone();
|
|
// let core_arc_clone = core_arc.clone();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// on_record(core_arc_clone, record).await
|
|
// on_record(core_arc_clone, record).await
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let depth_asks = Arc::new(Mutex::new(Vec::new()));
|
|
// let depth_asks = Arc::new(Mutex::new(Vec::new()));
|
|
|
// let depth_bids = Arc::new(Mutex::new(Vec::new()));
|
|
// let depth_bids = Arc::new(Mutex::new(Vec::new()));
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let fun = move |data: ResponseData| {
|
|
// let fun = move |data: ResponseData| {
|
|
|
// // 在 async 块之前克隆 Arc
|
|
// // 在 async 块之前克隆 Arc
|
|
|
// let core_arc_cc = core_arc_clone.clone();
|
|
// let core_arc_cc = core_arc_clone.clone();
|
|
|
// let mul = multiplier.clone();
|
|
// let mul = multiplier.clone();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let depth_asks = Arc::clone(&depth_asks);
|
|
// let depth_asks = Arc::clone(&depth_asks);
|
|
|
// let depth_bids = Arc::clone(&depth_bids);
|
|
// let depth_bids = Arc::clone(&depth_bids);
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// async move {
|
|
// async move {
|
|
|
// let mut depth_asks = depth_asks.lock().await;
|
|
// let mut depth_asks = depth_asks.lock().await;
|
|
|
// let mut depth_bids = depth_bids.lock().await;
|
|
// let mut depth_bids = depth_bids.lock().await;
|
|
@@ -64,14 +99,14 @@
|
|
|
// on_public_data(core_arc_cc, &mul, &data, &mut depth_asks, &mut depth_bids, ref_index).await
|
|
// on_public_data(core_arc_cc, &mul, &data, &mut depth_asks, &mut depth_bids, ref_index).await
|
|
|
// }
|
|
// }
|
|
|
// };
|
|
// };
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // 链接
|
|
// // 链接
|
|
|
// let write_tx_am = Arc::new(Mutex::new(write_tx));
|
|
// let write_tx_am = Arc::new(Mutex::new(write_tx));
|
|
|
// ws.set_symbols(symbols);
|
|
// ws.set_symbols(symbols);
|
|
|
// ws.ws_connect_async(is_shutdown_arc, fun, &write_tx_am, write_rx).await.expect("链接失败");
|
|
// ws.ws_connect_async(is_shutdown_arc, fun, &write_tx_am, write_rx).await.expect("链接失败");
|
|
|
// });
|
|
// });
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // 交易 bybit 合约 启动
|
|
// // 交易 bybit 合约 启动
|
|
|
// pub(crate) async fn bybit_swap_run(is_shutdown_arc: Arc<AtomicBool>,
|
|
// pub(crate) async fn bybit_swap_run(is_shutdown_arc: Arc<AtomicBool>,
|
|
|
// core_arc: Arc<Mutex<Core>>,
|
|
// core_arc: Arc<Mutex<Core>>,
|
|
@@ -81,7 +116,7 @@
|
|
|
// exchange_params: BTreeMap<String, String>) {
|
|
// exchange_params: BTreeMap<String, String>) {
|
|
|
// // 参考
|
|
// // 参考
|
|
|
// reference_bybit_swap_run(is_shutdown_arc.clone(), core_arc.clone(), name.clone(), symbols.clone(), is_colo, 233).await;
|
|
// reference_bybit_swap_run(is_shutdown_arc.clone(), core_arc.clone(), name.clone(), symbols.clone(), is_colo, 233).await;
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // 交易
|
|
// // 交易
|
|
|
// spawn(async move {
|
|
// spawn(async move {
|
|
|
// // 交易交易所需要启动私有ws
|
|
// // 交易交易所需要启动私有ws
|
|
@@ -93,39 +128,39 @@
|
|
|
// BybitSwapSubscribeType::PrOrder,
|
|
// BybitSwapSubscribeType::PrOrder,
|
|
|
// BybitSwapSubscribeType::PrWallet
|
|
// BybitSwapSubscribeType::PrWallet
|
|
|
// ]);
|
|
// ]);
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let core_arc_clone_private = core_arc.clone();
|
|
// let core_arc_clone_private = core_arc.clone();
|
|
|
// let multiplier = core_arc_clone_private.lock().await.platform_rest.get_self_market().multiplier;
|
|
// let multiplier = core_arc_clone_private.lock().await.platform_rest.get_self_market().multiplier;
|
|
|
// let run_symbol = symbols.clone()[0].clone();
|
|
// let run_symbol = symbols.clone()[0].clone();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // 挂起私有ws
|
|
// // 挂起私有ws
|
|
|
// let fun = move |data: ResponseData| {
|
|
// let fun = move |data: ResponseData| {
|
|
|
// // 在 async 块之前克隆 Arc
|
|
// // 在 async 块之前克隆 Arc
|
|
|
// let core_arc_cc = core_arc_clone_private.clone();
|
|
// let core_arc_cc = core_arc_clone_private.clone();
|
|
|
// let mul = multiplier.clone();
|
|
// let mul = multiplier.clone();
|
|
|
// let rs = run_symbol.clone();
|
|
// let rs = run_symbol.clone();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// async move {
|
|
// async move {
|
|
|
// // 使用克隆后的 Arc,避免 move 语义
|
|
// // 使用克隆后的 Arc,避免 move 语义
|
|
|
// on_private_data(core_arc_cc, &mul, &rs, &data).await;
|
|
// on_private_data(core_arc_cc, &mul, &rs, &data).await;
|
|
|
// }
|
|
// }
|
|
|
// };
|
|
// };
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // 链接
|
|
// // 链接
|
|
|
// let write_tx_am = Arc::new(Mutex::new(write_tx));
|
|
// let write_tx_am = Arc::new(Mutex::new(write_tx));
|
|
|
// ws.set_symbols(symbols);
|
|
// ws.set_symbols(symbols);
|
|
|
// ws.ws_connect_async(is_shutdown_arc, fun, &write_tx_am, write_rx).await.expect("链接失败");
|
|
// ws.ws_connect_async(is_shutdown_arc, fun, &write_tx_am, write_rx).await.expect("链接失败");
|
|
|
// });
|
|
// });
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// async fn on_public_data(core_arc: Arc<Mutex<Core>>, mul: &Decimal, response: &ResponseData, depth_asks: &mut Vec<OrderBook>, depth_bids: &mut Vec<OrderBook>, ref_index: usize) {
|
|
// async fn on_public_data(core_arc: Arc<Mutex<Core>>, mul: &Decimal, response: &ResponseData, depth_asks: &mut Vec<OrderBook>, depth_bids: &mut Vec<OrderBook>, ref_index: usize) {
|
|
|
// let mut trace_stack = TraceStack::new(response.time, response.ins);
|
|
// let mut trace_stack = TraceStack::new(response.time, response.ins);
|
|
|
// trace_stack.on_after_span_line();
|
|
// trace_stack.on_after_span_line();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// match response.channel.as_str() {
|
|
// match response.channel.as_str() {
|
|
|
// "orderbook" => {
|
|
// "orderbook" => {
|
|
|
// trace_stack.set_source("bybit_usdt_swap.bookTicker".to_string());
|
|
// trace_stack.set_source("bybit_usdt_swap.bookTicker".to_string());
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let mut is_update = false;
|
|
// let mut is_update = false;
|
|
|
// if response.data_type == "delta" {
|
|
// if response.data_type == "delta" {
|
|
|
// is_update = true;
|
|
// is_update = true;
|
|
@@ -137,19 +172,19 @@
|
|
|
// depth_asks.clear();
|
|
// depth_asks.clear();
|
|
|
// depth_asks.append(&mut depth.asks);
|
|
// depth_asks.append(&mut depth.asks);
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// if depth.bids.len() != 0 {
|
|
// if depth.bids.len() != 0 {
|
|
|
// depth_bids.clear();
|
|
// depth_bids.clear();
|
|
|
// depth_bids.append(&mut depth.bids);
|
|
// depth_bids.append(&mut depth.bids);
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let result_depth = Depth {
|
|
// let result_depth = Depth {
|
|
|
// time: depth.time,
|
|
// time: depth.time,
|
|
|
// symbol: depth.symbol,
|
|
// symbol: depth.symbol,
|
|
|
// asks: depth_asks.clone(),
|
|
// asks: depth_asks.clone(),
|
|
|
// bids: depth_bids.clone(),
|
|
// bids: depth_bids.clone(),
|
|
|
// };
|
|
// };
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// trace_stack.on_after_format();
|
|
// trace_stack.on_after_format();
|
|
|
// on_depth(core_arc.clone(), &response.label, &mut trace_stack, &result_depth, ref_index).await;
|
|
// on_depth(core_arc.clone(), &response.label, &mut trace_stack, &result_depth, ref_index).await;
|
|
|
// // on_depth(core_arc, &response.label, &mut trace_stack, &result_depth, 1).await;
|
|
// // on_depth(core_arc, &response.label, &mut trace_stack, &result_depth, 1).await;
|
|
@@ -159,7 +194,7 @@
|
|
|
// trace_stack.on_after_format();
|
|
// trace_stack.on_after_format();
|
|
|
// on_depth(core_arc.clone(), &response.label, &mut trace_stack, &depth, ref_index).await;
|
|
// on_depth(core_arc.clone(), &response.label, &mut trace_stack, &depth, ref_index).await;
|
|
|
// // on_depth(core_arc, &response.label, &mut trace_stack, &depth, 1).await;
|
|
// // on_depth(core_arc, &response.label, &mut trace_stack, &depth, 1).await;
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// depth_asks.clear();
|
|
// depth_asks.clear();
|
|
|
// depth_asks.append(&mut depth.asks);
|
|
// depth_asks.append(&mut depth.asks);
|
|
|
// depth_bids.clear();
|
|
// depth_bids.clear();
|
|
@@ -168,10 +203,10 @@
|
|
|
// }
|
|
// }
|
|
|
// "trade" => {
|
|
// "trade" => {
|
|
|
// trace_stack.set_source("bybit_usdt_swap.trade".to_string());
|
|
// trace_stack.set_source("bybit_usdt_swap.trade".to_string());
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let mut trades = ExchangeStructHandler::trades_handle(BybitSwap, response, mul);
|
|
// let mut trades = ExchangeStructHandler::trades_handle(BybitSwap, response, mul);
|
|
|
// trace_stack.on_after_format();
|
|
// trace_stack.on_after_format();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// for trade in trades.iter_mut() {
|
|
// for trade in trades.iter_mut() {
|
|
|
// on_trade(core_arc.clone(), &response.label, &mut trace_stack, &trade, ref_index).await;
|
|
// on_trade(core_arc.clone(), &response.label, &mut trace_stack, &trade, ref_index).await;
|
|
|
// // on_trade(core_arc.clone(), &response.label, &mut trace_stack, &trade, 1).await;
|
|
// // on_trade(core_arc.clone(), &response.label, &mut trace_stack, &trade, 1).await;
|
|
@@ -181,20 +216,20 @@
|
|
|
// trace_stack.set_source("bybit_usdt_swap.tickers".to_string());
|
|
// trace_stack.set_source("bybit_usdt_swap.tickers".to_string());
|
|
|
// let ticker = ExchangeStructHandler::ticker_handle(BybitSwap, response).await;
|
|
// let ticker = ExchangeStructHandler::ticker_handle(BybitSwap, response).await;
|
|
|
// trace_stack.on_after_format();
|
|
// trace_stack.on_after_format();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// on_ticker(core_arc, &mut trace_stack, &ticker).await;
|
|
// on_ticker(core_arc, &mut trace_stack, &ticker).await;
|
|
|
// },
|
|
// },
|
|
|
// // k线数据
|
|
// // k线数据
|
|
|
// "kline" => {
|
|
// "kline" => {
|
|
|
// let mut records = ExchangeStructHandler::records_handle(BybitSwap, &response);
|
|
// let mut records = ExchangeStructHandler::records_handle(BybitSwap, &response);
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// if records.is_empty() {
|
|
// if records.is_empty() {
|
|
|
// return;
|
|
// return;
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// for record in records.iter_mut() {
|
|
// for record in records.iter_mut() {
|
|
|
// let core_arc_clone = core_arc.clone();
|
|
// let core_arc_clone = core_arc.clone();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// on_record(core_arc_clone, record).await
|
|
// on_record(core_arc_clone, record).await
|
|
|
// }
|
|
// }
|
|
|
// },
|
|
// },
|
|
@@ -204,11 +239,11 @@
|
|
|
// }
|
|
// }
|
|
|
// }
|
|
// }
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// async fn on_private_data(core_arc_clone: Arc<Mutex<Core>>, ct_val: &Decimal, run_symbol: &String, response: &ResponseData) {
|
|
// async fn on_private_data(core_arc_clone: Arc<Mutex<Core>>, ct_val: &Decimal, run_symbol: &String, response: &ResponseData) {
|
|
|
// let mut trace_stack = TraceStack::new(response.time, response.ins);
|
|
// let mut trace_stack = TraceStack::new(response.time, response.ins);
|
|
|
// trace_stack.on_after_span_line();
|
|
// trace_stack.on_after_span_line();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// match response.channel.as_str() {
|
|
// match response.channel.as_str() {
|
|
|
// "wallet" => {
|
|
// "wallet" => {
|
|
|
// let account = ExchangeStructHandler::account_info_handle(BybitSwap, response, run_symbol);
|
|
// let account = ExchangeStructHandler::account_info_handle(BybitSwap, response, run_symbol);
|
|
@@ -218,23 +253,23 @@
|
|
|
// "order" => {
|
|
// "order" => {
|
|
|
// let orders = ExchangeStructHandler::order_handle(BybitSwap, response, ct_val);
|
|
// let orders = ExchangeStructHandler::order_handle(BybitSwap, response, ct_val);
|
|
|
// trace_stack.on_after_format();
|
|
// trace_stack.on_after_format();
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let mut order_infos:Vec<OrderInfo> = Vec::new();
|
|
// let mut order_infos:Vec<OrderInfo> = Vec::new();
|
|
|
// for mut order in orders.order {
|
|
// for mut order in orders.order {
|
|
|
// if order.status == "NULL" {
|
|
// if order.status == "NULL" {
|
|
|
// error!("bybit_usdt_swap 未识别的订单状态:{:?}", response);
|
|
// error!("bybit_usdt_swap 未识别的订单状态:{:?}", response);
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// continue;
|
|
// continue;
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// // if order.deal_amount != Decimal::ZERO {
|
|
// // if order.deal_amount != Decimal::ZERO {
|
|
|
// // info!("bybit order 消息原文:{:?}", response);
|
|
// // info!("bybit order 消息原文:{:?}", response);
|
|
|
// // }
|
|
// // }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let order_info = OrderInfo::parse_order_to_order_info(&mut order);
|
|
// let order_info = OrderInfo::parse_order_to_order_info(&mut order);
|
|
|
// order_infos.push(order_info);
|
|
// order_infos.push(order_info);
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// let mut core = core_arc_clone.lock().await;
|
|
// let mut core = core_arc_clone.lock().await;
|
|
|
// core.update_order(order_infos, trace_stack).await;
|
|
// core.update_order(order_infos, trace_stack).await;
|
|
|
// }
|
|
// }
|
|
@@ -249,7 +284,7 @@
|
|
|
// }
|
|
// }
|
|
|
// }
|
|
// }
|
|
|
// }
|
|
// }
|
|
|
-//
|
|
|
|
|
|
|
+//
|
|
|
// fn parse_btree_map_to_bybit_swap_login(exchange_params: BTreeMap<String, String>) -> BybitSwapLogin {
|
|
// fn parse_btree_map_to_bybit_swap_login(exchange_params: BTreeMap<String, String>) -> BybitSwapLogin {
|
|
|
// BybitSwapLogin {
|
|
// BybitSwapLogin {
|
|
|
// api_key: exchange_params.get("access_key").unwrap().clone(),
|
|
// api_key: exchange_params.get("access_key").unwrap().clone(),
|