Compare commits

..

No commits in common. "6dfdc719c39775acf21cf4a5b5e3140cb1219844" and "98a29873b978d868bd137347827cc270ae6f4835" have entirely different histories.

2 changed files with 112 additions and 151 deletions

View File

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

View File

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