From bbaf39173d909c9cbda790bd88a2e415b18a3172 Mon Sep 17 00:00:00 2001 From: Sik Yoon Date: Sun, 2 Jun 2024 01:59:41 +0900 Subject: [PATCH] Update filtering --- src/strategy_team/future_strategy_long.rs | 40 ++++++++++++++------- src/strategy_team/future_strategy_short.rs | 40 ++++++++++++++------- src/value_estimation_team/indicators/ema.rs | 2 +- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/strategy_team/future_strategy_long.rs b/src/strategy_team/future_strategy_long.rs index 8e7ab6d..fd6af06 100644 --- a/src/strategy_team/future_strategy_long.rs +++ b/src/strategy_team/future_strategy_long.rs @@ -33,8 +33,8 @@ pub async fn list_up_for_buy( // sma3_close(current) > sma3_open (current), sma3_close(prev) < sma3_open (prev) let mut keys_to_remove: HashSet = HashSet::new(); - let ema10_open = ema_open(10, &alldata.rt_price_30m_vec, &filtered_data).await?; - let ema10_close = ema(10, &alldata.rt_price_30m_vec, &filtered_data).await?; + let ema10_open = ema_open(5, &alldata.rt_price_30m_vec, &filtered_data).await?; + let ema10_close = ema(5, &alldata.rt_price_30m_vec, &filtered_data).await?; let server_epoch = get_server_epoch().await; for (symbol, values) in &mut filtered_data { let mut do_buy = false; @@ -83,7 +83,7 @@ pub async fn list_up_for_buy( // supertrend(ATR period 30, multiplier: 2.0, 30m close price) let mut keys_to_remove: HashSet = HashSet::new(); let supertrend_30m_map = - supertrend(30, 2.0, true, &alldata.rt_price_30m_vec, &filtered_data).await?; + supertrend(100, 1.5, true, &alldata.rt_price_30m_vec, &filtered_data).await?; for (symbol, values) in &mut filtered_data { let mut do_buy = false; if let Some(supertrend_vec) = supertrend_30m_map.get(symbol) @@ -92,13 +92,7 @@ pub async fn list_up_for_buy( && supertrend_vec.last().is_some_and(|a| a.close_time == values.closetime) && supertrend_vec.last().unwrap().area == SuperTrendArea::UP && supertrend_vec[supertrend_vec.len()-2].area == SuperTrendArea::UP { - let a = supertrend_vec.get(supertrend_vec.len()-6..supertrend_vec.len()-1).unwrap(); - for element in a { - if element.signal == Some(SuperTrendSignal::BUY) { - do_buy = true; - break; - } - } + do_buy = true; } } @@ -149,7 +143,7 @@ pub async fn list_up_for_buy( if let Some(wpr100_vec) = wpr100_map.get(symbol) { if wpr100_vec.len() > 15 && wpr100_vec.last().unwrap().close_time > server_epoch - && wpr100_vec.last().unwrap().r_value < -50.0 { + && wpr100_vec.last().unwrap().r_value < -40.0 { do_buy = true; } } @@ -367,9 +361,31 @@ pub async fn list_up_for_sell(all_data: &AllData, futures_exchange_info_map: &Ha is_sell = true; } else if element.pure_profit_percent <= element.stoploss_percent { is_sell = true; - } else if server_epoch - element.close_time > 1_800_000 * 24 { + } + + let minimum_candles = 5; + let maximum_candles = 20; + for count_candles in minimum_candles..=maximum_candles { + if count_candles < maximum_candles + && server_epoch - element.transact_time + > (1_800_000) * count_candles + && (element.target_percent != 0.0 + && element.target_percent + * ((maximum_candles - count_candles) as f64 + / (maximum_candles - minimum_candles + 1) as f64) + <= element.pure_profit_percent) + { + is_sell = true; + break; + } else { + break; + } + } + + if server_epoch - element.close_time > 1_800_000 * maximum_candles { is_sell = true; } + // else if server_epoch - element.close_time > 300_000 && supertrend_1m_map.get(&element.symbol).is_some_and(|a| a.len() > 10 && a.last().is_some_and(|b| b.close_time > server_epoch && b.area == SuperTrendArea::DOWN)) { // is_sell = true; // } else if server_epoch - element.close_time > 300_000 diff --git a/src/strategy_team/future_strategy_short.rs b/src/strategy_team/future_strategy_short.rs index 816bdbe..3ee311e 100644 --- a/src/strategy_team/future_strategy_short.rs +++ b/src/strategy_team/future_strategy_short.rs @@ -33,8 +33,8 @@ pub async fn list_up_for_buy( // sma3_close(current) > sma3_open (current), sma3_close(prev) < sma3_open (prev) let mut keys_to_remove: HashSet = HashSet::new(); - let ema10_open = ema_open(10, &alldata.rt_price_30m_vec, &filtered_data).await?; - let ema10_close = ema(10, &alldata.rt_price_30m_vec, &filtered_data).await?; + let ema10_open = ema_open(5, &alldata.rt_price_30m_vec, &filtered_data).await?; + let ema10_close = ema(5, &alldata.rt_price_30m_vec, &filtered_data).await?; let server_epoch = get_server_epoch().await; for (symbol, values) in &mut filtered_data { let mut do_buy = false; @@ -83,7 +83,7 @@ pub async fn list_up_for_buy( // supertrend(ATR period 30, multiplier: 2.0, 30m close price) let mut keys_to_remove: HashSet = HashSet::new(); let supertrend_30m_map = - supertrend(30, 2.0, true, &alldata.rt_price_30m_vec, &filtered_data).await?; + supertrend(100, 1.5, true, &alldata.rt_price_30m_vec, &filtered_data).await?; for (symbol, values) in &mut filtered_data { let mut do_buy = false; if let Some(supertrend_vec) = supertrend_30m_map.get(symbol) @@ -92,13 +92,7 @@ pub async fn list_up_for_buy( && supertrend_vec.last().is_some_and(|a| a.close_time == values.closetime) && supertrend_vec.last().unwrap().area == SuperTrendArea::DOWN && supertrend_vec[supertrend_vec.len()-2].area == SuperTrendArea::DOWN { - let a = supertrend_vec.get(supertrend_vec.len()-6..supertrend_vec.len()-1).unwrap(); - for element in a { - if element.signal == Some(SuperTrendSignal::SELL) { - do_buy = true; - break; - } - } + do_buy = true; } } @@ -149,7 +143,7 @@ pub async fn list_up_for_buy( if let Some(wpr100_vec) = wpr100_map.get(symbol) { if wpr100_vec.len() > 15 && wpr100_vec.last().unwrap().close_time > server_epoch - && wpr100_vec.last().unwrap().r_value > -50.0 { + && wpr100_vec.last().unwrap().r_value > -60.0 { do_buy = true; } } @@ -374,9 +368,31 @@ pub async fn list_up_for_sell(all_data: &AllData, futures_exchange_info_map: &Ha is_sell = true; } else if element.pure_profit_percent <= element.stoploss_percent { is_sell = true; - } else if server_epoch - element.close_time > 1_800_000 * 24 { + } + + let minimum_candles = 5; + let maximum_candles = 20; + for count_candles in minimum_candles..=maximum_candles { + if count_candles < maximum_candles + && server_epoch - element.transact_time + > (1_800_000) * count_candles + && (element.target_percent != 0.0 + && element.target_percent + * ((maximum_candles - count_candles) as f64 + / (maximum_candles - minimum_candles + 1) as f64) + <= element.pure_profit_percent) + { + is_sell = true; + break; + } else { + break; + } + } + + if server_epoch - element.close_time > 1_800_000 * maximum_candles { is_sell = true; } + // else if server_epoch - element.close_time > 300_000 && supertrend_1m_map.get(&element.symbol).is_some_and(|a| a.len() > 10 && a.last().is_some_and(|b| b.close_time > server_epoch && b.area == SuperTrendArea::UP)) { // is_sell = true; // } else if server_epoch - element.close_time > 300_000 && adx_vec.get(&element.symbol).is_some_and(|a| a.len() > 10 && a.last().is_some_and(|b| b.close_time > server_epoch && b.adx < 15.0)) { diff --git a/src/value_estimation_team/indicators/ema.rs b/src/value_estimation_team/indicators/ema.rs index 071205e..886f579 100644 --- a/src/value_estimation_team/indicators/ema.rs +++ b/src/value_estimation_team/indicators/ema.rs @@ -132,7 +132,7 @@ pub async fn ema_opclo( ema_prev = sma_for_initial_value; for element in partial_vec2 { - ema_t = (1.0 - alpha) * ema_prev + alpha * element.close_price; + ema_t = (1.0 - alpha) * ema_prev + alpha * element.opclo_price; ema_data.ema_value = ema_t; ema_data.close_time = element.close_time;