diff --git a/src/main.rs b/src/main.rs index 3a268e7..4f2023e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,11 +19,6 @@ use crate::request_others::{CoinPriceData, ExchangeInfo, TradeFee}; use crate::server_health_check_team::ServerHealth; use crate::time_checking_team::UserTime; use crate::value_estimation_team::datapoints::price_data::RealtimePriceData; -use crate::value_estimation_team::indicators::bollingerband::BollingerBandData; -use crate::value_estimation_team::indicators::ema::EmaData; -use crate::value_estimation_team::indicators::rsi::RsiData; -use crate::value_estimation_team::indicators::sma::SmaData; -use crate::value_estimation_team::indicators::stoch_rsi::StochRsiData; use reqwest::{Client, ClientBuilder}; use sqlx::{mysql::*, Connection, Executor, FromRow, Row}; use std::{ @@ -205,22 +200,34 @@ async fn main() -> Result<(), Box> { let mut rx4_exchange_info_data = rx_exchange_info_data.clone(); { - // initialize candle 1d, 1w and 1mon - print!("initialize candle 1d, 1w and 1mon.."); + if RUNNING_MODE == RunningMode::REAL { + println!("*** REAL MODE ***"); + } else if RUNNING_MODE == RunningMode::TEST { + println!("*** TEST MODE ***"); + } else if RUNNING_MODE == RunningMode::SIMUL { + println!("*** SIMULATION MODE ***"); + } + + // pre-fetching candle data: 30m, 1d, 1w and 1mon + print!("pre-fetching candle data: 30m, 1d, 1w and 1mon.."); std::io::stdout().flush(); let instant = Instant::now(); + let interval_30m = String::from("30m"); let interval_1d = String::from("1d"); let interval_1w = String::from("1w"); let interval_1mon = String::from("1mon"); + let mut candle_30m_vec_temp: Vec<(String, Vec)> = Vec::new(); let mut candle_1d_vec_temp: Vec<(String, Vec)> = Vec::new(); let mut candle_1w_vec_temp: Vec<(String, Vec)> = Vec::new(); let mut candle_1mon_vec_temp: Vec<(String, Vec)> = Vec::new(); + request_candles::fetch_candle_parallel(&interval_30m, &mut candle_30m_vec_temp).await; request_candles::fetch_candle_parallel(&interval_1d, &mut candle_1d_vec_temp).await; request_candles::fetch_candle_parallel(&interval_1w, &mut candle_1w_vec_temp).await; request_candles::fetch_candle_parallel(&interval_1mon, &mut candle_1mon_vec_temp).await; + tx_candle_30m_vec.send_modify(|vec| *vec = candle_30m_vec_temp); tx_candle_1d_vec.send_modify(|vec| *vec = candle_1d_vec_temp); tx_candle_1w_vec.send_modify(|vec| *vec = candle_1w_vec_temp); tx_candle_1mon_vec.send_modify(|vec| *vec = candle_1mon_vec_temp); @@ -228,13 +235,30 @@ async fn main() -> Result<(), Box> { // sleep as much as the loop recurs per 60 seconds, expecting child threads will have finished within 60 seconds. println!("Ok.."); - // if RUNNING_MODE == REAL || RUNNING_MODE == SIMUL { - // let elapsed_time = instant.elapsed().as_secs(); - // println!("wait for {} seconds till starting tradingbot..", 60 - elapsed_time); - // if 60 > elapsed_time { - // sleep(Duration::from_secs((60 - elapsed_time) as u64)).await; - // } - // } + if RUNNING_MODE == REAL || RUNNING_MODE == SIMUL { + let mut elapsed_time = instant.elapsed().as_secs(); + let mut remaining_time: u64 = 60 - elapsed_time; + + while remaining_time > 0 && 60 > remaining_time { + print!("\rstart tradingbot in {} seconds", remaining_time); + io::stdout().flush(); + elapsed_time = instant.elapsed().as_secs(); + loop { + let temp_elapsed_time = instant.elapsed().as_secs(); + let is_overflowed = remaining_time.overflowing_sub(1).1; + + if is_overflowed == true { + break; + } + if elapsed_time < temp_elapsed_time { + remaining_time -= 1; + break; + } + } + } + + println!("\nTradingbot is running"); + } } // Task#0: monitoring tasks @@ -736,8 +760,8 @@ async fn main() -> Result<(), Box> { // sleep as much as the loop recurs per 10 seconds, expecting child threads will have finished within 10 seconds. elapsed_time = instant.elapsed().as_millis(); - if 10_000 > elapsed_time { - sleep(Duration::from_millis((10_000 - elapsed_time) as u64)).await; + if 30_000 > elapsed_time { // 10_000 for major trade + sleep(Duration::from_millis((30_000 - elapsed_time) as u64)).await; } } }); @@ -750,7 +774,9 @@ async fn main() -> Result<(), Box> { let instant = Instant::now(); let mut candle_30m_vec_temp: Vec<(String, Vec)> = Vec::new(); let result = - request_candles::fetch_candle_parallel(&interval, &mut candle_30m_vec_temp).await; + + request_candles::fetch_candle_delay(&interval, &mut candle_30m_vec_temp).await; + // request_candles::fetch_candle_parallel(&interval, &mut candle_30m_vec_temp).await; match result { Ok(T) => { @@ -761,7 +787,7 @@ async fn main() -> Result<(), Box> { } // sleep as much as the loop recurs per 60 seconds, expecting child threads will have finished within 60 seconds. elapsed_time = instant.elapsed().as_millis(); - if 60_000 > elapsed_time { + if 60_000 > elapsed_time { //60_000 sleep(Duration::from_millis((60_000 - elapsed_time) as u64)).await; } } @@ -971,12 +997,12 @@ async fn main() -> Result<(), Box> { .expect("The mpsc channel has been closed."); } Err(E) => { - println!("Task #18 Error"); } } // sleep as much as the loop recurs per 1 second if all operation finished within 1 second. elapsed_time = instant.elapsed().as_millis(); + println!("elapsed time: {}", elapsed_time); if 250 > elapsed_time { sleep(Duration::from_millis((250 - elapsed_time) as u64)).await; } @@ -1048,17 +1074,13 @@ async fn main() -> Result<(), Box> { if RUNNING_MODE == REAL || RUNNING_MODE == SIMUL || RUNNING_MODE == TEST { tokio::task::spawn(async move { sleep(Duration::from_secs(30)).await; - let client = ClientBuilder::new() - .timeout(tokio::time::Duration::from_millis(3000)) - .build() - .unwrap(); + let mut elapsed_time = 0; loop { let instant = Instant::now(); let exchange_info_vec = rx_exchange_info_data.borrow().clone(); let trade_fee_vec = rx_tradefee_vec.borrow().clone(); let result = coex::exchange_team::buy_coin( - &client, &exchange_info_vec, &trade_fee_vec, ) @@ -1084,10 +1106,6 @@ async fn main() -> Result<(), Box> { } else { tokio::task::spawn(async move { sleep(Duration::from_secs(15)).await; - let client = ClientBuilder::new() - .timeout(tokio::time::Duration::from_millis(800)) - .build() - .unwrap(); let mut elapsed_time = 0; let instant = Instant::now(); @@ -1095,7 +1113,6 @@ async fn main() -> Result<(), Box> { let trade_fee_vec = rx_tradefee_vec.borrow().clone(); // let result = coex::exchange_team::buy_coin_for_test(&client, &coin_price_vec, &exchange_info_vec, &trade_fee_vec).await; let result = coex::exchange_team::buy_coin( - &client, &exchange_info_vec, &trade_fee_vec, )