From 61844671bad5deabffb10cbe9c1c2f177029229f Mon Sep 17 00:00:00 2001 From: Sik Yoon Date: Sat, 13 Jan 2024 19:36:30 +0900 Subject: [PATCH] Delete unnecessary threading --- src/strategy_team/strategy_006.rs | 179 ++++++++++++------------------ 1 file changed, 73 insertions(+), 106 deletions(-) diff --git a/src/strategy_team/strategy_006.rs b/src/strategy_team/strategy_006.rs index 840ef43..7056986 100644 --- a/src/strategy_team/strategy_006.rs +++ b/src/strategy_team/strategy_006.rs @@ -91,76 +91,24 @@ pub async fn list_up_for_buy( // 3rd filtering: the 5 previous ADX(10, 10)s are over 25.0 and increased let filtered_data_2nd = filtered_data_2nd_arc.lock().await.clone(); let mut filtered_data_3rd: Vec = Vec::new(); - let mut filtered_data_3rd_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_3rd)); - let mut task_vec = Vec::new(); - let valid_symbol_vec_c = alldata.valid_symbol_vec.clone(); + let adx_vec = adx(10, 10, &alldata.rt_price_30m_vec, &filtered_data_2nd).await?; for element in filtered_data_2nd { - let mut adx_vec_c = adx_vec.clone(); - let symbol = element.symbol.clone(); - let close_time = element.closetime; - let idx_result = adx_vec.iter().position(|elem| elem.0 == symbol); - let filtered_data_3rd_arc_c = Arc::clone(&filtered_data_3rd_arc); + let idx_result = adx_vec.iter().position(|elem| elem.0 == element.symbol); + if idx_result.is_some(){ - task_vec.push(tokio::spawn(async move { - let closetime_idx_result = adx_vec_c[idx_result.unwrap()].1.iter().position(|elem| elem.close_time==close_time); - if closetime_idx_result.is_some() { - if adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-1].adx > 25.0 && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-2].adx > 25.0 && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-3].adx > 25.0 && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-4].adx > 25.0 && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-5].adx > 25.0 && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-1].adx > adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-2].adx && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-2].adx > adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-3].adx && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-3].adx > adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-4].adx && - adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-4].adx > adx_vec_c[idx_result.unwrap()].1[closetime_idx_result.unwrap()-5].adx { - let mut filtered_3rd_symbols_lock = - filtered_data_3rd_arc_c.lock().await; - let mut filtered_data = FilteredData::new(); - filtered_data.symbol = element.symbol.clone(); - filtered_data.closetime = element.closetime; - filtered_data.current_price = element.current_price; - filtered_data.stoploss = element.stoploss; - filtered_data.target_price = element.target_price; - - filtered_3rd_symbols_lock.push(filtered_data); - } - } - })); - } - } - try_join_all(task_vec).await?; - - // 4th filtering: the latest 5 30m candle close prices > EMA 200 - let filtered_data_3rd = filtered_data_3rd_arc.lock().await.clone(); - let mut filtered_data_4th: Vec = Vec::new(); - let mut filtered_data_4th_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_4th)); - let mut task_vec = Vec::new(); - let ema_vec = ema(200, &alldata.rt_price_30m_vec, &filtered_data_3rd).await?; - for element in filtered_data_3rd { - let mut opclo_30m_vec = alldata.rt_price_30m_vec.clone(); - let mut supertrend_vec: Vec = Vec::new(); - let ema_vec_c = ema_vec.clone(); - let filtered_data_4th_arc_c = Arc::clone(&filtered_data_4th_arc); - task_vec.push(tokio::spawn(async move { - let ema_search_result = ema_vec_c.iter().position(|x| x.0 == element.symbol); - let candle_search_result = opclo_30m_vec.iter().position(|x| x.0 == element.symbol); - if ema_search_result.is_some() && candle_search_result.is_some() { - let search_result = ema_vec_c[ema_search_result.unwrap()].1.binary_search_by_key( - &opclo_30m_vec[candle_search_result.unwrap()].1.last().unwrap().close_time, - |EmaData { - ema_value, - close_time, - }| *close_time); - if search_result.is_ok_and(|x| ema_vec_c[ema_search_result.unwrap()].1[search_result.unwrap()].ema_value < opclo_30m_vec[candle_search_result.unwrap()].1[opclo_30m_vec[candle_search_result.unwrap()].1.len()-1].close_price) && - search_result.is_ok_and(|x| ema_vec_c[ema_search_result.unwrap()].1[search_result.unwrap()-1].ema_value < opclo_30m_vec[candle_search_result.unwrap()].1[opclo_30m_vec[candle_search_result.unwrap()].1.len()-2].close_price) && - search_result.is_ok_and(|x| ema_vec_c[ema_search_result.unwrap()].1[search_result.unwrap()-2].ema_value < opclo_30m_vec[candle_search_result.unwrap()].1[opclo_30m_vec[candle_search_result.unwrap()].1.len()-3].close_price) && - search_result.is_ok_and(|x| ema_vec_c[ema_search_result.unwrap()].1[search_result.unwrap()-3].ema_value < opclo_30m_vec[candle_search_result.unwrap()].1[opclo_30m_vec[candle_search_result.unwrap()].1.len()-4].close_price) && - search_result.is_ok_and(|x| ema_vec_c[ema_search_result.unwrap()].1[search_result.unwrap()-4].ema_value < opclo_30m_vec[candle_search_result.unwrap()].1[opclo_30m_vec[candle_search_result.unwrap()].1.len()-5].close_price) { - let mut filtered_4th_symbols_lock = - filtered_data_4th_arc_c.lock().await; + let closetime_idx_result = adx_vec[idx_result.unwrap()].1.iter().position(|elem| elem.close_time == element.closetime); + if closetime_idx_result.is_some() { + if adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-1].adx > 25.0 && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-2].adx > 25.0 && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-3].adx > 25.0 && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-4].adx > 25.0 && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-5].adx > 25.0 && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-1].adx > adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-2].adx && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-2].adx > adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-3].adx && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-3].adx > adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-4].adx && + adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-4].adx > adx_vec[idx_result.unwrap()].1[closetime_idx_result.unwrap()-5].adx { + let mut filtered_data = FilteredData::new(); filtered_data.symbol = element.symbol.clone(); filtered_data.closetime = element.closetime; @@ -168,57 +116,76 @@ pub async fn list_up_for_buy( filtered_data.stoploss = element.stoploss; filtered_data.target_price = element.target_price; - filtered_4th_symbols_lock.push(filtered_data); + filtered_data_3rd.push(filtered_data); } } - })); + } + } + + // 4th filtering: the latest 5 30m candle close prices > EMA 200 + let mut filtered_data_4th: Vec = Vec::new(); + + let ema_vec = ema(200, &alldata.rt_price_30m_vec, &filtered_data_3rd).await?; + for element in filtered_data_3rd { + let ema_search_result = ema_vec.iter().position(|x| x.0 == element.symbol); + let candle_search_result = alldata.rt_price_30m_vec.iter().position(|x| x.0 == element.symbol); + if ema_search_result.is_some() && candle_search_result.is_some() { + let search_result = ema_vec[ema_search_result.unwrap()].1.binary_search_by_key( + &alldata.rt_price_30m_vec[candle_search_result.unwrap()].1.last().unwrap().close_time, + |EmaData { + ema_value, + close_time, + }| *close_time); + if search_result.is_ok_and(|x| ema_vec[ema_search_result.unwrap()].1[search_result.unwrap()].ema_value < alldata.rt_price_30m_vec[candle_search_result.unwrap()].1[alldata.rt_price_30m_vec[candle_search_result.unwrap()].1.len()-1].close_price) && + search_result.is_ok_and(|x| ema_vec[ema_search_result.unwrap()].1[search_result.unwrap()-1].ema_value < alldata.rt_price_30m_vec[candle_search_result.unwrap()].1[alldata.rt_price_30m_vec[candle_search_result.unwrap()].1.len()-2].close_price) && + search_result.is_ok_and(|x| ema_vec[ema_search_result.unwrap()].1[search_result.unwrap()-2].ema_value < alldata.rt_price_30m_vec[candle_search_result.unwrap()].1[alldata.rt_price_30m_vec[candle_search_result.unwrap()].1.len()-3].close_price) && + search_result.is_ok_and(|x: usize| ema_vec[ema_search_result.unwrap()].1[search_result.unwrap()-3].ema_value < alldata.rt_price_30m_vec[candle_search_result.unwrap()].1[alldata.rt_price_30m_vec[candle_search_result.unwrap()].1.len()-4].close_price) && + search_result.is_ok_and(|x| ema_vec[ema_search_result.unwrap()].1[search_result.unwrap()-4].ema_value < alldata.rt_price_30m_vec[candle_search_result.unwrap()].1[alldata.rt_price_30m_vec[candle_search_result.unwrap()].1.len()-5].close_price) { + + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = element.symbol.clone(); + filtered_data.closetime = element.closetime; + filtered_data.current_price = element.current_price; + filtered_data.stoploss = element.stoploss; + filtered_data.target_price = element.target_price; + + filtered_data_4th.push(filtered_data); + } + } } - try_join_all(task_vec).await?; // 5th filtering: 0.5% <= the average amplitude of the latest 10 30m candles <= 1.0% - let filtered_data_4th_c = filtered_data_4th_arc.lock().await.clone(); let mut filtered_data_5th: Vec = Vec::new(); - let mut filtered_data_5th_arc: Arc>> = - Arc::new(Mutex::new(filtered_data_5th)); - let mut task_vec = Vec::new(); - for element in filtered_data_4th_c { - let mut supertrend_vec: Vec = Vec::new(); - let rt_price_30m_vec_c = alldata.rt_price_30m_vec.clone(); - let filtered_data_5th_arc_c = Arc::clone(&filtered_data_5th_arc); + for element in filtered_data_4th { + let position_idx = alldata.rt_price_30m_vec.iter().position(|elem| elem.0 == element.symbol); + + if position_idx.is_some() { + let vec_len = alldata.rt_price_30m_vec[position_idx.unwrap()].1.len(); + if vec_len >= 11 { + let candles = alldata.rt_price_30m_vec[position_idx.unwrap()].1.get(vec_len-12..vec_len-1).unwrap(); + let windows = candles.windows(2); + let mut average_amplitude = 0.0; - task_vec.push(tokio::spawn(async move { - let position_idx = rt_price_30m_vec_c.iter().position(|elem| elem.0 == element.symbol); - - if position_idx.is_some() { - let vec_len = rt_price_30m_vec_c[position_idx.unwrap()].1.len(); - if vec_len >= 11 { - let candles = rt_price_30m_vec_c[position_idx.unwrap()].1.get(vec_len-12..vec_len-1).unwrap(); - let windows = candles.windows(2); - let mut average_amplitude = 0.0; + for window in windows { + average_amplitude += (window.last().unwrap().high_price - window.last().unwrap().low_price) / window.first().unwrap().close_price; + } + average_amplitude /= 10.0; - for window in windows { - average_amplitude += (window.last().unwrap().high_price - window.last().unwrap().low_price) / window.first().unwrap().close_price; - } - average_amplitude /= 10.0; - - if 0.005 <= average_amplitude && average_amplitude <= 0.01 { - let mut filtered_data_5th_lock = filtered_data_5th_arc_c.lock().await; - let mut filtered_data = FilteredData::new(); - filtered_data.symbol = element.symbol.clone(); - filtered_data.closetime = element.closetime; - filtered_data.current_price = element.current_price; - filtered_data.stoploss = element.stoploss; - filtered_data.target_price = element.target_price; - - filtered_data_5th_lock.push(filtered_data); - } + if 0.005 <= average_amplitude && average_amplitude <= 0.01 { + let mut filtered_data = FilteredData::new(); + filtered_data.symbol = element.symbol.clone(); + filtered_data.closetime = element.closetime; + filtered_data.current_price = element.current_price; + filtered_data.stoploss = element.stoploss; + filtered_data.target_price = element.target_price; + + filtered_data_5th.push(filtered_data); } } - })); + } } - try_join_all(task_vec).await?; - let final_filtered_data = duplicate_filter(6, &filtered_data_5th_arc.lock().await.clone()).await?; + let final_filtered_data = duplicate_filter(6, &filtered_data_5th).await?; insert_pre_suggested_coins(6, false, &final_filtered_data, &alldata).await; Ok(())