diff --git a/src/strategy_team/strategy_006.rs b/src/strategy_team/strategy_006.rs index cb86d26..7bccb72 100644 --- a/src/strategy_team/strategy_006.rs +++ b/src/strategy_team/strategy_006.rs @@ -163,6 +163,40 @@ pub async fn list_up_for_sell( } let supertrend_1d = supertrend(14, 1.2, true, &all_data.rt_price_1d_vec, &filtered_symbols).await?; for element in filled_buy_orders { + let opclo_sample_length: usize = 10; // 10 candle samsples + let mut target_profit_percent = 0.0; + if let Some(price_1d_vec) = all_data + .rt_price_1d_vec + .get(&element.symbol) + { + if let Some(partial_price_vec) = price_1d_vec.get(price_1d_vec.len()-opclo_sample_length+1..price_1d_vec.len()-1) { + let mut sum_amplitude_candles = 0.0; + let mut sum_ratio_amp_body = 0.0; + for element in price_1d_vec { + sum_amplitude_candles += + ((element.high_price / element.low_price) - 1.0) * 100.0; + sum_ratio_amp_body += (element.close_price - element.open_price).abs() + / (element.high_price - element.low_price); + } + let average_amplitude = sum_amplitude_candles / opclo_sample_length as f64; // percent unit + let average_ratio_amp_body = sum_ratio_amp_body / opclo_sample_length as f64; + + let mut amplitude_variance = 0.0; + for element in price_1d_vec { + amplitude_variance += ((((element.high_price / element.low_price) - 1.0) + * 100.0) + - average_amplitude) + .powi(2); + } + amplitude_variance = amplitude_variance / (opclo_sample_length - 1) as f64; + let standard_deviation_amplitude = amplitude_variance.sqrt(); + + // let target_profit_percent = average_amplitude + (standard_deviation_amplitude * (average_ratio_amp_body)); + target_profit_percent = + 2.0 * (average_amplitude - standard_deviation_amplitude); + } + } + if element.used_usdt >= dec!(10.0) { if let (Some(exchange_info), Some(tradefee), Some(supertrend_vec)) = (exchange_info_map.get(&element.symbol), trade_fee_map.get(&element.symbol), supertrend_1d.get(&element.symbol)) { @@ -221,6 +255,16 @@ pub async fn list_up_for_sell( &trade_fee_map, ) .await; + } else if target_profit_percent != 0.0 && target_profit_percent.is_sign_positive() && target_profit_percent <= element.pure_profit_percent { + limit_order_sell( + &element, + element.current_price, + base_qty_to_be_ordered, + &client, + &exchange_info_map, + &trade_fee_map, + ) + .await; } // TODO: sell_count가 1일 때 적용하기 // else if (supertrend_vec