Add filtering
This commit is contained in:
parent
daddbed2b0
commit
73a968b839
|
|
@ -68,7 +68,7 @@ pub async fn list_up_for_buy(
|
||||||
}
|
}
|
||||||
try_join_all(task_vec).await?;
|
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 filtered_data_1st = filtered_data_1st_arc.lock().await.clone();
|
||||||
let mut filtered_data_2nd: Vec<FilteredData> = Vec::new();
|
let mut filtered_data_2nd: Vec<FilteredData> = Vec::new();
|
||||||
let mut filtered_data_2nd_arc: Arc<Mutex<Vec<FilteredData>>> =
|
let mut filtered_data_2nd_arc: Arc<Mutex<Vec<FilteredData>>> =
|
||||||
|
|
@ -85,7 +85,7 @@ pub async fn list_up_for_buy(
|
||||||
.iter()
|
.iter()
|
||||||
.position(|x| *x.0 == element.symbol);
|
.position(|x| *x.0 == element.symbol);
|
||||||
let supertrend_option_30m =
|
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() {
|
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();
|
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?;
|
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
|
// // 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 filtered_4th_symbol_c = filtered_data_4th_arc.lock().await.clone();
|
||||||
// let mut rsi10_1d_data: Vec<(String, Vec<RsiData>)> =
|
// 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?;
|
// 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;
|
insert_pre_suggested_coins(4, false, &final_filtered_data, &alldata).await;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ use serde::Deserialize;
|
||||||
use sqlx::FromRow;
|
use sqlx::FromRow;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::{fs::*, io::AsyncWriteExt, sync::Mutex, time::*};
|
use tokio::{fs::*, io::AsyncWriteExt, sync::Mutex, time::*};
|
||||||
|
use super::FilteredData;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct EmaData {
|
pub struct EmaData {
|
||||||
|
|
@ -28,7 +29,7 @@ impl EmaData {
|
||||||
pub async fn ema(
|
pub async fn ema(
|
||||||
moving_number: usize,
|
moving_number: usize,
|
||||||
input_rt_data: &Vec<(String, Vec<RealtimePriceData>)>,
|
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>> {
|
) -> Result<Vec<(String, Vec<EmaData>)>, Box<dyn std::error::Error + Send + Sync>> {
|
||||||
if filtered_symbols.is_empty() {
|
if filtered_symbols.is_empty() {
|
||||||
Err("Err")?;
|
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: Vec<(String, Vec<EmaData>)> = Vec::new();
|
||||||
let mut ema_data_wrapper_arc = Arc::new(Mutex::new(ema_data_wrapper));
|
let mut ema_data_wrapper_arc = Arc::new(Mutex::new(ema_data_wrapper));
|
||||||
let mut task_vec = Vec::new();
|
let mut task_vec = Vec::new();
|
||||||
for symbol in filtered_symbols {
|
for filtered_elem in filtered_symbols {
|
||||||
let symbol_search_result = input_rt_data.iter().position(|x| x.0 == *symbol.0);
|
let symbol_search_result = input_rt_data.iter().position(|x| x.0 == *filtered_elem.symbol);
|
||||||
|
|
||||||
match symbol_search_result {
|
match symbol_search_result {
|
||||||
Some(T) => {
|
Some(T) => {
|
||||||
let ema_data_wrapper_arc_c = Arc::clone(&ema_data_wrapper_arc);
|
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 = EmaData::new();
|
||||||
let mut ema_data_vec: Vec<EmaData> = Vec::new();
|
let mut ema_data_vec: Vec<EmaData> = Vec::new();
|
||||||
let input_rt_data_c = input_rt_data.clone();
|
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;
|
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 => {}
|
None => {}
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,5 @@ pub mod sma;
|
||||||
pub mod stoch_rsi;
|
pub mod stoch_rsi;
|
||||||
pub mod supertrend;
|
pub mod supertrend;
|
||||||
pub mod tema;
|
pub mod tema;
|
||||||
|
|
||||||
|
use crate::strategy_team::FilteredData;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user