diff --git a/src/coin_health_check_team/monitors.rs b/src/coin_health_check_team/monitors.rs index 04d2490..0aad4d7 100644 --- a/src/coin_health_check_team/monitors.rs +++ b/src/coin_health_check_team/monitors.rs @@ -1,10 +1,12 @@ -use crate::coin_health_check_team::request_candles::*; +use crate::coin_health_check_team::{request_candles::*, request_others::ExchangeInfo}; use crate::RunningMode::*; use crate::{database_control::*, RUNNING_MODE}; use hex::ToHex; use hmac_sha256::HMAC; use reqwest::{Client, ClientBuilder, Response}; use rust_decimal::{prelude::ToPrimitive, Decimal}; +use rust_decimal_macros::dec; +use crate::decimal_funcs::*; use serde::Deserialize; use serde_json::Value; use sqlx::{Error, FromRow}; @@ -19,24 +21,23 @@ struct AllCoinProfitChangeAvgList { avg_profit: f64, } -// filter valid USDT trades from all24hstatistics table in database -pub async fn collect_valid_usde_trade( - valid_usdt_trade_vec: &mut Vec, -) -> Result<(), Box> { +pub async fn initialize_valid_usde_trade() -> Result<(), Box> { #[derive(Debug, FromRow)] struct UsdtTrades { symbol: String, } - - let mut usdt_trades = UsdtTrades { symbol: String::new() }; + let mut usdt_trades = UsdtTrades { symbol: String::new()}; let fetch_table_name = String::from("all_24h_change"); let column_name = String::from("symbol"); let mut condition_build = String::from("WHERE symbol LIKE '%USDT' AND symbol NOT LIKE '%DOWNUSDT'"); condition_build.push_str(" AND symbol NOT LIKE '%UPUSDT' AND firstId >= 0 AND lastId >= 0"); - condition_build.push_str(" AND symbol NOT IN (SELECT symbol FROM stop_usdt_trades)"); - // add unnessesary coins + condition_build.push_str(" AND bidPrice > 0"); + condition_build.push_str(" AND bidQty > 0"); + condition_build.push_str(" AND askPrice > 0"); + condition_build.push_str(" AND askQty > 0"); + // add fiat and unnessesary coins condition_build.push_str(" AND symbol NOT LIKE 'BUSDUSDT'"); condition_build.push_str(" AND symbol NOT LIKE 'USTCUSDT'"); condition_build.push_str(" AND symbol NOT LIKE 'FDUSDUSDT'"); @@ -57,25 +58,125 @@ pub async fn collect_valid_usde_trade( condition_build.push_str(" AND symbol NOT LIKE 'BTCSTUSDT'"); condition_build.push_str(" AND symbol NOT LIKE 'ACAUSDT'"); condition_build.push_str(" AND symbol NOT LIKE 'ANCUSDT'"); + let condition = Some(condition_build); - let select_result = select_record(&fetch_table_name, &column_name, &condition, &usdt_trades).await?; + // get valid usdt trades + let usdt_trades = select_record(&fetch_table_name, &column_name, &condition, &usdt_trades).await?; + // update valid usdt trades let table_name = String::from("valid_usdt_trades"); let columns = vec!["symbol"]; - let mut symbol_vec: Vec = Vec::new(); let mut value_wrapper: Vec> = Vec::new(); - for element in select_result { + for element in &usdt_trades { let mut inner_vec: Vec = Vec::new(); inner_vec.push(element.symbol.clone()); value_wrapper.push(inner_vec); - symbol_vec.push(element.symbol); } - *valid_usdt_trade_vec = symbol_vec; + delete_all_rows(&table_name).await?; + insert_records(&table_name, &columns, &value_wrapper).await?; + + Ok(()) +} + +// filter valid USDT trades from all24hstatistics table in database +pub async fn collect_valid_usde_trade( + valid_usdt_trade_vec: &mut Vec, + exchange_info_vec: &Vec, +) -> Result<(), Box> { + #[derive(Debug, FromRow)] + struct UsdtTrades { + symbol: String, + weightedavgprice: f64 + } + + let mut usdt_trades = UsdtTrades { symbol: String::new(), weightedavgprice:0.0 }; + + let fetch_table_name = String::from("all_24h_change"); + let column_name = String::from("symbol, weightedAvgPrice"); + let mut condition_build = String::from("WHERE symbol LIKE '%USDT' AND symbol NOT LIKE '%DOWNUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE '%UPUSDT' AND firstId >= 0 AND lastId >= 0"); + condition_build.push_str(" AND bidPrice > 0"); + condition_build.push_str(" AND bidQty > 0"); + condition_build.push_str(" AND askPrice > 0"); + condition_build.push_str(" AND askQty > 0"); + // condition_build.push_str(" AND symbol NOT IN (SELECT symbol FROM stop_usdt_trades)"); + // add fiat and unnessesary coins + condition_build.push_str(" AND symbol NOT LIKE 'BUSDUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'USTCUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'FDUSDUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'TUSDUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'USDPUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'SUSDUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'AUDUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'EURUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'GBPUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'USDCUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'BZRXUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'USTUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'NBTUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'VGXUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'RAMPUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'TORNUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'BTTCUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'BTCSTUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'ACAUSDT'"); + condition_build.push_str(" AND symbol NOT LIKE 'ANCUSDT'"); + + let condition = Some(condition_build); + + // get valid usdt trades + let usdt_trades = select_record(&fetch_table_name, &column_name, &condition, &usdt_trades).await?; + + // filtering usdt trades + let mut filtered_usdt_trades: Vec = Vec::new(); + let mut excluded_usdt_trades: Vec = Vec::new(); + for usdt_trade in usdt_trades { + // build update values + let step_size_result = exchange_info_vec + .iter() + .position(|ExchangeInfo| ExchangeInfo.symbol == usdt_trade.symbol); + + if step_size_result.is_some() { + let avg_price: Decimal = rust_decimal::prelude::FromPrimitive::from_f64(usdt_trade.weightedavgprice).unwrap(); + let step_size = exchange_info_vec[step_size_result.unwrap()].stepsize; + let step_price = decimal_mul(step_size, avg_price); + let unit_trade_usdt = crate::coex::assets_managing_team::get_unit_trade_usdt().await; + + // exclude USDT trades whose step_price is over than 1% of unit_trade_usdt + if step_price > decimal_mul(unit_trade_usdt, dec!(0.01)) { + excluded_usdt_trades.push(usdt_trade.symbol.clone()); + } else { + filtered_usdt_trades.push(usdt_trade.symbol.clone()); + } + } + } + + // update valid usdt trades + let table_name = String::from("valid_usdt_trades"); + let columns = vec!["symbol"]; + let mut value_wrapper: Vec> = Vec::new(); + for symbol in &filtered_usdt_trades { + let mut inner_vec: Vec = Vec::new(); + inner_vec.push(symbol.clone()); + value_wrapper.push(inner_vec); + } + *valid_usdt_trade_vec = filtered_usdt_trades; delete_all_rows(&table_name).await?; insert_records(&table_name, &columns, &value_wrapper).await?; - + // update stop usdt trades + let table_name = String::from("stop_usdt_trades"); + let columns = vec!["symbol"]; + let mut value_wrapper: Vec> = Vec::new(); + for symbol in excluded_usdt_trades { + let mut inner_vec: Vec = Vec::new(); + inner_vec.push(symbol.clone()); + value_wrapper.push(inner_vec); + } + delete_all_rows(&table_name).await?; + insert_records(&table_name, &columns, &value_wrapper).await?; + // major trades // if RUNNING_MODE == TEST || RUNNING_MODE == REAL || RUNNING_MODE == SIMUL { // let table_name = String::from("valid_usdt_trades"); @@ -147,95 +248,6 @@ pub async fn collect_valid_usde_trade( Ok(()) } -// async fn detect_new_valid_usdt_trade() -> Result<(), Box>{ -// #[derive(Debug, FromRow)] -// struct UsdtTrades { -// symbol: String, -// } -// let mut usdt_trades = UsdtTrades { symbol: String::new() }; - -// let table_name = String::from("valid_usdt_trades"); -// let column_name = String::from("valid_usdt_trades.symbol"); -// let condition = Some(String::from("LEFT OUTER JOIN prev_valid_usdt_trades ON valid_usdt_trades.symbol = prev_valid_usdt_trades.symbol WHERE prev_valid_usdt_trades.symbol is null")); - -// let select_result = try_select_record(&table_name, &column_name, &condition, &usdt_trades).await.unwrap(); - -// if !select_result.is_empty() { -// let intervals = vec![String::from("1m"), String::from("30m"), String::from("1d"), String::from("1w"), String::from("1mon")]; -// let symbol_vec: Vec = select_result.into_iter().map(|element| element.symbol).collect(); -// for interval in intervals{ -// for element in &symbol_vec { -// create_candle_table(element, &interval).await.unwrap(); -// } -// request_candlestick_initial(&symbol_vec, &interval).await.unwrap(); -// } -// println!("detect_new_valid_usde_trade 완료"); -// } -// Ok(()) -// } - -async fn detect_new_valid_usdt_trade() -> Result<(), Box> { - #[derive(Debug, FromRow)] - struct UsdtTrades { - symbol: String, - } - let mut usdt_trades = UsdtTrades { - symbol: String::new(), - }; - let table_name = String::from("valid_usdt_trades"); - let column_name = String::from("valid_usdt_trades.symbol"); - let condition = Some(String::from("LEFT OUTER JOIN prev_valid_usdt_trades ON valid_usdt_trades.symbol = prev_valid_usdt_trades.symbol WHERE prev_valid_usdt_trades.symbol is null")); - let select_result = - try_select_record(&table_name, &column_name, &condition, &usdt_trades).await?; - if !select_result.is_empty() { - let intervals = vec![ - String::from("1m"), - String::from("30m"), - String::from("1d"), - String::from("1w"), - String::from("1mon"), - ]; - for interval in intervals { - for element in &select_result { - create_candle_table(&element.symbol, &interval).await?; - request_candlestick_initial(element.symbol.clone(), &interval).await?; - } - } - // println!("detect_new_valid_usde_trade 완료"); - } - Ok(()) -} - -async fn deceased_usdt_trade() -> Result<(), Box> { - #[derive(Debug, FromRow)] - struct UsdtTrades { - symbol: String, - } - let mut usdt_trades = UsdtTrades { - symbol: String::new(), - }; - let insert_table_name = String::from("deceased_usdt_trades"); - let table_name = String::from("valid_usdt_trades"); - let column_name = String::from("prev_valid_usdt_trades.symbol"); - let condition = Some(String::from("RIGHT OUTER JOIN prev_valid_usdt_trades ON valid_usdt_trades.symbol = prev_valid_usdt_trades.symbol WHERE valid_usdt_trades.symbol is null")); - - let select_result = - try_select_record(&table_name, &column_name, &condition, &usdt_trades).await?; - - if !select_result.is_empty() { - let columns = vec!["symbol"]; - let mut value_wrapper: Vec> = Vec::new(); - for element in select_result { - let mut inner_vec: Vec = Vec::new(); - inner_vec.push(element.symbol); - value_wrapper.push(inner_vec); - } - insert_records(&insert_table_name, &columns, &value_wrapper).await?; - // println!("deceased_usde_trade 완료"); - } - Ok(()) -} - pub async fn total_24h_change_profit_index() -> Result<(), Box> { #[derive(Debug, FromRow)]