diff --git a/src/strategy_team/strategy_004.rs b/src/strategy_team/strategy_004.rs index 3bc1f78..a09fa5b 100644 --- a/src/strategy_team/strategy_004.rs +++ b/src/strategy_team/strategy_004.rs @@ -68,7 +68,7 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - // 2nd filtering: supertrend(ATR period 10, multiplier: 1.1, 30m close price), signal should be BUY + // 2nd filtering: supertrend(ATR period 10, multiplier: 1.2, 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>> = @@ -85,7 +85,7 @@ pub async fn list_up_for_buy( .iter() .position(|x| *x.0 == element.symbol); let supertrend_option_30m = - supertrend(&element.symbol, &rt_price_30m_vec_c, 10, 1.1, true).await; + supertrend(&element.symbol, &rt_price_30m_vec_c, 10, 1.2, true).await; if rt_30m_option.is_some() && supertrend_option_30m.is_some() { rt_30m_vec = rt_price_30m_vec_c[rt_30m_option.unwrap()].1.clone(); @@ -319,6 +319,51 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; + // 7th filtering: ema3_30m < ema5_30m latest 3 candles + let filtered_data_6th_c = filtered_data_6th_arc.lock().await.clone(); + let mut filtered_data_7th: Vec = Vec::new(); + let mut filtered_data_7th_arc: Arc>> = + Arc::new(Mutex::new(filtered_data_7th)); + let mut task_vec = Vec::new(); + let ema3_30m_data = ema(3, &alldata.rt_price_30m_vec, &filtered_data_6th_c).await?; + let ema5_30m_data = ema(5, &alldata.rt_price_30m_vec, &filtered_data_6th_c).await?; + for element in filtered_data_6th_c { + let filtered_data_7th_arc_c = Arc::clone(&filtered_data_7th_arc); + let ema3_30m_data_c = ema3_30m_data.clone(); + let ema5_30m_data_c = ema5_30m_data.clone(); + + task_vec.push(tokio::spawn(async move { + let ema3_idx = ema3_30m_data_c.iter().position(|elem| elem.0 == element.symbol); + let ema5_idx = ema5_30m_data_c.iter().position(|elem| elem.0 == element.symbol); + + if ema3_idx.is_some() && ema5_idx.is_some() { + let ema3_30m = &ema3_30m_data_c[ema3_idx.unwrap()].1; + let ema5_30m = &ema5_30m_data_c[ema3_idx.unwrap()].1; + + let ema3_close_time_idx = ema3_30m.iter().position(|elem| elem.close_time == element.closetime); + let ema5_close_time_idx = ema5_30m.iter().position(|elem| elem.close_time == element.closetime); + + if ema3_30m.len() >= 5 && ema5_30m.len() >= 5 && ema3_close_time_idx.is_some() && ema5_close_time_idx.is_some() { + if ema3_30m[ema3_close_time_idx.unwrap()-1].ema_value < ema5_30m[ema5_close_time_idx.unwrap()-1].ema_value || + ema3_30m[ema3_close_time_idx.unwrap()-2].ema_value < ema5_30m[ema5_close_time_idx.unwrap()-2].ema_value || + ema3_30m[ema3_close_time_idx.unwrap()-3].ema_value < ema5_30m[ema5_close_time_idx.unwrap()-3].ema_value { + let mut filtered_data_7th_lock = filtered_data_7th_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_7th_lock.push(filtered_data); + } + + } + } + })); + } + try_join_all(task_vec).await?; + // // 4th filtering: StochRSI (RSI length: 3, Stoch length: 3, smooth k: 3, smooth d: 3) 80 > k > kn-1 // let filtered_4th_symbol_c = filtered_data_4th_arc.lock().await.clone(); // let mut rsi10_1d_data: Vec<(String, Vec)> = @@ -401,7 +446,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 = filtered_data_7th_arc.lock().await.clone(); insert_pre_suggested_coins(4, false, &final_filtered_data, &alldata).await; Ok(()) diff --git a/src/value_estimation_team/indicators/ema.rs b/src/value_estimation_team/indicators/ema.rs index dc2bb56..7d3bf0d 100644 --- a/src/value_estimation_team/indicators/ema.rs +++ b/src/value_estimation_team/indicators/ema.rs @@ -8,6 +8,7 @@ use serde::Deserialize; use sqlx::FromRow; use std::sync::Arc; use tokio::{fs::*, io::AsyncWriteExt, sync::Mutex, time::*}; +use super::FilteredData; #[derive(Clone, Debug)] pub struct EmaData { @@ -28,7 +29,7 @@ impl EmaData { pub async fn ema( moving_number: usize, input_rt_data: &Vec<(String, Vec)>, - filtered_symbols: &Vec<(String, i64)>, + filtered_symbols: &Vec, ) -> Result)>, Box> { if filtered_symbols.is_empty() { Err("Err")?; @@ -41,13 +42,13 @@ pub async fn ema( let mut ema_data_wrapper: Vec<(String, Vec)> = Vec::new(); let mut ema_data_wrapper_arc = Arc::new(Mutex::new(ema_data_wrapper)); let mut task_vec = Vec::new(); - for symbol in filtered_symbols { - let symbol_search_result = input_rt_data.iter().position(|x| x.0 == *symbol.0); + for filtered_elem in filtered_symbols { + let symbol_search_result = input_rt_data.iter().position(|x| x.0 == *filtered_elem.symbol); match symbol_search_result { Some(T) => { let ema_data_wrapper_arc_c = Arc::clone(&ema_data_wrapper_arc); - let symbol_c = symbol.clone(); + let filtered_elem_c = filtered_elem.clone(); let mut ema_data = EmaData::new(); let mut ema_data_vec: Vec = Vec::new(); let input_rt_data_c = input_rt_data.clone(); @@ -83,7 +84,7 @@ pub async fn ema( } } let mut ema_data_wrapper_lock = ema_data_wrapper_arc_c.lock().await; - ema_data_wrapper_lock.push((symbol_c.0.clone(), ema_data_vec.clone())); + ema_data_wrapper_lock.push((filtered_elem_c.symbol.clone(), ema_data_vec.clone())); })); } None => {} diff --git a/src/value_estimation_team/indicators/mod.rs b/src/value_estimation_team/indicators/mod.rs index df13d54..29cae2a 100644 --- a/src/value_estimation_team/indicators/mod.rs +++ b/src/value_estimation_team/indicators/mod.rs @@ -7,3 +7,5 @@ pub mod sma; pub mod stoch_rsi; pub mod supertrend; pub mod tema; + +use crate::strategy_team::FilteredData;