diff --git a/src/strategy_team/future_strategy_long.rs b/src/strategy_team/future_strategy_long.rs index 09e8757..7e7cad2 100644 --- a/src/strategy_team/future_strategy_long.rs +++ b/src/strategy_team/future_strategy_long.rs @@ -31,29 +31,56 @@ pub async fn list_up_for_buy( } // current Tema(15) > current Tema(30) + // let mut keys_to_remove: HashSet = HashSet::new(); + // let tema_15 = tema(15, &alldata.rt_price_1m_vec, &filtered_data).await?; + // let tema_30 = tema(30, &alldata.rt_price_1m_vec, &filtered_data).await?; + // let server_epoch = get_server_epoch().await; + // for (symbol, values) in &mut filtered_data { + // let mut do_buy = false; + // let price_and_closetime = get_current_price_decimal(&symbol, &alldata.rt_price_1m_vec).await; + // if let (Some(tema15_vec), Some(tema30_vec), Some(current_info)) = (tema_15.get(symbol), tema_30.get(symbol), price_and_closetime) { + // if tema15_vec.len() > 10 + // && tema30_vec.len() > 10 + // && tema15_vec.last().unwrap().close_time == tema30_vec.last().unwrap().close_time + // && tema15_vec.last().unwrap().close_time > server_epoch + // && tema30_vec.last().unwrap().close_time > server_epoch + // { + // if tema15_vec[tema15_vec.len()-1].tema_value < tema15_vec[tema15_vec.len()-2].tema_value + // && tema15_vec[tema15_vec.len()-1].tema_value < tema15_vec[tema15_vec.len()-3].tema_value + // && tema15_vec[tema15_vec.len()-2].tema_value > tema15_vec[tema15_vec.len()-3].tema_value { + // values.closetime = current_info.1; + // values.current_price = current_info.0; + // do_buy = true; + // } + // } + // } + // if do_buy == false { + // keys_to_remove.insert(symbol.clone()); + // } + // } + // remove_keys(&mut filtered_data, keys_to_remove).await; + + // supertrend(ATR period 10, multiplier: 3.0, 30m close price) let mut keys_to_remove: HashSet = HashSet::new(); - let tema_15 = tema(15, &alldata.rt_price_1m_vec, &filtered_data).await?; - let tema_30 = tema(30, &alldata.rt_price_1m_vec, &filtered_data).await?; let server_epoch = get_server_epoch().await; + let supertrend_1m_map = + supertrend(60, 1.5, true, &alldata.rt_price_1m_vec, &filtered_data).await?; for (symbol, values) in &mut filtered_data { let mut do_buy = false; let price_and_closetime = get_current_price_decimal(&symbol, &alldata.rt_price_1m_vec).await; - if let (Some(tema15_vec), Some(tema30_vec), Some(current_info)) = (tema_15.get(symbol), tema_30.get(symbol), price_and_closetime) { - if tema15_vec.len() > 10 - && tema30_vec.len() > 10 - && tema15_vec.last().unwrap().close_time == tema30_vec.last().unwrap().close_time - && tema15_vec.last().unwrap().close_time > server_epoch - && tema30_vec.last().unwrap().close_time > server_epoch + if let (Some(supertrend_vec), Some(current_info)) = ( + supertrend_1m_map.get(symbol), + price_and_closetime, + ) { + if supertrend_vec.last().unwrap().close_time > current_info.1 + && supertrend_vec.last().unwrap().signal.as_ref().is_some_and(|a| *a == SuperTrendSignal::BUY) { - if tema15_vec[tema15_vec.len()-1].tema_value < tema15_vec[tema15_vec.len()-2].tema_value - && tema15_vec[tema15_vec.len()-1].tema_value < tema15_vec[tema15_vec.len()-3].tema_value - && tema15_vec[tema15_vec.len()-2].tema_value > tema15_vec[tema15_vec.len()-3].tema_value { - values.closetime = current_info.1; - values.current_price = current_info.0; - do_buy = true; - } - } + values.current_price = current_info.0; + values.closetime = current_info.1; + do_buy = true; + } } + if do_buy == false { keys_to_remove.insert(symbol.clone()); } @@ -61,42 +88,38 @@ pub async fn list_up_for_buy( remove_keys(&mut filtered_data, keys_to_remove).await; // Heatmap volume: filtering close price with Extra High is over the previous candle from 30 previous candles - // let mut keys_to_remove: HashSet = HashSet::new(); - // let heatmap_volumes = heatmap_volume( - // 60, - // 60, - // 4.0, - // 2.5, - // 1.0, - // -0.5, - // &filtered_data, - // &alldata.rt_price_1m_vec, - // ) - // .await?; - // let server_epoch = get_server_epoch().await; - // for (symbol, values) in &mut filtered_data { - // let mut do_buy = false; - // if let (Some(heatmap_volume_vec), Some(rt_price_vec), Some(rt_price_vec_30m)) = (heatmap_volumes.get(symbol), alldata.rt_price_1m_vec.get(symbol), alldata.rt_price_30m_vec.get(symbol)) { - // if heatmap_volume_vec.len() > 100 - // && heatmap_volume_vec.last().unwrap().close_time > server_epoch - // && rt_price_vec.last().unwrap().close_time == heatmap_volume_vec.last().unwrap().close_time - // && heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh - // && rt_price_vec[rt_price_vec.len()-2].candle_type == CandleType::DOWN { - // let current_price: Decimal = rust_decimal::prelude::FromPrimitive::from_f64( - // rt_price_vec_30m.last().unwrap().close_price, - // ) - // .unwrap(); - // values.closetime = heatmap_volume_vec.last().unwrap().close_time; - // values.current_price = current_price; - // do_buy = true; - // } - // } + let mut keys_to_remove: HashSet = HashSet::new(); + let heatmap_volumes = heatmap_volume( + 60, + 60, + 4.0, + 1.5, + 0.5, + -0.5, + &filtered_data, + &alldata.rt_price_1m_vec, + ) + .await?; + let server_epoch = get_server_epoch().await; + for (symbol, values) in &mut filtered_data { + let mut do_buy = false; + if let Some(heatmap_volume_vec) = heatmap_volumes.get(symbol) { + if heatmap_volume_vec.len() > 100 + && heatmap_volume_vec.last().unwrap().close_time > server_epoch + && ((heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::High) + || (heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::High) + || (heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::High) + || (heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::High)) + { + do_buy = true; + } + } - // if do_buy == false { - // keys_to_remove.insert(symbol.clone()); - // } - // } - // remove_keys(&mut filtered_data, keys_to_remove).await; + if do_buy == false { + keys_to_remove.insert(symbol.clone()); + } + } + remove_keys(&mut filtered_data, keys_to_remove).await; // StochRSI (RSI_len: 30, StochRSI_len: 30, K: 2, D: 2) K_current < 70, K_prev < 70, K_prev_1 < 70 // let server_epoch = get_server_epoch().await; @@ -174,11 +197,11 @@ pub async fn list_up_for_sell(alldata: &AllData) -> Result<(), Box= 0.2 { + if element.pure_profit_percent >= 0.3 { is_sell = true; - } else if element.pure_profit_percent <= -0.2 { + } else if element.pure_profit_percent <= -0.3 { is_sell = true; - } else if server_epoch - element.transact_time >= (300_000) * 1 { + } else if server_epoch - element.transact_time >= (600_000) * 1 { // time up selling is_sell = true; } else if over_turned == true { diff --git a/src/strategy_team/future_strategy_short.rs b/src/strategy_team/future_strategy_short.rs index 18bbe96..8f607a3 100644 --- a/src/strategy_team/future_strategy_short.rs +++ b/src/strategy_team/future_strategy_short.rs @@ -31,29 +31,56 @@ pub async fn list_up_for_buy( } // current Tema(15) > current Tema(30) + // let mut keys_to_remove: HashSet = HashSet::new(); + // let tema_15 = tema(15, &alldata.rt_price_1m_vec, &filtered_data).await?; + // let tema_30 = tema(30, &alldata.rt_price_1m_vec, &filtered_data).await?; + // let server_epoch = get_server_epoch().await; + // for (symbol, values) in &mut filtered_data { + // let mut do_buy = false; + // let price_and_closetime = get_current_price_decimal(&symbol, &alldata.rt_price_1m_vec).await; + // if let (Some(tema15_vec), Some(tema30_vec), Some(current_info)) = (tema_15.get(symbol), tema_30.get(symbol), price_and_closetime) { + // if tema15_vec.len() > 10 + // && tema30_vec.len() > 10 + // && tema15_vec.last().unwrap().close_time == tema30_vec.last().unwrap().close_time + // && tema15_vec.last().unwrap().close_time > server_epoch + // && tema30_vec.last().unwrap().close_time > server_epoch + // { + // if tema15_vec[tema15_vec.len()-1].tema_value > tema15_vec[tema15_vec.len()-2].tema_value + // && tema15_vec[tema15_vec.len()-1].tema_value > tema15_vec[tema15_vec.len()-3].tema_value + // && tema15_vec[tema15_vec.len()-2].tema_value < tema15_vec[tema15_vec.len()-3].tema_value { + // values.closetime = current_info.1; + // values.current_price = current_info.0; + // do_buy = true; + // } + // } + // } + // if do_buy == false { + // keys_to_remove.insert(symbol.clone()); + // } + // } + // remove_keys(&mut filtered_data, keys_to_remove).await; + + // supertrend(ATR period 10, multiplier: 3.0, 30m close price) let mut keys_to_remove: HashSet = HashSet::new(); - let tema_15 = tema(15, &alldata.rt_price_1m_vec, &filtered_data).await?; - let tema_30 = tema(30, &alldata.rt_price_1m_vec, &filtered_data).await?; let server_epoch = get_server_epoch().await; + let supertrend_1m_map = + supertrend(60, 1.5, true, &alldata.rt_price_1m_vec, &filtered_data).await?; for (symbol, values) in &mut filtered_data { let mut do_buy = false; let price_and_closetime = get_current_price_decimal(&symbol, &alldata.rt_price_1m_vec).await; - if let (Some(tema15_vec), Some(tema30_vec), Some(current_info)) = (tema_15.get(symbol), tema_30.get(symbol), price_and_closetime) { - if tema15_vec.len() > 10 - && tema30_vec.len() > 10 - && tema15_vec.last().unwrap().close_time == tema30_vec.last().unwrap().close_time - && tema15_vec.last().unwrap().close_time > server_epoch - && tema30_vec.last().unwrap().close_time > server_epoch + if let (Some(supertrend_vec), Some(current_info)) = ( + supertrend_1m_map.get(symbol), + price_and_closetime, + ) { + if supertrend_vec.last().unwrap().close_time > current_info.1 + && supertrend_vec.last().unwrap().signal.as_ref().is_some_and(|a| *a == SuperTrendSignal::SELL) { - if tema15_vec[tema15_vec.len()-1].tema_value > tema15_vec[tema15_vec.len()-2].tema_value - && tema15_vec[tema15_vec.len()-1].tema_value > tema15_vec[tema15_vec.len()-3].tema_value - && tema15_vec[tema15_vec.len()-2].tema_value < tema15_vec[tema15_vec.len()-3].tema_value { - values.closetime = current_info.1; - values.current_price = current_info.0; - do_buy = true; - } - } + values.current_price = current_info.0; + values.closetime = current_info.1; + do_buy = true; + } } + if do_buy == false { keys_to_remove.insert(symbol.clone()); } @@ -61,42 +88,38 @@ pub async fn list_up_for_buy( remove_keys(&mut filtered_data, keys_to_remove).await; // Heatmap volume: filtering close price with Extra High is over the previous candle from 30 previous candles - // let mut keys_to_remove: HashSet = HashSet::new(); - // let heatmap_volumes = heatmap_volume( - // 60, - // 60, - // 4.0, - // 2.5, - // 1.0, - // -0.5, - // &filtered_data, - // &alldata.rt_price_1m_vec, - // ) - // .await?; - // let server_epoch = get_server_epoch().await; - // for (symbol, values) in &mut filtered_data { - // let mut do_buy = false; - // if let (Some(heatmap_volume_vec), Some(rt_price_vec), Some(rt_price_vec_30m)) = (heatmap_volumes.get(symbol), alldata.rt_price_1m_vec.get(symbol), alldata.rt_price_30m_vec.get(symbol)) { - // if heatmap_volume_vec.len() > 100 - // && heatmap_volume_vec.last().unwrap().close_time > server_epoch - // && rt_price_vec.last().unwrap().close_time == heatmap_volume_vec.last().unwrap().close_time - // && heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh - // && rt_price_vec[rt_price_vec.len()-2].candle_type == CandleType::DOWN { - // let current_price: Decimal = rust_decimal::prelude::FromPrimitive::from_f64( - // rt_price_vec_30m.last().unwrap().close_price, - // ) - // .unwrap(); - // values.closetime = heatmap_volume_vec.last().unwrap().close_time; - // values.current_price = current_price; - // do_buy = true; - // } - // } + let mut keys_to_remove: HashSet = HashSet::new(); + let heatmap_volumes = heatmap_volume( + 60, + 60, + 4.0, + 1.5, + 0.5, + -0.5, + &filtered_data, + &alldata.rt_price_1m_vec, + ) + .await?; + let server_epoch = get_server_epoch().await; + for (symbol, values) in &mut filtered_data { + let mut do_buy = false; + if let Some(heatmap_volume_vec) = heatmap_volumes.get(symbol) { + if heatmap_volume_vec.len() > 100 + && heatmap_volume_vec.last().unwrap().close_time > server_epoch + && ((heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::High) + || (heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::High) + || (heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::High) + || (heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::High)) + { + do_buy = true; + } + } - // if do_buy == false { - // keys_to_remove.insert(symbol.clone()); - // } - // } - // remove_keys(&mut filtered_data, keys_to_remove).await; + if do_buy == false { + keys_to_remove.insert(symbol.clone()); + } + } + remove_keys(&mut filtered_data, keys_to_remove).await; // StochRSI (RSI_len: 30, StochRSI_len: 30, K: 2, D: 2) K_current < 70, K_prev < 70, K_prev_1 < 70 // let server_epoch = get_server_epoch().await; @@ -174,11 +197,11 @@ pub async fn list_up_for_sell(alldata: &AllData) -> Result<(), Box= 0.2 { + if element.pure_profit_percent >= 0.3 { is_sell = true; - } else if element.pure_profit_percent <= -0.2 { + } else if element.pure_profit_percent <= -0.3 { is_sell = true; - } else if server_epoch - element.transact_time >= (300_000) * 1 { + } else if server_epoch - element.transact_time >= (600_000) * 1 { // time up selling is_sell = true; } else if over_turned == true {