From 5858b976674b3cd619f4297805818b4c853a4cee Mon Sep 17 00:00:00 2001 From: Sik Yoon Date: Sun, 31 Dec 2023 19:35:15 +0900 Subject: [PATCH] Change filtering --- src/coex/order_team.rs | 11 ++++++++ src/strategy_team/strategy_005.rs | 40 ++++++++++----------------- src/strategy_team/strategy_006.rs | 40 ++++++++++----------------- src/strategy_team/strategy_manager.rs | 9 +++--- 4 files changed, 46 insertions(+), 54 deletions(-) diff --git a/src/coex/order_team.rs b/src/coex/order_team.rs index c73bc8a..8760f0e 100644 --- a/src/coex/order_team.rs +++ b/src/coex/order_team.rs @@ -66,6 +66,7 @@ pub struct BuyOrderedCoinList { pub pure_profit_percent: f64, pub minimum_profit_percent: f64, pub maximum_profit_percent: f64, + pub sell_count: u16, pub registerer: u16, pub is_long: u8, } @@ -89,6 +90,7 @@ pub struct SellOrderedCoinList { pub base_qty_ordered: Decimal, pub pure_profit_percent: Decimal, pub maximum_profit_percent: f64, + pub sell_count: u16, pub registerer: u16, pub is_long: u8, } @@ -132,6 +134,7 @@ impl DBlist for SellOrderedCoinList { base_qty_ordered: Decimal::new(0, 8), pure_profit_percent: Decimal::new(0, 8), maximum_profit_percent: 0.0, + sell_count: 0, registerer: 0, is_long: 0, }; @@ -160,6 +163,7 @@ impl DBlist for BuyOrderedCoinList { pure_profit_percent: 0.0, minimum_profit_percent: 0.0, maximum_profit_percent: 0.0, + sell_count: 0, registerer: 0, is_long: 0, }; @@ -326,6 +330,7 @@ pub async fn limit_order_buy( "pure_profit_percent", "minimum_profit_percent", "maximum_profit_percent", + "sell_count", "registerer", "is_long", ]; @@ -350,6 +355,7 @@ pub async fn limit_order_buy( insert_value_container.push(0.0.to_string()); // pure_profit_percent insert_value_container.push(0.0.to_string()); // minimum_profit_percent insert_value_container.push(0.0.to_string()); // maximum_profit_percent + insert_value_container.push(0.to_string()); // registerer insert_value_container.push(element.registerer.to_string()); // registerer insert_value_container.push(0.to_string()); // is_long @@ -480,6 +486,7 @@ pub async fn limit_order_buy( insert_value_container.push(0.0.to_string()); // pure_profit_percent insert_value_container.push(0.0.to_string()); // minimum_profit_percent insert_value_container.push(0.0.to_string()); // maximum_profit_percent + insert_value_container.push(0.to_string()); // sell_count insert_value_container.push(element.registerer.to_string()); // registerer insert_value_container.push(0.to_string()); // is_long @@ -718,6 +725,7 @@ pub async fn limit_order_sell( "base_qty_ordered", "pure_profit_percent", "maximum_profit_percent", + "sell_count", "registerer", "is_long", ]; @@ -1337,6 +1345,7 @@ pub async fn cancel_sell_order( "pure_profit_percent", "minimum_profit_percent", "maximum_profit_percent", + "sell_count", "registerer", "is_long", ]; @@ -1381,6 +1390,7 @@ pub async fn cancel_sell_order( insert_value_container.push(0.0.to_string()); // pure_profit_percent insert_value_container.push(0.0.to_string()); // minimum_profit_percent insert_value_container.push(order.maximum_profit_percent.to_string()); // maximum_profit_percent + insert_value_container.push(order.sell_count.to_string()); // sell_count insert_value_container.push(order.registerer.to_string()); // registerer insert_value_container.push(order.is_long.to_string()); // is_long @@ -1531,6 +1541,7 @@ pub async fn cancel_sell_order( insert_value_container.push(0.0.to_string()); // pure_profit_percent insert_value_container.push(0.0.to_string()); // minimum_profit_percent insert_value_container.push(0.0.to_string()); // maximum_profit_percent + insert_value_container.push(order.sell_count.to_string()); // sell_count insert_value_container.push(order.registerer.to_string()); // registerer insert_value_container.push(order.is_long.to_string()); // is_long diff --git a/src/strategy_team/strategy_005.rs b/src/strategy_team/strategy_005.rs index a66f4b4..4442f69 100644 --- a/src/strategy_team/strategy_005.rs +++ b/src/strategy_team/strategy_005.rs @@ -2,7 +2,7 @@ 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 + RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd }; // Triple SuperTrend strategy @@ -168,42 +168,32 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - // 4th filtering: supertrend(ATR period 3, multiplier: 1.05, 1d close price), the area should be in UP area. + // 4th filtering: MACD 1d (fast:3, slow:7, smoothing:3) MACD > signal 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 valid_symbol_vec_c = alldata.valid_symbol_vec.clone(); + let macd_vec = ema_macd(3, 7, 3, &alldata.rt_price_1d_vec, &filtered_data_3rd).await?; for element in filtered_data_3rd { let mut opclo_1d_vec: Vec = Vec::new(); let mut supertrend_vec: Vec = Vec::new(); - let rt_price_1d_vec_c = alldata.rt_price_1d_vec.clone(); + let macd_vec_c = macd_vec.clone(); let filtered_data_4th_arc_c = Arc::clone(&filtered_data_4th_arc); task_vec.push(tokio::spawn(async move { - let supertrend_option_1d = - supertrend(&element.symbol, &rt_price_1d_vec_c, 3, 1.05, true).await; + let search_result = macd_vec_c.iter().position(|x| x.0 == element.symbol); - if supertrend_option_1d.is_some() { - supertrend_vec = supertrend_option_1d.unwrap(); + 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 = + 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; - if supertrend_vec.len() >= 3 { - if supertrend_vec.last().unwrap() - .area - .contains("UP") - { - 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; - - 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 ccfeb8a..9d22e4e 100644 --- a/src/strategy_team/strategy_006.rs +++ b/src/strategy_team/strategy_006.rs @@ -2,7 +2,7 @@ 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 + RealtimePriceData, RoundingStrategy, RsiData, StochRsiData, SupertrendData, TradeFee, update_record3, adx, AdxData, server_epoch, MacdData, ema_macd }; // Triple SuperTrend strategy @@ -176,42 +176,32 @@ pub async fn list_up_for_buy( } try_join_all(task_vec).await?; - // 4th filtering: supertrend(ATR period 3, multiplier: 1.05, 1d close price), the area should be in UP area. + // 4th filtering: MACD 1d (fast:3, slow:7, smoothing:3) MACD > signal 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 valid_symbol_vec_c = alldata.valid_symbol_vec.clone(); + let macd_vec = ema_macd(3, 7, 3, &alldata.rt_price_1d_vec, &filtered_data_3rd).await?; for element in filtered_data_3rd { let mut opclo_1d_vec: Vec = Vec::new(); let mut supertrend_vec: Vec = Vec::new(); - let rt_price_1d_vec_c = alldata.rt_price_1d_vec.clone(); + let macd_vec_c = macd_vec.clone(); let filtered_data_4th_arc_c = Arc::clone(&filtered_data_4th_arc); task_vec.push(tokio::spawn(async move { - let supertrend_option_1d = - supertrend(&element.symbol, &rt_price_1d_vec_c, 3, 1.05, true).await; + let search_result = macd_vec_c.iter().position(|x| x.0 == element.symbol); - if supertrend_option_1d.is_some() { - supertrend_vec = supertrend_option_1d.unwrap(); + 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 = + 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; - if supertrend_vec.len() >= 3 { - if supertrend_vec.last().unwrap() - .area - .contains("UP") - { - 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; - - 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 1e26121..fc59581 100644 --- a/src/strategy_team/strategy_manager.rs +++ b/src/strategy_team/strategy_manager.rs @@ -37,7 +37,7 @@ pub async fn execute_list_up_for_buy( // let all_data_c4 = all_data.clone(); let all_data_c5 = all_data.clone(); let all_data_c6 = all_data.clone(); - let all_data_ct = all_data.clone(); + // strategist_001(all_data).await?; // strategist_002(all_data).await?; // task_vec.push(tokio::spawn(async move { @@ -52,9 +52,10 @@ pub async fn execute_list_up_for_buy( 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_test::strategist_test(all_data_ct).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; + // })); try_join_all(task_vec).await?; Ok(())