Add filtering

This commit is contained in:
Sik Yoon 2023-12-11 00:00:42 +09:00
parent daddbed2b0
commit 73a968b839
3 changed files with 56 additions and 8 deletions

View File

@ -68,7 +68,7 @@ pub async fn list_up_for_buy(
}
try_join_all(task_vec).await?;
// 2nd filtering: supertrend(ATR period 10, multiplier: 1.1, 30m close price), signal should be BUY
// 2nd filtering: supertrend(ATR period 10, multiplier: 1.2, 30m close price), signal should be BUY
let filtered_data_1st = filtered_data_1st_arc.lock().await.clone();
let mut filtered_data_2nd: Vec<FilteredData> = Vec::new();
let mut filtered_data_2nd_arc: Arc<Mutex<Vec<FilteredData>>> =
@ -85,7 +85,7 @@ pub async fn list_up_for_buy(
.iter()
.position(|x| *x.0 == element.symbol);
let supertrend_option_30m =
supertrend(&element.symbol, &rt_price_30m_vec_c, 10, 1.1, true).await;
supertrend(&element.symbol, &rt_price_30m_vec_c, 10, 1.2, true).await;
if rt_30m_option.is_some() && supertrend_option_30m.is_some() {
rt_30m_vec = rt_price_30m_vec_c[rt_30m_option.unwrap()].1.clone();
@ -319,6 +319,51 @@ pub async fn list_up_for_buy(
}
try_join_all(task_vec).await?;
// 7th filtering: ema3_30m < ema5_30m latest 3 candles
let filtered_data_6th_c = filtered_data_6th_arc.lock().await.clone();
let mut filtered_data_7th: Vec<FilteredData> = Vec::new();
let mut filtered_data_7th_arc: Arc<Mutex<Vec<FilteredData>>> =
Arc::new(Mutex::new(filtered_data_7th));
let mut task_vec = Vec::new();
let ema3_30m_data = ema(3, &alldata.rt_price_30m_vec, &filtered_data_6th_c).await?;
let ema5_30m_data = ema(5, &alldata.rt_price_30m_vec, &filtered_data_6th_c).await?;
for element in filtered_data_6th_c {
let filtered_data_7th_arc_c = Arc::clone(&filtered_data_7th_arc);
let ema3_30m_data_c = ema3_30m_data.clone();
let ema5_30m_data_c = ema5_30m_data.clone();
task_vec.push(tokio::spawn(async move {
let ema3_idx = ema3_30m_data_c.iter().position(|elem| elem.0 == element.symbol);
let ema5_idx = ema5_30m_data_c.iter().position(|elem| elem.0 == element.symbol);
if ema3_idx.is_some() && ema5_idx.is_some() {
let ema3_30m = &ema3_30m_data_c[ema3_idx.unwrap()].1;
let ema5_30m = &ema5_30m_data_c[ema3_idx.unwrap()].1;
let ema3_close_time_idx = ema3_30m.iter().position(|elem| elem.close_time == element.closetime);
let ema5_close_time_idx = ema5_30m.iter().position(|elem| elem.close_time == element.closetime);
if ema3_30m.len() >= 5 && ema5_30m.len() >= 5 && ema3_close_time_idx.is_some() && ema5_close_time_idx.is_some() {
if ema3_30m[ema3_close_time_idx.unwrap()-1].ema_value < ema5_30m[ema5_close_time_idx.unwrap()-1].ema_value ||
ema3_30m[ema3_close_time_idx.unwrap()-2].ema_value < ema5_30m[ema5_close_time_idx.unwrap()-2].ema_value ||
ema3_30m[ema3_close_time_idx.unwrap()-3].ema_value < ema5_30m[ema5_close_time_idx.unwrap()-3].ema_value {
let mut filtered_data_7th_lock = filtered_data_7th_arc_c.lock().await;
let mut filtered_data = FilteredData::new();
filtered_data.symbol = element.symbol.clone();
filtered_data.closetime = element.closetime;
filtered_data.current_price = element.current_price;
filtered_data.stoploss = element.stoploss;
filtered_data.target_price = element.target_price;
filtered_data_7th_lock.push(filtered_data);
}
}
}
}));
}
try_join_all(task_vec).await?;
// // 4th filtering: StochRSI (RSI length: 3, Stoch length: 3, smooth k: 3, smooth d: 3) 80 > k > kn-1
// let filtered_4th_symbol_c = filtered_data_4th_arc.lock().await.clone();
// let mut rsi10_1d_data: Vec<(String, Vec<RsiData>)> =
@ -401,7 +446,7 @@ pub async fn list_up_for_buy(
// }
// try_join_all(task_vec).await?;
let final_filtered_data = filtered_data_6th_arc.lock().await.clone();
let final_filtered_data = filtered_data_7th_arc.lock().await.clone();
insert_pre_suggested_coins(4, false, &final_filtered_data, &alldata).await;
Ok(())

View File

@ -8,6 +8,7 @@ use serde::Deserialize;
use sqlx::FromRow;
use std::sync::Arc;
use tokio::{fs::*, io::AsyncWriteExt, sync::Mutex, time::*};
use super::FilteredData;
#[derive(Clone, Debug)]
pub struct EmaData {
@ -28,7 +29,7 @@ impl EmaData {
pub async fn ema(
moving_number: usize,
input_rt_data: &Vec<(String, Vec<RealtimePriceData>)>,
filtered_symbols: &Vec<(String, i64)>,
filtered_symbols: &Vec<FilteredData>,
) -> Result<Vec<(String, Vec<EmaData>)>, Box<dyn std::error::Error + Send + Sync>> {
if filtered_symbols.is_empty() {
Err("Err")?;
@ -41,13 +42,13 @@ pub async fn ema(
let mut ema_data_wrapper: Vec<(String, Vec<EmaData>)> = Vec::new();
let mut ema_data_wrapper_arc = Arc::new(Mutex::new(ema_data_wrapper));
let mut task_vec = Vec::new();
for symbol in filtered_symbols {
let symbol_search_result = input_rt_data.iter().position(|x| x.0 == *symbol.0);
for filtered_elem in filtered_symbols {
let symbol_search_result = input_rt_data.iter().position(|x| x.0 == *filtered_elem.symbol);
match symbol_search_result {
Some(T) => {
let ema_data_wrapper_arc_c = Arc::clone(&ema_data_wrapper_arc);
let symbol_c = symbol.clone();
let filtered_elem_c = filtered_elem.clone();
let mut ema_data = EmaData::new();
let mut ema_data_vec: Vec<EmaData> = Vec::new();
let input_rt_data_c = input_rt_data.clone();
@ -83,7 +84,7 @@ pub async fn ema(
}
}
let mut ema_data_wrapper_lock = ema_data_wrapper_arc_c.lock().await;
ema_data_wrapper_lock.push((symbol_c.0.clone(), ema_data_vec.clone()));
ema_data_wrapper_lock.push((filtered_elem_c.symbol.clone(), ema_data_vec.clone()));
}));
}
None => {}

View File

@ -7,3 +7,5 @@ pub mod sma;
pub mod stoch_rsi;
pub mod supertrend;
pub mod tema;
use crate::strategy_team::FilteredData;