diff --git a/src/strategy_team/strategy_008.rs b/src/strategy_team/strategy_008.rs index c640241..b1bc12b 100644 --- a/src/strategy_team/strategy_008.rs +++ b/src/strategy_team/strategy_008.rs @@ -70,26 +70,6 @@ pub async fn list_up_for_buy( } remove_keys(&mut filtered_data, keys_to_remove).await; - // current ADX(10, 10) < 25 - let mut keys_to_remove: HashSet = HashSet::new(); - let adx_vec = adx(10, 10, &alldata.rt_price_30m_vec, &filtered_data).await?; - for (symbol, values) in &mut filtered_data { - if let Some(adx_vec) = adx_vec.get(symbol) { - if let Some(last_idx) = adx_vec.iter().position(|elem| elem.close_time == values.closetime) { - if adx_vec.len() > 10 && - adx_vec[last_idx].adx < 25.0 { - } else { - keys_to_remove.insert(symbol.clone()); - } - } else { - keys_to_remove.insert(symbol.clone()); - } - } else { - keys_to_remove.insert(symbol.clone()); - } - } - remove_keys(&mut filtered_data, keys_to_remove).await; - // supertrend(ATR period 10, multiplier: 2.0, 30m close price) let mut keys_to_remove: HashSet = HashSet::new(); let server_epoch = get_server_epoch().await; @@ -131,9 +111,29 @@ pub async fn list_up_for_buy( } remove_keys(&mut filtered_data, keys_to_remove).await; - // StochRSI (RSI_len: 15, StochRSI_len: 15, K: 3, D: 3) K_current < 70, K_current > d_current + // current ADX(15, 15) < 25 let mut keys_to_remove: HashSet = HashSet::new(); - let stoch_rsis = stoch_rsi(15, 15, 3, 3, &alldata.rt_price_30m_vec, &filtered_data).await?; + let adx_vec = adx(15, 15, &alldata.rt_price_30m_vec, &filtered_data).await?; + for (symbol, values) in &mut filtered_data { + if let Some(adx_vec) = adx_vec.get(symbol) { + if let Some(last_idx) = adx_vec.iter().position(|elem| elem.close_time == values.closetime) { + if adx_vec.len() > 10 && + adx_vec[last_idx].adx < 25.0 { + } else { + keys_to_remove.insert(symbol.clone()); + } + } else { + keys_to_remove.insert(symbol.clone()); + } + } else { + keys_to_remove.insert(symbol.clone()); + } + } + remove_keys(&mut filtered_data, keys_to_remove).await; + + // StochRSI (RSI_len: 30, StochRSI_len: 30, K: 3, D: 3) K_current < 70, K_current > d_current + let mut keys_to_remove: HashSet = HashSet::new(); + let stoch_rsis = stoch_rsi(30, 30, 3, 3, &alldata.rt_price_30m_vec, &filtered_data).await?; for (symbol, values) in &mut filtered_data { if stoch_rsis.contains_key(symbol) { let stoch_rsi_vec = stoch_rsis.get(symbol).unwrap(); @@ -212,11 +212,23 @@ pub async fn list_up_for_sell( filtered_symbols.insert(element.symbol.clone(), FilteredDataValue::new()); } let supertrend_30m = supertrend(10, 2.0, true, &all_data.rt_price_30m_vec, &filtered_symbols).await?; + let dema_30 = dema(30, &all_data.rt_price_30m_vec, &filtered_symbols).await?; + let tema_10 = tema(10, &all_data.rt_price_30m_vec, &filtered_symbols).await?; for element in filled_buy_orders { let mut is_sell = false; - - - if element.used_usdt >= dec!(10.0) { + let mut is_overturned = false; + if element.used_usdt >= dec!(10.0) { + if let (Some(dema_vec), Some(tema_vec)) = (dema_30.get(&element.symbol), tema_10.get(&element.symbol)) { + if dema_vec.len() > 2 && tema_vec.len() > 2 && + dema_vec.last().unwrap().close_time == tema_vec.last().unwrap().close_time && + dema_vec.last().unwrap().close_time > server_epoch && + tema_vec.last().unwrap().close_time > server_epoch && + dema_vec.last().unwrap().dema_value > tema_vec.last().unwrap().tema_value && + dema_vec[dema_vec.len()-2].dema_value < tema_vec[tema_vec.len()-2].tema_value { + is_overturned = true; + } + } + if let (Some(exchange_info), Some(tradefee), Some(supertrend_vec)) = (exchange_info_map.get(&element.symbol), trade_fee_map.get(&element.symbol), supertrend_30m.get(&element.symbol)) { // update stoploss @@ -256,22 +268,39 @@ pub async fn list_up_for_sell( is_sell = true; } else if element.current_price >= element.target_price { is_sell = true; + } else if server_epoch - element.transact_time > (1_800_000) * 1 && is_overturned == true { + is_sell = true; } else if server_epoch - element.transact_time > (1_800_000) * 5 && - (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (5.0/6.0) <= element.pure_profit_percent) { + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (10.0/11.0) <= element.pure_profit_percent) { is_sell = true; } else if server_epoch - element.transact_time > (1_800_000) * 6 && - (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (4.0/6.0) <= element.pure_profit_percent) { + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (9.0/11.0) <= element.pure_profit_percent) { is_sell = true; } else if server_epoch - element.transact_time > (1_800_000) * 7 && - (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (3.0/6.0) <= element.pure_profit_percent) { + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (8.0/11.0) <= element.pure_profit_percent) { is_sell = true; } else if server_epoch - element.transact_time > (1_800_000) * 8 && - (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (2.0/6.0) <= element.pure_profit_percent) { + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (7.0/11.0) <= element.pure_profit_percent) { is_sell = true; } else if server_epoch - element.transact_time > (1_800_000) * 9 && - (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (1.0/6.0) <= element.pure_profit_percent) { + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (6.0/11.0) <= element.pure_profit_percent) { is_sell = true; - } else if server_epoch - element.transact_time > (1_800_000) * 10 { // time up selling + } else if server_epoch - element.transact_time > (1_800_000) * 10 && + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (5.0/11.0) <= element.pure_profit_percent) { + is_sell = true; + } else if server_epoch - element.transact_time > (1_800_000) * 11 && + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (4.0/11.0) <= element.pure_profit_percent) { + is_sell = true; + } else if server_epoch - element.transact_time > (1_800_000) * 12 && + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (3.0/11.0) <= element.pure_profit_percent) { + is_sell = true; + } else if server_epoch - element.transact_time > (1_800_000) * 13 && + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (2.0/11.0) <= element.pure_profit_percent) { + is_sell = true; + } else if server_epoch - element.transact_time > (1_800_000) * 14 && + (target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent * (1.0/11.0) <= element.pure_profit_percent) { + is_sell = true; + } else if server_epoch - element.transact_time > (1_800_000) * 15 { // time up selling is_sell = true; } // TODO: sell_count가 1일 때 적용하기