Update filtering

This commit is contained in:
Sik Yoon 2024-04-04 00:09:16 +09:00
parent c31abbb863
commit f6dd5730ea

View File

@ -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<String> = 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<String> = 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<String> = 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<String> = 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;
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일 때 적용하기