From c0344961bf5e293962637127af875ada1df72cd7 Mon Sep 17 00:00:00 2001 From: Sik Yoon Date: Mon, 1 Jan 2024 12:36:53 +0900 Subject: [PATCH] Change input pamaneters --- .../indicators/bollingerband.rs | 163 ++++++++---------- src/value_estimation_team/indicators/sma.rs | 12 +- 2 files changed, 80 insertions(+), 95 deletions(-) diff --git a/src/value_estimation_team/indicators/bollingerband.rs b/src/value_estimation_team/indicators/bollingerband.rs index be7f69e..9cbc19d 100644 --- a/src/value_estimation_team/indicators/bollingerband.rs +++ b/src/value_estimation_team/indicators/bollingerband.rs @@ -3,8 +3,8 @@ use crate::database_control::*; use crate::value_estimation_team::datapoints::price_data::RealtimePriceData; -use crate::value_estimation_team::indicators::sma::SmaData; -use csv::{DeserializeRecordsIter, StringRecord}; +use crate::value_estimation_team::indicators::sma::{SmaData, sma}; +use crate::strategy_team::FilteredData; use futures::future::try_join_all; use serde::Deserialize; use sqlx::FromRow; @@ -33,111 +33,96 @@ impl BollingerBandData { // Binance Bollingerband (SMA) pub async fn bollingerband( - period: usize, // this value should be same as moving size of sma + period: usize, sd_factor: f64, - input_sma_data: &Vec<(String, Vec)>, input_rt_data: &Vec<(String, Vec)>, - filtered_symbols: &Vec<(String, i64)>, + filtered_symbols: &Vec, ) -> Result)>, Box> { if filtered_symbols.is_empty() { Err(("Err"))?; } - let mut read_rt_data_vec: Vec<(String, Vec)> = input_rt_data.clone(); - let mut read_sma_data_vec: Vec<(String, Vec)> = input_sma_data.clone(); + let mut sma_data_vec: Vec<(String, Vec)> = sma(period, input_rt_data, filtered_symbols).await?; let mut bb_data_wrapper: Vec<(String, Vec)> = Vec::new(); let mut bb_data_wrapper_arc = Arc::new(Mutex::new(bb_data_wrapper)); let mut task_vec = Vec::new(); - for symbol in filtered_symbols { - let symbol_search_result1 = read_rt_data_vec.iter().position(|x| x.0 == *symbol.0); - let symbol_search_result2 = read_sma_data_vec.iter().position(|x| x.0 == *symbol.0); + for filtered_symbol in filtered_symbols { + let filtered_symbol_c = filtered_symbol.clone(); + let rt_data_vec_c: Vec<(String, Vec)> = input_rt_data.clone(); + let sma_data_vec_c = sma_data_vec.clone(); + let bb_data_wrapper_arc_c = Arc::clone(&bb_data_wrapper_arc); + task_vec.push(tokio::spawn(async move { + let search_result1 = rt_data_vec_c.clone().iter().position(|x| x.0 == *filtered_symbol_c.symbol); + let search_result2 = sma_data_vec_c.iter().position(|x| x.0 == *filtered_symbol_c.symbol); - match symbol_search_result1 { - Some(rt_index) => { - match symbol_search_result2 { - Some(sma_index) => { - let bb_data_wrapper_arc_c = Arc::clone(&bb_data_wrapper_arc); - let mut bb_data = BollingerBandData::new(); - let mut bb_data_vec: Vec = Vec::new(); - let read_rt_data_vec_c = read_rt_data_vec.clone(); - let read_sma_data_vec_c = read_sma_data_vec.clone(); - let symbol_c = symbol.clone(); - task_vec.push(tokio::spawn(async move { - // if the data has shorter than buffer - if read_sma_data_vec_c[sma_index].1.len() < period { - bb_data.sma = 0.0; - bb_data.upperband = 0.0; - bb_data.lowerband = 0.0; - bb_data.close_time = 0; - bb_data_vec.push(bb_data.clone()); - } else { - let result = read_rt_data_vec_c[rt_index].1.binary_search_by_key( - &read_sma_data_vec_c[sma_index].1.first().unwrap().close_time, - |RealtimePriceData { - opclo_price, - open_price, - close_price, - high_price, - low_price, - close_time, - quote_asset_volume, - candle_type, - }| *close_time, - ); + if search_result1.is_some() && search_result2.is_some() { + let mut bb_data = BollingerBandData::new(); + let mut bb_data_vec: Vec = Vec::new(); + + // if the data has shorter than buffer + if sma_data_vec_c[search_result2.unwrap()].1.len() > period { + let result = rt_data_vec_c[search_result1.unwrap()].1.binary_search_by_key( + &sma_data_vec_c[search_result2.unwrap()].1.first().unwrap().close_time, + |RealtimePriceData { + opclo_price, + open_price, + close_price, + high_price, + low_price, + close_time, + quote_asset_volume, + candle_type, + }| *close_time, + ); - match result { - Ok(T) => { - if T <= period - 1 { - let mut read_data_iter = - read_sma_data_vec_c[sma_index].1.iter(); - for _ in T..period - 1 { - read_data_iter.next(); - } - let window_iter = - read_rt_data_vec_c[rt_index].1.windows(period); - for buffer in window_iter { - let mut sd_mean = 0.0; - let mut standard_deviation = 0.0; - for element in buffer { - sd_mean += element.close_price; - } - sd_mean /= (period as f64); - for element in buffer { - standard_deviation += - (element.close_price - sd_mean).powi(2); - } - standard_deviation = sd_factor - * ((standard_deviation / period as f64).sqrt()); - - match read_data_iter.next() { - Some(T) => { - bb_data.sma = T.sma_value; - bb_data.upperband = - T.sma_value + standard_deviation; - bb_data.lowerband = - T.sma_value - standard_deviation; - bb_data.close_time = T.close_time; - bb_data_vec.push(bb_data.clone()); - } - None => {} - } - } - } - } - Err(E) => {} + match result { + Ok(T) => { + if T <= period - 1 { + let mut read_data_iter = + sma_data_vec_c[search_result2.unwrap()].1.iter(); + for _ in T..period - 1 { + read_data_iter.next(); + } + let window_iter = + rt_data_vec_c[search_result1.unwrap()].1.windows(period); + for buffer in window_iter { + let mut sd_mean = 0.0; + let mut standard_deviation = 0.0; + for element in buffer { + sd_mean += element.close_price; + } + sd_mean /= (period as f64); + for element in buffer { + standard_deviation += + (element.close_price - sd_mean).powi(2); + } + standard_deviation = sd_factor + * ((standard_deviation / period as f64).sqrt()); + + match read_data_iter.next() { + Some(T) => { + bb_data.sma = T.sma_value; + bb_data.upperband = + T.sma_value + standard_deviation; + bb_data.lowerband = + T.sma_value - standard_deviation; + bb_data.close_time = T.close_time; + bb_data_vec.push(bb_data.clone()); + } + None => {} + } } - let mut bb_data_wrapper_lock = bb_data_wrapper_arc_c.lock().await; - bb_data_wrapper_lock - .push((symbol_c.0.clone(), bb_data_vec.clone())); } - })); + } + Err(E) => {} } - None => {} + let mut bb_data_wrapper_lock = bb_data_wrapper_arc_c.lock().await; + bb_data_wrapper_lock + .push((filtered_symbol_c.symbol.clone(), bb_data_vec.clone())); } } - None => {} - } + })); } try_join_all(task_vec).await?; let a = bb_data_wrapper_arc.lock().await.to_owned(); diff --git a/src/value_estimation_team/indicators/sma.rs b/src/value_estimation_team/indicators/sma.rs index 59deb74..0033d8d 100644 --- a/src/value_estimation_team/indicators/sma.rs +++ b/src/value_estimation_team/indicators/sma.rs @@ -3,7 +3,7 @@ use crate::database_control::*; use crate::value_estimation_team::datapoints::price_data::RealtimePriceData; -use csv::{DeserializeRecordsIter, StringRecord}; +use crate::strategy_team::FilteredData; use futures::future::try_join_all; use serde::Deserialize; use sqlx::FromRow; @@ -29,7 +29,7 @@ impl SmaData { pub async fn sma( moving_number: usize, input_rt_data: &Vec<(String, Vec)>, - filtered_symbols: &Vec<(String, i64)>, + filtered_symbols: &Vec, ) -> Result)>, Box> { if filtered_symbols.is_empty() { Err("Err")?; @@ -39,13 +39,13 @@ pub async fn sma( let mut sma_data_wrapper_arc = Arc::new(Mutex::new(sma_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_symbol in filtered_symbols { + let symbol_search_result = input_rt_data.iter().position(|x| x.0 == *filtered_symbol.symbol); match symbol_search_result { Some(T) => { let sma_data_wrapper_arc_c = Arc::clone(&sma_data_wrapper_arc); - let symbol_c = symbol.clone(); + let symbol_c = filtered_symbol.symbol.clone(); let mut sma_data = SmaData::new(); let mut sma_data_vec: Vec = Vec::new(); let input_rt_data_c = input_rt_data.clone(); @@ -69,7 +69,7 @@ pub async fn sma( } } let mut sma_data_wrapper_lock = sma_data_wrapper_arc_c.lock().await; - sma_data_wrapper_lock.push((symbol_c.0.clone(), sma_data_vec.clone())); + sma_data_wrapper_lock.push((symbol_c.clone(), sma_data_vec.clone())); })); } None => {}