From ae12688b5fb3cb6f53687e4b34bcef7d4fb129a9 Mon Sep 17 00:00:00 2001 From: Sik Yoon Date: Mon, 8 Jan 2024 20:09:19 +0900 Subject: [PATCH] Change filtering --- src/strategy_team/strategy_004.rs | 42 +++++++++++++-------- src/strategy_team/strategy_005.rs | 43 +++++++++++++-------- src/strategy_team/strategy_006.rs | 42 +++++++++++++-------- src/strategy_team/strategy_manager.rs | 54 +++++++++++++-------------- 4 files changed, 109 insertions(+), 72 deletions(-) diff --git a/src/strategy_team/strategy_004.rs b/src/strategy_team/strategy_004.rs index 1242b8f..2d793b5 100644 --- a/src/strategy_team/strategy_004.rs +++ b/src/strategy_team/strategy_004.rs @@ -180,32 +180,44 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - // 4th filtering: MACD 1d (fast:3, slow:7, smoothing:3) MACD > signal + // 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 macd_vec = ema_macd(3, 7, 3, &alldata.rt_price_1d_vec, &filtered_data_3rd).await?; + let ema_vec = ema(200, &alldata.rt_price_30m_vec, &filtered_data_3rd).await?; for element in filtered_data_3rd { - let mut opclo_1d_vec: Vec = Vec::new(); + let mut opclo_30m_vec = alldata.rt_price_30m_vec.clone(); let mut supertrend_vec: Vec = Vec::new(); - let macd_vec_c = macd_vec.clone(); + 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 search_result = macd_vec_c.iter().position(|x| x.0 == element.symbol); - - if search_result.is_some_and(|a| macd_vec_c[a].1.last().unwrap().macd_value > macd_vec_c[a].1.last().unwrap().signal_value) { - let mut filtered_4th_symbols_lock = + 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 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; + 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_4th_symbols_lock.push(filtered_data); + filtered_4th_symbols_lock.push(filtered_data); + } } })); } diff --git a/src/strategy_team/strategy_005.rs b/src/strategy_team/strategy_005.rs index 4442f69..22d9116 100644 --- a/src/strategy_team/strategy_005.rs +++ b/src/strategy_team/strategy_005.rs @@ -8,6 +8,7 @@ use super::{ // Triple SuperTrend strategy // SuperTrend length: 20, multiplier: 1.5, BUY signal // ADX(10, 10) < 25.0 +// the latest 5 candle close prices > EMA 200 pub async fn list_up_for_buy( alldata: AllData, ) -> Result<(), Box> { @@ -168,32 +169,44 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - // 4th filtering: MACD 1d (fast:3, slow:7, smoothing:3) MACD > signal + // 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 macd_vec = ema_macd(3, 7, 3, &alldata.rt_price_1d_vec, &filtered_data_3rd).await?; + let ema_vec = ema(200, &alldata.rt_price_30m_vec, &filtered_data_3rd).await?; for element in filtered_data_3rd { - let mut opclo_1d_vec: Vec = Vec::new(); + let mut opclo_30m_vec = alldata.rt_price_30m_vec.clone(); let mut supertrend_vec: Vec = Vec::new(); - let macd_vec_c = macd_vec.clone(); + 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 search_result = macd_vec_c.iter().position(|x| x.0 == element.symbol); - - if search_result.is_some_and(|a| macd_vec_c[a].1.last().unwrap().macd_value > macd_vec_c[a].1.last().unwrap().signal_value) { - let mut filtered_4th_symbols_lock = + 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 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; + 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_4th_symbols_lock.push(filtered_data); + filtered_4th_symbols_lock.push(filtered_data); + } } })); } diff --git a/src/strategy_team/strategy_006.rs b/src/strategy_team/strategy_006.rs index 9d22e4e..3670377 100644 --- a/src/strategy_team/strategy_006.rs +++ b/src/strategy_team/strategy_006.rs @@ -176,32 +176,44 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - // 4th filtering: MACD 1d (fast:3, slow:7, smoothing:3) MACD > signal + // 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 macd_vec = ema_macd(3, 7, 3, &alldata.rt_price_1d_vec, &filtered_data_3rd).await?; + let ema_vec = ema(200, &alldata.rt_price_30m_vec, &filtered_data_3rd).await?; for element in filtered_data_3rd { - let mut opclo_1d_vec: Vec = Vec::new(); + let mut opclo_30m_vec = alldata.rt_price_30m_vec.clone(); let mut supertrend_vec: Vec = Vec::new(); - let macd_vec_c = macd_vec.clone(); + 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 search_result = macd_vec_c.iter().position(|x| x.0 == element.symbol); - - if search_result.is_some_and(|a| macd_vec_c[a].1.last().unwrap().macd_value > macd_vec_c[a].1.last().unwrap().signal_value) { - let mut filtered_4th_symbols_lock = + 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 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; + 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_4th_symbols_lock.push(filtered_data); + filtered_4th_symbols_lock.push(filtered_data); + } } })); } diff --git a/src/strategy_team/strategy_manager.rs b/src/strategy_team/strategy_manager.rs index e61115a..7228405 100644 --- a/src/strategy_team/strategy_manager.rs +++ b/src/strategy_team/strategy_manager.rs @@ -33,9 +33,9 @@ pub async fn execute_list_up_for_buy( all_data: &AllData, ) -> Result<(), Box> { let mut task_vec = Vec::new(); - let all_data_c3 = all_data.clone(); + // let all_data_c3 = all_data.clone(); let all_data_c4 = all_data.clone(); - // let all_data_c5 = all_data.clone(); + let all_data_c5 = all_data.clone(); let all_data_c6 = all_data.clone(); // strategist_001(all_data).await?; @@ -49,12 +49,12 @@ pub async fn execute_list_up_for_buy( task_vec.push(tokio::spawn(async move { crate::strategy_team::strategy_004::list_up_for_buy(all_data_c4).await; })); - // task_vec.push(tokio::spawn(async move { - // crate::strategy_team::strategy_005::list_up_for_buy(all_data_c5).await; - // })); - // task_vec.push(tokio::spawn(async move { - // crate::strategy_team::strategy_006::list_up_for_buy(all_data_c6).await; - // })); + task_vec.push(tokio::spawn(async move { + crate::strategy_team::strategy_005::list_up_for_buy(all_data_c5).await; + })); + task_vec.push(tokio::spawn(async move { + crate::strategy_team::strategy_006::list_up_for_buy(all_data_c6).await; + })); // let all_data_ct = all_data.clone(); // task_vec.push(tokio::spawn(async move { // crate::strategy_team::strategy_test::strategist_test(all_data_ct).await; @@ -69,15 +69,15 @@ pub async fn execute_list_up_for_sell( exchange_info_vec: &Vec, trade_fee_vec: &Vec, ) -> Result<(), Box> { - let all_data_c3 = all_data.clone(); + // let all_data_c3 = all_data.clone(); let all_data_c4 = all_data.clone(); let all_data_c5 = all_data.clone(); let all_data_c6 = all_data.clone(); - let exchange_info_vec_c3 = exchange_info_vec.clone(); + // let exchange_info_vec_c3 = exchange_info_vec.clone(); let exchange_info_vec_c4 = exchange_info_vec.clone(); let exchange_info_vec_c5 = exchange_info_vec.clone(); let exchange_info_vec_c6 = exchange_info_vec.clone(); - let trade_fee_vec_c3 = trade_fee_vec.clone(); + // let trade_fee_vec_c3 = trade_fee_vec.clone(); let trade_fee_vec_c4 = trade_fee_vec.clone(); let trade_fee_vec_c5 = trade_fee_vec.clone(); let trade_fee_vec_c6 = trade_fee_vec.clone(); @@ -101,23 +101,23 @@ pub async fn execute_list_up_for_sell( .await; })); - // task_vec.push(tokio::spawn(async move { - // crate::strategy_team::strategy_005::list_up_for_sell( - // &all_data_c5, - // &exchange_info_vec_c5, - // &trade_fee_vec_c5, - // ) - // .await; - // })); + task_vec.push(tokio::spawn(async move { + crate::strategy_team::strategy_005::list_up_for_sell( + &all_data_c5, + &exchange_info_vec_c5, + &trade_fee_vec_c5, + ) + .await; + })); - // task_vec.push(tokio::spawn(async move { - // crate::strategy_team::strategy_006::list_up_for_sell( - // &all_data_c6, - // &exchange_info_vec_c6, - // &trade_fee_vec_c6, - // ) - // .await; - // })); + task_vec.push(tokio::spawn(async move { + crate::strategy_team::strategy_006::list_up_for_sell( + &all_data_c6, + &exchange_info_vec_c6, + &trade_fee_vec_c6, + ) + .await; + })); try_join_all(task_vec).await?; Ok(())