From 2561a1081d391c25b3bb87c1b5ba7b2606a3e7de Mon Sep 17 00:00:00 2001 From: Sik Yoon Date: Sat, 25 May 2024 00:37:31 +0900 Subject: [PATCH] Update filtering --- src/strategy_team/future_strategy_long.rs | 75 +++++++++++++--------- src/strategy_team/future_strategy_short.rs | 75 +++++++++++++--------- src/strategy_team/strategy_manager.rs | 4 +- 3 files changed, 92 insertions(+), 62 deletions(-) diff --git a/src/strategy_team/future_strategy_long.rs b/src/strategy_team/future_strategy_long.rs index fb146f8..b260262 100644 --- a/src/strategy_team/future_strategy_long.rs +++ b/src/strategy_team/future_strategy_long.rs @@ -134,7 +134,7 @@ pub async fn list_up_for_buy( Ok(()) } -pub async fn list_up_for_sell() -> Result<(), Box> { +pub async fn list_up_for_sell(alldata: &AllData) -> Result<(), Box> { let filled_positions = select_filled_positions().await?; let client = ClientBuilder::new() @@ -142,37 +142,52 @@ pub async fn list_up_for_sell() -> Result<(), Box = HashMap::new(); + for element in &filled_positions { + filtered_symbols.insert(element.symbol.clone(), FilteredDataValue::new()); + } + let server_epoch = get_server_epoch().await; + let stoch_rsis = stoch_rsi(30, 30, 2, 2, &alldata.rt_price_1m_vec, &filtered_symbols).await?; + for element in filled_positions { - let mut is_sell = false; - - // TODO: BNB 코인이 있으면 - // let base_qty_to_be_ordered = - // element.base_qty_ordered.round_dp_with_strategy( - // lot_step_size.normalize().scale(), - // RoundingStrategy::ToZero, - // ); - // TODO: BNB 코인이 없으면 - - if !element.current_price.is_zero() { - if element.pure_profit_percent >= 0.6 { - is_sell = true; - } else if element.pure_profit_percent <= -0.8 { - is_sell = true; - } else if server_epoch - element.transact_time >= (300_000) * 1 { - // time up selling - is_sell = true; + if let Some(stoch_rsis_vec) = stoch_rsis.get(&element.symbol) { + let mut over_turned = false; + let mut is_sell = false; + if stoch_rsis_vec.last().unwrap().close_time > server_epoch + && stoch_rsis_vec.last().unwrap().k < stoch_rsis_vec.last().unwrap().d { + over_turned = true; } - - if is_sell == true { - limit_order_close( - &element, - TimeInForce::Gtc, - element.current_price, - element.base_qty_ordered, - &client - ) - .await; + + // TODO: BNB 코인이 있으면 + // let base_qty_to_be_ordered = + // element.base_qty_ordered.round_dp_with_strategy( + // lot_step_size.normalize().scale(), + // RoundingStrategy::ToZero, + // ); + // TODO: BNB 코인이 없으면 + + if !element.current_price.is_zero() { + if element.pure_profit_percent >= 0.6 { + is_sell = true; + } else if element.pure_profit_percent <= -0.8 { + is_sell = true; + } else if server_epoch - element.transact_time >= (300_000) * 1 { + // time up selling + is_sell = true; + } else if over_turned == true { + is_sell = true; + } + + if is_sell == true { + limit_order_close( + &element, + TimeInForce::Gtc, + element.current_price, + element.base_qty_ordered, + &client + ) + .await; + } } } } diff --git a/src/strategy_team/future_strategy_short.rs b/src/strategy_team/future_strategy_short.rs index 51b15aa..10f2a86 100644 --- a/src/strategy_team/future_strategy_short.rs +++ b/src/strategy_team/future_strategy_short.rs @@ -133,45 +133,60 @@ pub async fn list_up_for_buy( Ok(()) } -pub async fn list_up_for_sell() -> Result<(), Box> { +pub async fn list_up_for_sell(alldata: &AllData) -> Result<(), Box> { let filled_positions = select_filled_positions().await?; let client = ClientBuilder::new() .timeout(tokio::time::Duration::from_millis(5000)) .build() .unwrap(); + + let mut filtered_symbols: HashMap = HashMap::new(); + for element in &filled_positions { + filtered_symbols.insert(element.symbol.clone(), FilteredDataValue::new()); + } let server_epoch = get_server_epoch().await; - + let stoch_rsis = stoch_rsi(30, 30, 2, 2, &alldata.rt_price_1m_vec, &filtered_symbols).await?; + for element in filled_positions { - let mut is_sell = false; - - // TODO: BNB 코인이 있으면 - // let base_qty_to_be_ordered = - // element.base_qty_ordered.round_dp_with_strategy( - // lot_step_size.normalize().scale(), - // RoundingStrategy::ToZero, - // ); - // TODO: BNB 코인이 없으면 - - if !element.current_price.is_zero() { - if element.pure_profit_percent >= 0.6 { - is_sell = true; - } else if element.pure_profit_percent <= -0.8 { - is_sell = true; - } else if server_epoch - element.transact_time >= (300_000) * 1 { - // time up selling - is_sell = true; + if let Some(stoch_rsis_vec) = stoch_rsis.get(&element.symbol) { + let mut over_turned = false; + let mut is_sell = false; + if stoch_rsis_vec.last().unwrap().close_time > server_epoch + && stoch_rsis_vec.last().unwrap().k > stoch_rsis_vec.last().unwrap().d { + over_turned = true; } - - if is_sell == true { - limit_order_close( - &element, - TimeInForce::Gtc, - element.current_price, - element.base_qty_ordered, - &client - ) - .await; + + // TODO: BNB 코인이 있으면 + // let base_qty_to_be_ordered = + // element.base_qty_ordered.round_dp_with_strategy( + // lot_step_size.normalize().scale(), + // RoundingStrategy::ToZero, + // ); + // TODO: BNB 코인이 없으면 + + if !element.current_price.is_zero() { + if element.pure_profit_percent >= 0.6 { + is_sell = true; + } else if element.pure_profit_percent <= -0.8 { + is_sell = true; + } else if server_epoch - element.transact_time >= (300_000) * 1 { + // time up selling + is_sell = true; + } else if over_turned == true { + is_sell = true; + } + + if is_sell == true { + limit_order_close( + &element, + TimeInForce::Gtc, + element.current_price, + element.base_qty_ordered, + &client + ) + .await; + } } } } diff --git a/src/strategy_team/strategy_manager.rs b/src/strategy_team/strategy_manager.rs index 2ecc6a6..22a3097 100644 --- a/src/strategy_team/strategy_manager.rs +++ b/src/strategy_team/strategy_manager.rs @@ -84,8 +84,8 @@ pub async fn execute_list_up_for_sell( // &trade_fee_map, // ) // .await; - crate::strategy_team::future_strategy_long::list_up_for_sell().await; - crate::strategy_team::future_strategy_short::list_up_for_sell().await; + crate::strategy_team::future_strategy_long::list_up_for_sell(&all_data).await; + crate::strategy_team::future_strategy_short::list_up_for_sell(&all_data).await; Ok(()) }