Compare commits

..

10 Commits

Author SHA1 Message Date
6dfdc719c3 Update filtering 2024-06-08 20:00:54 +09:00
35d008450d Update filtering 2024-06-08 18:09:38 +09:00
7ea865ef54 Update filtering 2024-06-08 02:44:44 +09:00
3d821c7ec3 Update filtering 2024-06-08 02:08:20 +09:00
eae8a367dd Update filtering 2024-06-08 00:33:13 +09:00
73e72bdd3c Update filtering 2024-06-07 15:51:07 +09:00
6bb2b2df8e Update filtering 2024-06-06 19:35:46 +09:00
c0cef48c50 Update filtering 2024-06-06 14:40:37 +09:00
64f1ef7851 Update filtering 2024-06-06 14:29:49 +09:00
805d8c87e8 Update filtering 2024-06-06 14:14:09 +09:00
2 changed files with 151 additions and 112 deletions

View File

@ -36,13 +36,19 @@ pub async fn list_up_for_buy(
// current lr > prev lr, current r_squared <= 0.01
let mut keys_to_remove: HashSet<String> = HashSet::new();
let lr_map = linear_regression(10, 0, &alldata.rt_price_30m_vec, &filtered_data).await?;
let sma_map = sma(10, &alldata.rt_price_30m_vec, &filtered_data).await?;
for (symbol, values) in &mut filtered_data {
let mut do_buy = false;
if let (Some(lr_vec), Some(current_info)) = (lr_map.get(symbol), get_current_price_decimal(&symbol, &alldata.rt_price_30m_vec).await) {
if let (Some(lr_vec), Some(sma_vec), Some(current_info)) = (lr_map.get(symbol), sma_map.get(symbol), get_current_price_decimal(&symbol, &alldata.rt_price_30m_vec).await) {
if lr_vec.len() > 10
&& sma_vec.len() > 10
&& lr_vec.last().is_some_and(|x| x.close_time > server_epoch)
&& sma_vec.last().is_some_and(|x| x.close_time > server_epoch)
&& lr_vec[lr_vec.len()-1].lr_value > lr_vec[lr_vec.len()-2].lr_value
&& lr_vec.last().unwrap().r_squared <= 0.01
&& lr_vec[lr_vec.len()-2].lr_value > lr_vec[lr_vec.len()-3].lr_value
&& lr_vec.last().unwrap().r_squared <= 0.15
&& lr_vec[lr_vec.len()-1].lr_value >= sma_vec[sma_vec.len()-1].sma_value
&& lr_vec[lr_vec.len()-2].lr_value <= sma_vec[sma_vec.len()-2].sma_value
{
values.closetime = current_info.1;
do_buy = true;
@ -108,26 +114,26 @@ pub async fn list_up_for_buy(
// remove_keys(&mut filtered_data, keys_to_remove).await;
// supertrend(ATR period 30, multiplier: 2.0, 30m close price)
// let mut keys_to_remove: HashSet<String> = HashSet::new();
// let supertrend_30m_map =
// supertrend(100, 1.5, true, &alldata.rt_price_30m_vec, &filtered_data).await?;
// for (symbol, values) in &mut filtered_data {
// let mut do_buy = false;
// if let Some(supertrend_vec) = supertrend_30m_map.get(symbol)
// {
// if supertrend_vec.len() > 10
// && supertrend_vec.last().is_some_and(|a| a.close_time == values.closetime)
// && supertrend_vec.last().unwrap().area == SuperTrendArea::UP
// && supertrend_vec[supertrend_vec.len()-2].area == SuperTrendArea::UP {
// do_buy = true;
// }
// }
let mut keys_to_remove: HashSet<String> = HashSet::new();
let supertrend_1m_map =
supertrend(100, 2.5, true, &alldata.rt_price_1m_vec, &filtered_data).await?;
for (symbol, values) in &mut filtered_data {
let mut do_buy = false;
if let Some(supertrend_vec) = supertrend_1m_map.get(symbol)
{
if supertrend_vec.len() > 10
&& supertrend_vec.last().is_some_and(|a| a.close_time > server_epoch)
&& supertrend_vec.last().unwrap().area == SuperTrendArea::UP
&& supertrend_vec[supertrend_vec.len()-2].area == SuperTrendArea::UP {
do_buy = true;
}
}
// if do_buy == false {
// keys_to_remove.insert(symbol.clone());
// }
// }
// remove_keys(&mut filtered_data, keys_to_remove).await;
if do_buy == false {
keys_to_remove.insert(symbol.clone());
}
}
remove_keys(&mut filtered_data, keys_to_remove).await;
// set target_price and stop_loss
// let mut keys_to_remove: HashSet<String> = HashSet::new();
@ -161,7 +167,7 @@ pub async fn list_up_for_buy(
// }
// remove_keys(&mut filtered_data, keys_to_remove).await;
// Wiliams -50 > %R(100)
// Wiliams -60 > %R(100)
let mut keys_to_remove: HashSet<String> = HashSet::new();
let mut wpr100_map = wiliams_percent_r(100, &alldata.rt_price_1m_vec, &filtered_data).await?;
let server_epoch = get_server_epoch().await;
@ -170,7 +176,7 @@ pub async fn list_up_for_buy(
if let Some(wpr100_vec) = wpr100_map.get(symbol) {
if wpr100_vec.len() > 15
&& wpr100_vec.last().unwrap().close_time > server_epoch
&& wpr100_vec.last().unwrap().r_value < -50.0 {
&& wpr100_vec.last().unwrap().r_value < -70.0 {
do_buy = true;
}
}
@ -237,38 +243,39 @@ pub async fn list_up_for_buy(
// remove_keys(&mut filtered_data, keys_to_remove).await;
// Heatmap volume: filtering close price with Extra High is over the previous candle from 30 previous candles
// let mut keys_to_remove: HashSet<String> = HashSet::new();
// let heatmap_volumes = heatmap_volume(
// 30,
// 30,
// 4.0,
// 1.5,
// 0.5,
// -0.5,
// &filtered_data,
// &alldata.rt_price_1m_vec,
// )
// .await?;
// let server_epoch = get_server_epoch().await;
// for (symbol, values) in &mut filtered_data {
// let mut do_buy = false;
// if let Some(heatmap_volume_vec) = heatmap_volumes.get(symbol) {
// if heatmap_volume_vec.len() > 100
// && heatmap_volume_vec.last().unwrap().close_time > server_epoch
// && (heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::High
// || heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::High
// || heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::High
// || heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::High)
// {
// do_buy = true;
// }
// }
let mut keys_to_remove: HashSet<String> = HashSet::new();
let heatmap_volumes = heatmap_volume(
30,
30,
4.0,
1.5,
0.5,
-0.5,
&filtered_data,
&alldata.rt_price_30m_vec,
)
.await?;
// if do_buy == false {
// keys_to_remove.insert(symbol.clone());
// }
// }
// remove_keys(&mut filtered_data, keys_to_remove).await;
for (symbol, values) in &mut filtered_data {
let mut do_buy = true;
if let (Some(heatmap_volume_vec), Some(rt_price_vec)) = (heatmap_volumes.get(symbol), alldata.rt_price_30m_vec.get(symbol)) {
if heatmap_volume_vec.len() > 100
&& heatmap_volume_vec.last().unwrap().close_time > server_epoch
&& ((heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec.last().unwrap().close_time).is_some_and(|x| x.candle_type == CandleType::UP))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-2].close_time).is_some_and(|x| x.candle_type == CandleType::UP))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-3].close_time).is_some_and(|x| x.candle_type == CandleType::UP))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-4].close_time).is_some_and(|x| x.candle_type == CandleType::UP))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-5].heatmap_level == HeatMapLevel::ExtraHigh) && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-5].close_time).is_some_and(|x| x.candle_type == CandleType::UP))
{
do_buy = false;
}
}
if do_buy == false {
keys_to_remove.insert(symbol.clone());
}
}
remove_keys(&mut filtered_data, keys_to_remove).await;
// let mut keys_to_remove: HashSet<String> = HashSet::new();
// let server_epoch = get_server_epoch().await;
@ -393,12 +400,24 @@ pub async fn list_up_for_sell(all_data: &AllData, futures_exchange_info_map: &Ha
// is_sell = true;
// } else
if lr_vec.last().unwrap().r_squared >= 0.55 {
if element.pure_profit_percent.is_sign_positive() && lr_vec[lr_vec.len()-2].r_squared >= 0.60 {
is_sell = true;
} else if server_epoch - element.close_time > 900_000
&& lr_vec[lr_vec.len()-1].lr_value < lr_vec[lr_vec.len()-2].lr_value {
is_sell = true;
} else if server_epoch - element.close_time > 900_000
&& lr_vec[lr_vec.len()-1].r_squared < lr_vec[lr_vec.len()-2].r_squared
&& lr_vec[lr_vec.len()-2].r_squared > lr_vec[lr_vec.len()-3].r_squared
&& lr_vec[lr_vec.len()-3].r_squared > lr_vec[lr_vec.len()-4].r_squared {
is_sell = true;
} else if element.pure_profit_percent <= -0.8 {
is_sell = true;
} else if element.pure_profit_percent >= 2.0 {
is_sell = true;
}
let minimum_candles = 5;
let maximum_candles = 6;
let maximum_candles = 20;
// for count_candles in minimum_candles..=maximum_candles {
// if count_candles < maximum_candles
// && server_epoch - element.transact_time

View File

@ -36,13 +36,20 @@ pub async fn list_up_for_buy(
// current lr < prev lr, current r_squared <= 0.01
let mut keys_to_remove: HashSet<String> = HashSet::new();
let lr_map = linear_regression(10, 0, &alldata.rt_price_30m_vec, &filtered_data).await?;
let sma10_map = sma(10, &alldata.rt_price_30m_vec, &filtered_data).await?;
for (symbol, values) in &mut filtered_data {
let mut do_buy = false;
if let (Some(lr_vec), Some(current_info)) = (lr_map.get(symbol), get_current_price_decimal(&symbol, &alldata.rt_price_30m_vec).await) {
if let (Some(lr_vec), Some(sma_vec), Some(current_info)) = (lr_map.get(symbol), sma10_map.get(symbol), get_current_price_decimal(&symbol, &alldata.rt_price_30m_vec).await) {
if lr_vec.len() > 10
&& sma_vec.len() > 10
&& lr_vec.last().is_some_and(|x| x.close_time > server_epoch)
&& sma_vec.last().is_some_and(|x| x.close_time > server_epoch)
&& lr_vec[lr_vec.len()-1].lr_value < lr_vec[lr_vec.len()-2].lr_value
&& lr_vec.last().unwrap().r_squared <= 0.01
&& lr_vec[lr_vec.len()-2].lr_value < lr_vec[lr_vec.len()-3].lr_value
&& lr_vec.last().unwrap().r_squared <= 0.15
&& lr_vec[lr_vec.len()-1].lr_value <= sma_vec[sma_vec.len()-1].sma_value
&& lr_vec[lr_vec.len()-2].lr_value >= sma_vec[sma_vec.len()-2].sma_value
{
values.closetime = current_info.1;
do_buy = true;
@ -106,26 +113,26 @@ pub async fn list_up_for_buy(
// remove_keys(&mut filtered_data, keys_to_remove).await;
// supertrend(ATR period 30, multiplier: 2.0, 30m close price)
// let mut keys_to_remove: HashSet<String> = HashSet::new();
// let supertrend_30m_map =
// supertrend(100, 1.5, true, &alldata.rt_price_30m_vec, &filtered_data).await?;
// for (symbol, values) in &mut filtered_data {
// let mut do_buy = false;
// if let Some(supertrend_vec) = supertrend_30m_map.get(symbol)
// {
// if supertrend_vec.len() > 10
// && supertrend_vec.last().is_some_and(|a| a.close_time == values.closetime)
// && supertrend_vec.last().unwrap().area == SuperTrendArea::DOWN
// && supertrend_vec[supertrend_vec.len()-2].area == SuperTrendArea::DOWN {
// do_buy = true;
// }
// }
let mut keys_to_remove: HashSet<String> = HashSet::new();
let supertrend_1m_map =
supertrend(100, 2.5, true, &alldata.rt_price_1m_vec, &filtered_data).await?;
for (symbol, values) in &mut filtered_data {
let mut do_buy = false;
if let Some(supertrend_vec) = supertrend_1m_map.get(symbol)
{
if supertrend_vec.len() > 10
&& supertrend_vec.last().is_some_and(|a| a.close_time > server_epoch)
&& supertrend_vec.last().unwrap().area == SuperTrendArea::DOWN
&& supertrend_vec[supertrend_vec.len()-2].area == SuperTrendArea::DOWN {
do_buy = true;
}
}
// if do_buy == false {
// keys_to_remove.insert(symbol.clone());
// }
// }
// remove_keys(&mut filtered_data, keys_to_remove).await;
if do_buy == false {
keys_to_remove.insert(symbol.clone());
}
}
remove_keys(&mut filtered_data, keys_to_remove).await;
// set target_price and stop_loss
// let mut keys_to_remove: HashSet<String> = HashSet::new();
@ -159,7 +166,7 @@ pub async fn list_up_for_buy(
// }
// remove_keys(&mut filtered_data, keys_to_remove).await;
// Wiliams -50.0 < %R(100)
// Wiliams -40.0 < %R(100)
let mut keys_to_remove: HashSet<String> = HashSet::new();
let mut wpr100_map = wiliams_percent_r(100, &alldata.rt_price_1m_vec, &filtered_data).await?;
let server_epoch = get_server_epoch().await;
@ -168,7 +175,7 @@ pub async fn list_up_for_buy(
if let Some(wpr100_vec) = wpr100_map.get(symbol) {
if wpr100_vec.len() > 15
&& wpr100_vec.last().unwrap().close_time > server_epoch
&& wpr100_vec.last().unwrap().r_value > -50.0 {
&& wpr100_vec.last().unwrap().r_value > -30.0 {
do_buy = true;
}
}
@ -235,38 +242,39 @@ pub async fn list_up_for_buy(
// remove_keys(&mut filtered_data, keys_to_remove).await;
// Heatmap volume: filtering close price with Extra High is over the previous candle from 30 previous candles
// let mut keys_to_remove: HashSet<String> = HashSet::new();
// let heatmap_volumes = heatmap_volume(
// 30,
// 30,
// 4.0,
// 1.5,
// 0.5,
// -0.5,
// &filtered_data,
// &alldata.rt_price_1m_vec,
// )
// .await?;
// let server_epoch = get_server_epoch().await;
// for (symbol, values) in &mut filtered_data {
// let mut do_buy = false;
// if let Some(heatmap_volume_vec) = heatmap_volumes.get(symbol) {
// if heatmap_volume_vec.len() > 100
// && heatmap_volume_vec.last().unwrap().close_time > server_epoch
// && (heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::High
// || heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::High
// || heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::High
// || heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::ExtraHigh || heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::High)
// {
// do_buy = true;
// }
// }
let mut keys_to_remove: HashSet<String> = HashSet::new();
let heatmap_volumes = heatmap_volume(
30,
30,
4.0,
1.5,
0.5,
-0.5,
&filtered_data,
&alldata.rt_price_30m_vec,
)
.await?;
// if do_buy == false {
// keys_to_remove.insert(symbol.clone());
// }
// }
// remove_keys(&mut filtered_data, keys_to_remove).await;
for (symbol, values) in &mut filtered_data {
let mut do_buy = true;
if let (Some(heatmap_volume_vec), Some(rt_price_vec)) = (heatmap_volumes.get(symbol), alldata.rt_price_30m_vec.get(symbol)) {
if heatmap_volume_vec.len() > 100
&& heatmap_volume_vec.last().unwrap().close_time > server_epoch
&& ((heatmap_volume_vec.last().unwrap().heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec.last().unwrap().close_time).is_some_and(|x| x.candle_type == CandleType::DOWN))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-2].heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-2].close_time).is_some_and(|x| x.candle_type == CandleType::DOWN))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-3].heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-3].close_time).is_some_and(|x| x.candle_type == CandleType::DOWN))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-4].heatmap_level == HeatMapLevel::ExtraHigh && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-4].close_time).is_some_and(|x| x.candle_type == CandleType::DOWN))
|| (heatmap_volume_vec[heatmap_volume_vec.len()-5].heatmap_level == HeatMapLevel::ExtraHigh) && rt_price_vec.iter().find(|x| x.close_time == heatmap_volume_vec[heatmap_volume_vec.len()-5].close_time).is_some_and(|x| x.candle_type == CandleType::DOWN))
{
do_buy = false;
}
}
if do_buy == false {
keys_to_remove.insert(symbol.clone());
}
}
remove_keys(&mut filtered_data, keys_to_remove).await;
// let mut keys_to_remove: HashSet<String> = HashSet::new();
// let server_epoch = get_server_epoch().await;
@ -397,12 +405,24 @@ pub async fn list_up_for_sell(all_data: &AllData, futures_exchange_info_map: &Ha
// } else if element.pure_profit_percent <= element.stoploss_percent {
// is_sell = true;
// } else
if lr_vec.last().unwrap().r_squared >= 0.55 {
if element.pure_profit_percent.is_sign_positive() && lr_vec[lr_vec.len()-2].r_squared >= 0.60 {
is_sell = true;
} else if server_epoch - element.close_time > 900_000
&& lr_vec[lr_vec.len()-1].lr_value > lr_vec[lr_vec.len()-2].lr_value {
is_sell = true;
} else if server_epoch - element.close_time > 900_000
&& lr_vec[lr_vec.len()-1].r_squared < lr_vec[lr_vec.len()-2].r_squared
&& lr_vec[lr_vec.len()-2].r_squared > lr_vec[lr_vec.len()-3].r_squared
&& lr_vec[lr_vec.len()-3].r_squared > lr_vec[lr_vec.len()-4].r_squared {
is_sell = true;
} else if element.pure_profit_percent <= -0.8 {
is_sell = true;
} else if element.pure_profit_percent >= 2.0 {
is_sell = true;
}
let minimum_candles = 5;
let maximum_candles = 6;
let maximum_candles = 20;
// for count_candles in minimum_candles..=maximum_candles {
// if count_candles < maximum_candles
// && server_epoch - element.transact_time