diff --git a/src/strategy_team/mod.rs b/src/strategy_team/mod.rs index a572ae7..9fc8f61 100644 --- a/src/strategy_team/mod.rs +++ b/src/strategy_team/mod.rs @@ -88,3 +88,56 @@ impl FilteredData { a } } + +pub async fn duplicate_filter(registerer: i32, original_filtered_data: &Vec) +-> Result, Box> +{ + let inspect_table_name_1 = String::from("buy_ordered_coin_list"); + let inspect_table_name_2 = String::from("sell_ordered_coin_list"); + let inspect_table_name_3 = String::from("pre_suggested_coin_list"); + let inspect_table_name_4 = String::from("suggested_coin_list"); + + let mut filtered_data: Vec = Vec::new(); + let mut filtered_data_arc: Arc>> = + Arc::new(Mutex::new(filtered_data)); + let mut task_vec = Vec::new(); + + for element in original_filtered_data { + let mut exists_condition_build = String::from("symbol=\'"); + exists_condition_build.push_str(element.symbol.as_str()); + exists_condition_build.push_str("\' AND registerer="); + exists_condition_build.push_str(registerer.to_string().as_str()); + // exists_condition_build.push_str("\' AND close_time="); + // exists_condition_build.push_str(element.1.to_string().as_str()); + let exists_condition = Some(exists_condition_build); + let exists_condition_c = exists_condition.clone(); + let inspect_table_name_1_c = inspect_table_name_1.clone(); + let inspect_table_name_2_c = inspect_table_name_2.clone(); + let inspect_table_name_3_c = inspect_table_name_3.clone(); + let inspect_table_name_4_c = inspect_table_name_4.clone(); + let element_c = element.clone(); + let filtered_data_arc_c = Arc::clone(&filtered_data_arc); + task_vec.push(tokio::spawn(async move { + let inspect_result_1 = + exists_record(&inspect_table_name_1_c, &exists_condition_c).await; + let inspect_result_2 = + exists_record(&inspect_table_name_2_c, &exists_condition_c).await; + let inspect_result_3 = + exists_record(&inspect_table_name_3_c, &exists_condition_c).await; + let inspect_result_4 = + exists_record(&inspect_table_name_4_c, &exists_condition_c).await; + + if inspect_result_1 == false + && inspect_result_2 == false + && inspect_result_3 == false + && inspect_result_4 == false + { + let mut filtered_data_lock = filtered_data_arc_c.lock().await; + filtered_data_lock.push(element_c); + } + })); + } + try_join_all(task_vec).await?; + let filtered_data_c = filtered_data_arc.lock().await.clone(); + Ok(filtered_data_c) +} diff --git a/src/strategy_team/strategy_001.rs b/src/strategy_team/strategy_001.rs index ab5e5e5..9ea5372 100644 --- a/src/strategy_team/strategy_001.rs +++ b/src/strategy_team/strategy_001.rs @@ -5,7 +5,7 @@ use super::{ limit_order_sell, rsi, select_filled_buy_orders, stoch_rsi, supertrend, try_join_all, AllData, Arc, Client, ClientBuilder, Decimal, EmaData, ExchangeInfo, FilteredData, Mutex, RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd, - BollingerBandData, ToPrimitive + BollingerBandData, ToPrimitive, duplicate_filter }; // BB lowerband + SuperTrend + StochRSI @@ -18,60 +18,15 @@ pub async fn list_up_for_buy( // let a = alldata.rt_price_30m_vec.iter().position(|a| a.0 == "BTCUSDT"); // println!("BTCUSDT: {:?}", alldata.rt_price_30m_vec[a.unwrap()].1.last().unwrap()); - // 1st filtering: lookup tables if the tradepair is already there - let inspect_table_name_1 = String::from("buy_ordered_coin_list"); - let inspect_table_name_2 = String::from("sell_ordered_coin_list"); - let inspect_table_name_3 = String::from("pre_suggested_coin_list"); - let inspect_table_name_4 = String::from("suggested_coin_list"); - + // 1st filtering: filtering valid trade pair let mut filtered_data_1st: Vec = Vec::new(); - let mut filtered_data_1st_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_1st)); - let mut task_vec = Vec::new(); - for symbol in &alldata.valid_symbol_vec { - let mut exists_condition_build = String::from("symbol=\'"); - exists_condition_build.push_str(symbol.as_str()); - exists_condition_build.push_str("\' AND registerer="); - exists_condition_build.push_str(1.to_string().as_str()); - // exists_condition_build.push_str("\' AND close_time="); - // exists_condition_build.push_str(element.1.to_string().as_str()); - let exists_condition = Some(exists_condition_build); - let exists_condition_c = exists_condition.clone(); - let inspect_table_name_1_c = inspect_table_name_1.clone(); - let inspect_table_name_2_c = inspect_table_name_2.clone(); - let inspect_table_name_3_c = inspect_table_name_3.clone(); - let inspect_table_name_4_c = inspect_table_name_4.clone(); - let symbol_c = symbol.clone(); - let filtered_data_1st_arc_c = Arc::clone(&filtered_data_1st_arc); - task_vec.push(tokio::spawn(async move { - let mut filtered_data = FilteredData::new(); - let inspect_result_1 = - exists_record(&inspect_table_name_1_c, &exists_condition_c).await; - let inspect_result_2 = - exists_record(&inspect_table_name_2_c, &exists_condition_c).await; - let inspect_result_3 = - exists_record(&inspect_table_name_3_c, &exists_condition_c).await; - let inspect_result_4 = - exists_record(&inspect_table_name_4_c, &exists_condition_c).await; - - if inspect_result_1 == false - && inspect_result_2 == false - && inspect_result_3 == false - && inspect_result_4 == false - { - let mut filtered_data_1st_lock = filtered_data_1st_arc_c.lock().await; - - filtered_data.symbol = symbol_c; - - filtered_data_1st_lock.push(filtered_data); - } - })); + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = symbol.clone(); + filtered_data_1st.push(filtered_data); } - try_join_all(task_vec).await?; // 2nd filtering: supertrend(ATR period 20, multiplier: 2, 30m close price) - let filtered_data_1st = filtered_data_1st_arc.lock().await.clone(); let mut filtered_data_2nd: Vec = Vec::new(); let mut filtered_data_2nd_arc: Arc>> = Arc::new(Mutex::new(filtered_data_2nd)); @@ -254,7 +209,7 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - let final_filtered_data = filtered_data_5th_arc.lock().await.clone(); + let final_filtered_data = duplicate_filter(1, &filtered_data_5th_arc.lock().await.clone()).await?; insert_pre_suggested_coins(1, false, &final_filtered_data, &alldata).await; Ok(()) @@ -324,7 +279,7 @@ pub async fn list_up_for_sell( .await .unwrap(); } - + let lot_step_size = exchange_info_vec[lot_step_size_option.unwrap()].stepsize; let quote_commission_precision = exchange_info_vec [quote_commission_precision_option.unwrap()] diff --git a/src/strategy_team/strategy_002.rs b/src/strategy_team/strategy_002.rs index f4e7ee1..d2f6faf 100644 --- a/src/strategy_team/strategy_002.rs +++ b/src/strategy_team/strategy_002.rs @@ -5,7 +5,7 @@ use super::{ limit_order_sell, rsi, select_filled_buy_orders, stoch_rsi, supertrend, try_join_all, AllData, Arc, Client, ClientBuilder, Decimal, EmaData, ExchangeInfo, FilteredData, Mutex, RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd, - BollingerBandData, ToPrimitive + BollingerBandData, ToPrimitive, duplicate_filter }; // BB 30m lowerband + BB 1m lowerband @@ -17,60 +17,15 @@ pub async fn list_up_for_buy( // let a = alldata.rt_price_30m_vec.iter().position(|a| a.0 == "BTCUSDT"); // println!("BTCUSDT: {:?}", alldata.rt_price_30m_vec[a.unwrap()].1.last().unwrap()); - // 1st filtering: lookup tables if the tradepair is already there - let inspect_table_name_1 = String::from("buy_ordered_coin_list"); - let inspect_table_name_2 = String::from("sell_ordered_coin_list"); - let inspect_table_name_3 = String::from("pre_suggested_coin_list"); - let inspect_table_name_4 = String::from("suggested_coin_list"); - + // 1st filtering: filtering valid trade pair let mut filtered_data_1st: Vec = Vec::new(); - let mut filtered_data_1st_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_1st)); - let mut task_vec = Vec::new(); - for symbol in &alldata.valid_symbol_vec { - let mut exists_condition_build = String::from("symbol=\'"); - exists_condition_build.push_str(symbol.as_str()); - exists_condition_build.push_str("\' AND registerer="); - exists_condition_build.push_str(2.to_string().as_str()); - // exists_condition_build.push_str("\' AND close_time="); - // exists_condition_build.push_str(element.1.to_string().as_str()); - let exists_condition = Some(exists_condition_build); - let exists_condition_c = exists_condition.clone(); - let inspect_table_name_1_c = inspect_table_name_1.clone(); - let inspect_table_name_2_c = inspect_table_name_2.clone(); - let inspect_table_name_3_c = inspect_table_name_3.clone(); - let inspect_table_name_4_c = inspect_table_name_4.clone(); - let symbol_c = symbol.clone(); - let filtered_data_1st_arc_c = Arc::clone(&filtered_data_1st_arc); - task_vec.push(tokio::spawn(async move { - let mut filtered_data = FilteredData::new(); - let inspect_result_1 = - exists_record(&inspect_table_name_1_c, &exists_condition_c).await; - let inspect_result_2 = - exists_record(&inspect_table_name_2_c, &exists_condition_c).await; - let inspect_result_3 = - exists_record(&inspect_table_name_3_c, &exists_condition_c).await; - let inspect_result_4 = - exists_record(&inspect_table_name_4_c, &exists_condition_c).await; - - if inspect_result_1 == false - && inspect_result_2 == false - && inspect_result_3 == false - && inspect_result_4 == false - { - let mut filtered_data_1st_lock = filtered_data_1st_arc_c.lock().await; - - filtered_data.symbol = symbol_c; - - filtered_data_1st_lock.push(filtered_data); - } - })); + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = symbol.clone(); + filtered_data_1st.push(filtered_data); } - try_join_all(task_vec).await?; // 2nd filtering: BollingerBand (len:10, multiplier 2.5) previous_30m_price (close or low price) < lower_band - let filtered_data_1st = filtered_data_1st_arc.lock().await.clone(); let mut filtered_data_2nd: Vec = Vec::new(); let mut filtered_data_2nd_arc: Arc>> = Arc::new(Mutex::new(filtered_data_2nd)); @@ -265,7 +220,7 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - let final_filtered_data = filtered_data_5th_arc.lock().await.clone(); + let final_filtered_data = duplicate_filter(2, &filtered_data_5th_arc.lock().await.clone()).await?; insert_pre_suggested_coins(2, false, &final_filtered_data, &alldata).await; Ok(()) diff --git a/src/strategy_team/strategy_003.rs b/src/strategy_team/strategy_003.rs index a5fac0d..4c82aff 100644 --- a/src/strategy_team/strategy_003.rs +++ b/src/strategy_team/strategy_003.rs @@ -5,7 +5,7 @@ use super::{ limit_order_sell, rsi, select_filled_buy_orders, stoch_rsi, supertrend, try_join_all, AllData, Arc, Client, ClientBuilder, Decimal, EmaData, ExchangeInfo, FilteredData, Mutex, SmaData, RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd, - BollingerBandData, ToPrimitive + BollingerBandData, ToPrimitive, duplicate_filter }; // BUY: 30m SMA5 (opclo_price) < 30m EMA3 (opclo_price) @@ -17,60 +17,15 @@ pub async fn list_up_for_buy( // let a = alldata.rt_price_30m_vec.iter().position(|a| a.0 == "BTCUSDT"); // println!("BTCUSDT: {:?}", alldata.rt_price_30m_vec[a.unwrap()].1.last().unwrap()); - // 1st filtering: lookup tables if the tradepair is already there - let inspect_table_name_1 = String::from("buy_ordered_coin_list"); - let inspect_table_name_2 = String::from("sell_ordered_coin_list"); - let inspect_table_name_3 = String::from("pre_suggested_coin_list"); - let inspect_table_name_4 = String::from("suggested_coin_list"); - + // 1st filtering: filtering valid trade pair let mut filtered_data_1st: Vec = Vec::new(); - let mut filtered_data_1st_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_1st)); - let mut task_vec = Vec::new(); - for symbol in &alldata.valid_symbol_vec { - let mut exists_condition_build = String::from("symbol=\'"); - exists_condition_build.push_str(symbol.as_str()); - exists_condition_build.push_str("\' AND registerer="); - exists_condition_build.push_str(3.to_string().as_str()); - // exists_condition_build.push_str("\' AND close_time="); - // exists_condition_build.push_str(element.1.to_string().as_str()); - let exists_condition = Some(exists_condition_build); - let exists_condition_c = exists_condition.clone(); - let inspect_table_name_1_c = inspect_table_name_1.clone(); - let inspect_table_name_2_c = inspect_table_name_2.clone(); - let inspect_table_name_3_c = inspect_table_name_3.clone(); - let inspect_table_name_4_c = inspect_table_name_4.clone(); - let symbol_c = symbol.clone(); - let filtered_data_1st_arc_c = Arc::clone(&filtered_data_1st_arc); - task_vec.push(tokio::spawn(async move { - let mut filtered_data = FilteredData::new(); - let inspect_result_1 = - exists_record(&inspect_table_name_1_c, &exists_condition_c).await; - let inspect_result_2 = - exists_record(&inspect_table_name_2_c, &exists_condition_c).await; - let inspect_result_3 = - exists_record(&inspect_table_name_3_c, &exists_condition_c).await; - let inspect_result_4 = - exists_record(&inspect_table_name_4_c, &exists_condition_c).await; - - if inspect_result_1 == false - && inspect_result_2 == false - && inspect_result_3 == false - && inspect_result_4 == false - { - let mut filtered_data_1st_lock = filtered_data_1st_arc_c.lock().await; - - filtered_data.symbol = symbol_c; - - filtered_data_1st_lock.push(filtered_data); - } - })); + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = symbol.clone(); + filtered_data_1st.push(filtered_data); } - try_join_all(task_vec).await?; // 2nd filtering: SMA5 (opclo_price) < EMA3 (opclo_price) && 5 previous MA > current MA - let filtered_data_1st = filtered_data_1st_arc.lock().await.clone(); let mut filtered_data_2nd: Vec = Vec::new(); let mut filtered_data_2nd_arc: Arc>> = Arc::new(Mutex::new(filtered_data_2nd)); @@ -229,7 +184,7 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - let final_filtered_data = filtered_data_4th_arc.lock().await.clone(); + let final_filtered_data = duplicate_filter(3, &filtered_data_4th_arc.lock().await.clone()).await?; insert_pre_suggested_coins(3, false, &final_filtered_data, &alldata).await; Ok(()) diff --git a/src/strategy_team/strategy_004.rs b/src/strategy_team/strategy_004.rs index 70f7b4e..4dd5303 100644 --- a/src/strategy_team/strategy_004.rs +++ b/src/strategy_team/strategy_004.rs @@ -5,7 +5,7 @@ use super::{ limit_order_sell, rsi, select_filled_buy_orders, stoch_rsi, supertrend, try_join_all, AllData, Arc, Client, ClientBuilder, Decimal, EmaData, ExchangeInfo, FilteredData, Mutex, RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd, - BollingerBandData, ToPrimitive + BollingerBandData, ToPrimitive, duplicate_filter }; // BB lowerband + SuperTrend + StochRSI @@ -18,60 +18,15 @@ pub async fn list_up_for_buy( // let a = alldata.rt_price_30m_vec.iter().position(|a| a.0 == "BTCUSDT"); // println!("BTCUSDT: {:?}", alldata.rt_price_30m_vec[a.unwrap()].1.last().unwrap()); - // 1st filtering: lookup tables if the tradepair is already there - let inspect_table_name_1 = String::from("buy_ordered_coin_list"); - let inspect_table_name_2 = String::from("sell_ordered_coin_list"); - let inspect_table_name_3 = String::from("pre_suggested_coin_list"); - let inspect_table_name_4 = String::from("suggested_coin_list"); - + // 1st filtering: filtering valid trade pair let mut filtered_data_1st: Vec = Vec::new(); - let mut filtered_data_1st_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_1st)); - let mut task_vec = Vec::new(); - for symbol in &alldata.valid_symbol_vec { - let mut exists_condition_build = String::from("symbol=\'"); - exists_condition_build.push_str(symbol.as_str()); - exists_condition_build.push_str("\' AND registerer="); - exists_condition_build.push_str(4.to_string().as_str()); - // exists_condition_build.push_str("\' AND close_time="); - // exists_condition_build.push_str(element.1.to_string().as_str()); - let exists_condition = Some(exists_condition_build); - let exists_condition_c = exists_condition.clone(); - let inspect_table_name_1_c = inspect_table_name_1.clone(); - let inspect_table_name_2_c = inspect_table_name_2.clone(); - let inspect_table_name_3_c = inspect_table_name_3.clone(); - let inspect_table_name_4_c = inspect_table_name_4.clone(); - let symbol_c = symbol.clone(); - let filtered_data_1st_arc_c = Arc::clone(&filtered_data_1st_arc); - task_vec.push(tokio::spawn(async move { - let mut filtered_data = FilteredData::new(); - let inspect_result_1 = - exists_record(&inspect_table_name_1_c, &exists_condition_c).await; - let inspect_result_2 = - exists_record(&inspect_table_name_2_c, &exists_condition_c).await; - let inspect_result_3 = - exists_record(&inspect_table_name_3_c, &exists_condition_c).await; - let inspect_result_4 = - exists_record(&inspect_table_name_4_c, &exists_condition_c).await; - - if inspect_result_1 == false - && inspect_result_2 == false - && inspect_result_3 == false - && inspect_result_4 == false - { - let mut filtered_data_1st_lock = filtered_data_1st_arc_c.lock().await; - - filtered_data.symbol = symbol_c; - - filtered_data_1st_lock.push(filtered_data); - } - })); + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = symbol.clone(); + filtered_data_1st.push(filtered_data); } - try_join_all(task_vec).await?; // 2nd filtering: BollingerBand (len:30, multiplier 3) previous_30m_price (close or low price) < lower_band - let filtered_data_1st = filtered_data_1st_arc.lock().await.clone(); let mut filtered_data_2nd: Vec = Vec::new(); let mut filtered_data_2nd_arc: Arc>> = Arc::new(Mutex::new(filtered_data_2nd)); @@ -298,7 +253,7 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - let final_filtered_data = filtered_data_6th_arc.lock().await.clone(); + let final_filtered_data = duplicate_filter(4, &filtered_data_6th_arc.lock().await.clone()).await?; insert_pre_suggested_coins(4, false, &final_filtered_data, &alldata).await; Ok(()) diff --git a/src/strategy_team/strategy_005.rs b/src/strategy_team/strategy_005.rs index 22d9116..5c43031 100644 --- a/src/strategy_team/strategy_005.rs +++ b/src/strategy_team/strategy_005.rs @@ -2,7 +2,8 @@ use super::{ dec, decimal_add, decimal_sub, ema, exists_record, insert_pre_suggested_coins, limit_order_sell, rsi, select_filled_buy_orders, stoch_rsi, supertrend, try_join_all, AllData, Arc, Client, ClientBuilder, Decimal, EmaData, ExchangeInfo, FilteredData, Mutex, - RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd + RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd, + duplicate_filter }; // Triple SuperTrend strategy @@ -16,60 +17,15 @@ pub async fn list_up_for_buy( // let a = alldata.rt_price_30m_vec.iter().position(|a| a.0 == "BTCUSDT"); // println!("BTCUSDT: {:?}", alldata.rt_price_30m_vec[a.unwrap()].1.last().unwrap()); - // 1st filtering: lookup tables if the tradepair is already there - let inspect_table_name_1 = String::from("buy_ordered_coin_list"); - let inspect_table_name_2 = String::from("sell_ordered_coin_list"); - let inspect_table_name_3 = String::from("pre_suggested_coin_list"); - let inspect_table_name_4 = String::from("suggested_coin_list"); - + // 1st filtering: filtering valid trade pair let mut filtered_data_1st: Vec = Vec::new(); - let mut filtered_data_1st_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_1st)); - let mut task_vec = Vec::new(); - for symbol in &alldata.valid_symbol_vec { - let mut exists_condition_build = String::from("symbol=\'"); - exists_condition_build.push_str(symbol.as_str()); - exists_condition_build.push_str("\' AND registerer="); - exists_condition_build.push_str(5.to_string().as_str()); - // exists_condition_build.push_str("\' AND close_time="); - // exists_condition_build.push_str(element.1.to_string().as_str()); - let exists_condition = Some(exists_condition_build); - let exists_condition_c = exists_condition.clone(); - let inspect_table_name_1_c = inspect_table_name_1.clone(); - let inspect_table_name_2_c = inspect_table_name_2.clone(); - let inspect_table_name_3_c = inspect_table_name_3.clone(); - let inspect_table_name_4_c = inspect_table_name_4.clone(); - let symbol_c = symbol.clone(); - let filtered_data_1st_arc_c = Arc::clone(&filtered_data_1st_arc); - task_vec.push(tokio::spawn(async move { - let mut filtered_data = FilteredData::new(); - let inspect_result_1 = - exists_record(&inspect_table_name_1_c, &exists_condition_c).await; - let inspect_result_2 = - exists_record(&inspect_table_name_2_c, &exists_condition_c).await; - let inspect_result_3 = - exists_record(&inspect_table_name_3_c, &exists_condition_c).await; - let inspect_result_4 = - exists_record(&inspect_table_name_4_c, &exists_condition_c).await; - - if inspect_result_1 == false - && inspect_result_2 == false - && inspect_result_3 == false - && inspect_result_4 == false - { - let mut filtered_data_1st_lock = filtered_data_1st_arc_c.lock().await; - - filtered_data.symbol = symbol_c; - - filtered_data_1st_lock.push(filtered_data); - } - })); + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = symbol.clone(); + filtered_data_1st.push(filtered_data); } - try_join_all(task_vec).await?; // 2nd filtering: supertrend(ATR period 20, multiplier: 1.5, 30m close price), signal should be BUY - let filtered_data_1st = filtered_data_1st_arc.lock().await.clone(); let mut filtered_data_2nd: Vec = Vec::new(); let mut filtered_data_2nd_arc: Arc>> = Arc::new(Mutex::new(filtered_data_2nd)); @@ -255,7 +211,7 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - let final_filtered_data = filtered_data_5th_arc.lock().await.clone(); + let final_filtered_data = duplicate_filter(5, &filtered_data_5th_arc.lock().await.clone()).await?; insert_pre_suggested_coins(5, false, &final_filtered_data, &alldata).await; Ok(()) diff --git a/src/strategy_team/strategy_006.rs b/src/strategy_team/strategy_006.rs index 3670377..840ef43 100644 --- a/src/strategy_team/strategy_006.rs +++ b/src/strategy_team/strategy_006.rs @@ -2,7 +2,8 @@ use super::{ dec, decimal_add, decimal_sub, ema, exists_record, insert_pre_suggested_coins, limit_order_sell, rsi, select_filled_buy_orders, stoch_rsi, supertrend, try_join_all, AllData, Arc, Client, ClientBuilder, Decimal, EmaData, ExchangeInfo, FilteredData, Mutex, - RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd + RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd, + duplicate_filter }; // Triple SuperTrend strategy @@ -15,60 +16,15 @@ pub async fn list_up_for_buy( // let a = alldata.rt_price_30m_vec.iter().position(|a| a.0 == "BTCUSDT"); // println!("BTCUSDT: {:?}", alldata.rt_price_30m_vec[a.unwrap()].1.last().unwrap()); - // 1st filtering: lookup tables if the tradepair is already there - let inspect_table_name_1 = String::from("buy_ordered_coin_list"); - let inspect_table_name_2 = String::from("sell_ordered_coin_list"); - let inspect_table_name_3 = String::from("pre_suggested_coin_list"); - let inspect_table_name_4 = String::from("suggested_coin_list"); - + // 1st filtering: filtering valid trade pair let mut filtered_data_1st: Vec = Vec::new(); - let mut filtered_data_1st_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_1st)); - let mut task_vec = Vec::new(); - for symbol in &alldata.valid_symbol_vec { - let mut exists_condition_build = String::from("symbol=\'"); - exists_condition_build.push_str(symbol.as_str()); - exists_condition_build.push_str("\' AND registerer="); - exists_condition_build.push_str(6.to_string().as_str()); - // exists_condition_build.push_str("\' AND close_time="); - // exists_condition_build.push_str(element.1.to_string().as_str()); - let exists_condition = Some(exists_condition_build); - let exists_condition_c = exists_condition.clone(); - let inspect_table_name_1_c = inspect_table_name_1.clone(); - let inspect_table_name_2_c = inspect_table_name_2.clone(); - let inspect_table_name_3_c = inspect_table_name_3.clone(); - let inspect_table_name_4_c = inspect_table_name_4.clone(); - let symbol_c = symbol.clone(); - let filtered_data_1st_arc_c = Arc::clone(&filtered_data_1st_arc); - task_vec.push(tokio::spawn(async move { - let mut filtered_data = FilteredData::new(); - let inspect_result_1 = - exists_record(&inspect_table_name_1_c, &exists_condition_c).await; - let inspect_result_2 = - exists_record(&inspect_table_name_2_c, &exists_condition_c).await; - let inspect_result_3 = - exists_record(&inspect_table_name_3_c, &exists_condition_c).await; - let inspect_result_4 = - exists_record(&inspect_table_name_4_c, &exists_condition_c).await; - - if inspect_result_1 == false - && inspect_result_2 == false - && inspect_result_3 == false - && inspect_result_4 == false - { - let mut filtered_data_1st_lock = filtered_data_1st_arc_c.lock().await; - - filtered_data.symbol = symbol_c; - - filtered_data_1st_lock.push(filtered_data); - } - })); + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = symbol.clone(); + filtered_data_1st.push(filtered_data); } - try_join_all(task_vec).await?; // 2nd filtering: supertrend(ATR period 20, multiplier: 1.5, 30m close price), signal should be BUY - let filtered_data_1st = filtered_data_1st_arc.lock().await.clone(); let mut filtered_data_2nd: Vec = Vec::new(); let mut filtered_data_2nd_arc: Arc>> = Arc::new(Mutex::new(filtered_data_2nd)); @@ -262,7 +218,7 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - let final_filtered_data = filtered_data_5th_arc.lock().await.clone(); + let final_filtered_data = duplicate_filter(6, &filtered_data_5th_arc.lock().await.clone()).await?; insert_pre_suggested_coins(6, false, &final_filtered_data, &alldata).await; Ok(())