use std::str::FromStr; use rust_decimal::Decimal; use rust_decimal_macros::dec; use tracing::{error, info}; use crate::binance_swap::binance_swap_standard; use crate::gate_swap::gate_swap_standard; use crate::struct_standard::{AggTrades, Trades}; pub async fn get_gate_ticker_info(symbol: &str, start_at: &str, end_at: &str) -> Vec { let market_info = gate_swap_standard::standard_market(symbol).await; let ct_val = market_info.unwrap().ct_val; let mut end_time = end_at.to_string(); let mut ticker_info_list: Vec = vec![]; loop { info!("正在查询 Gate 信息,请稍后!"); let ticker_info = gate_swap_standard::standard_trades(symbol, start_at, &end_time, Option::from(ct_val)).await; match ticker_info { Ok(value) => { ticker_info_list.extend(value.clone()); if value.len() >= 1000 { end_time = (Decimal::from_str(&value[0].create_time).unwrap() / dec!(1000)).ceil().to_string(); } else { break; } } Err(err) => { error!("{}", err.to_string()); } }; }; let mut set = std::collections::HashSet::new(); ticker_info_list.clone().into_iter().filter(|e| set.insert(e.clone())).collect() } pub async fn get_binance_ticker_info(symbol: &str, start_at: &str, end_at: &str) -> Vec { let mut agg_ticker_info_list: Vec = vec![]; let start_at_d = Decimal::from_str(start_at).unwrap(); let end_at_d = Decimal::from_str(end_at).unwrap(); let end_time = if end_at_d - start_at_d > dec!(3600) { (start_at_d + dec!(3600)).to_string() } else { end_at_d.to_string() }; info!("正在查询 Binance 信息,请稍后!"); let agg_trades_first = binance_swap_standard::standard_agg_trades(symbol, start_at, &end_time, "").await.unwrap(); agg_ticker_info_list.extend(agg_trades_first.clone()); if agg_trades_first.len() >= 1000 { let mut trade_id = (Decimal::from_str(&agg_trades_first[agg_trades_first.len() - 1].id.clone()).unwrap() + Decimal::ONE).to_string(); loop { info!("正在查询 Binance 信息,请稍后!"); let agg_trades_info = binance_swap_standard::standard_agg_trades(symbol, "", "", &trade_id).await; match agg_trades_info { Ok(value) => { agg_ticker_info_list.extend(value.clone()); if value.len() >= 1000 && value[value.len() - 1].create_time <= end_at.to_string() { trade_id = (Decimal::from_str(&value[value.len() - 1].id.clone()).unwrap() + Decimal::ONE).to_string(); } else { break; } } Err(err) => { error!("{}", err.to_string()); } } } } agg_ticker_info_list = agg_ticker_info_list.iter().filter(|item| item.create_time <= end_at.to_string()).cloned().collect(); let mut ticker_info_list: Vec = vec![]; for agg_trades in agg_ticker_info_list.clone() { ticker_info_list.push(Trades { id: agg_trades.start_id, symbol: agg_trades.symbol, create_time: agg_trades.create_time, size: agg_trades.size, price: agg_trades.price, }) // let id_diff = Decimal::from_str(&agg_trades.end_id).unwrap() - Decimal::from_str(&agg_trades.start_id).unwrap(); // if id_diff > Decimal::ONE { // println!("{},{},{},{}", agg_ticker_info_list[agg_ticker_info_list.len() - 1].id, agg_trades.id, agg_trades.start_id, agg_trades.end_id); // let trades_info = binance_swap_standard::standard_trades(symbol, &(id_diff + dec!(1)).to_string(), &agg_trades.start_id).await; // ticker_info_list.extend(trades_info.unwrap()); // } else { // ticker_info_list.push(Trades { // id: agg_trades.start_id, // symbol: agg_trades.symbol, // create_time: agg_trades.create_time, // size: agg_trades.size, // price: agg_trades.price, // }) // } } ticker_info_list }