2023-03-12 00:13:57 -08:00
|
|
|
pub mod higher_order_candles;
|
|
|
|
pub mod minute_candles;
|
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
use chrono::Duration;
|
2023-05-14 00:15:10 -07:00
|
|
|
use deadpool_postgres::Pool;
|
2023-03-12 00:13:57 -08:00
|
|
|
use strum::IntoEnumIterator;
|
|
|
|
use tokio::{sync::mpsc::Sender, time::sleep};
|
|
|
|
|
|
|
|
use crate::{
|
2023-03-13 09:51:30 -07:00
|
|
|
structs::{candle::Candle, markets::MarketInfo, resolution::Resolution},
|
2023-03-26 12:39:25 -07:00
|
|
|
worker::candle_batching::minute_candles::batch_1m_candles,
|
2023-03-12 00:13:57 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
use self::higher_order_candles::batch_higher_order_candles;
|
|
|
|
|
2023-03-26 12:39:25 -07:00
|
|
|
pub async fn batch_for_market(
|
2023-05-14 00:15:10 -07:00
|
|
|
pool: &Pool,
|
2023-03-12 00:13:57 -08:00
|
|
|
candles_sender: &Sender<Vec<Candle>>,
|
2023-03-26 12:39:25 -07:00
|
|
|
market: &MarketInfo,
|
2023-03-27 10:11:58 -07:00
|
|
|
) -> anyhow::Result<()> {
|
2023-03-26 12:39:25 -07:00
|
|
|
loop {
|
2023-03-13 22:31:00 -07:00
|
|
|
let sender = candles_sender.clone();
|
|
|
|
let market_clone = market.clone();
|
2023-05-14 00:15:10 -07:00
|
|
|
// let client = pool.get().await?;
|
2023-03-26 12:39:25 -07:00
|
|
|
loop {
|
2023-03-27 10:11:58 -07:00
|
|
|
sleep(Duration::milliseconds(2000).to_std()?).await;
|
2023-05-14 00:15:10 -07:00
|
|
|
match batch_inner(pool, &sender, &market_clone).await {
|
2023-03-26 12:39:25 -07:00
|
|
|
Ok(_) => {}
|
|
|
|
Err(e) => {
|
|
|
|
println!(
|
|
|
|
"Batching thread failed for {:?} with error: {:?}",
|
|
|
|
market_clone.name.clone(),
|
|
|
|
e
|
|
|
|
);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
println!("Restarting {:?} batching thread", market.name);
|
2023-03-12 00:13:57 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-26 12:39:25 -07:00
|
|
|
async fn batch_inner(
|
2023-05-14 00:15:10 -07:00
|
|
|
pool: &Pool,
|
2023-03-12 00:13:57 -08:00
|
|
|
candles_sender: &Sender<Vec<Candle>>,
|
2023-03-13 22:31:00 -07:00
|
|
|
market: &MarketInfo,
|
2023-03-12 00:13:57 -08:00
|
|
|
) -> anyhow::Result<()> {
|
2023-03-13 22:31:00 -07:00
|
|
|
let market_name = &market.name.clone();
|
2023-05-14 00:15:10 -07:00
|
|
|
let candles = batch_1m_candles(pool, market).await?;
|
2023-03-12 00:13:57 -08:00
|
|
|
send_candles(candles, candles_sender).await;
|
|
|
|
|
|
|
|
for resolution in Resolution::iter() {
|
|
|
|
if resolution == Resolution::R1m {
|
|
|
|
continue;
|
|
|
|
}
|
2023-05-14 00:15:10 -07:00
|
|
|
let candles = batch_higher_order_candles(pool, market_name, resolution).await?;
|
2023-03-12 00:13:57 -08:00
|
|
|
send_candles(candles, candles_sender).await;
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn send_candles(candles: Vec<Candle>, candles_sender: &Sender<Vec<Candle>>) {
|
|
|
|
if candles.len() > 0 {
|
|
|
|
if let Err(_) = candles_sender.send(candles).await {
|
|
|
|
panic!("candles receiver dropped");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|