Add local market calendar storage

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2024-02-22 12:35:01 +00:00
parent 0b9c6ca122
commit a84daea61c
9 changed files with 129 additions and 13 deletions

View File

@@ -1,12 +1,13 @@
use crate::{
config::Config,
types::alpaca,
database,
types::{alpaca, Calendar},
utils::{backoff, duration_until},
};
use log::info;
use std::sync::Arc;
use time::OffsetDateTime;
use tokio::{sync::mpsc, time::sleep};
use tokio::{join, sync::mpsc, time::sleep};
pub enum Status {
Open,
@@ -36,13 +37,31 @@ impl From<alpaca::api::incoming::clock::Clock> for Message {
pub async fn run(config: Arc<Config>, sender: mpsc::Sender<Message>) {
loop {
let clock = alpaca::api::incoming::clock::get(
&config.alpaca_client,
&config.alpaca_rate_limiter,
Some(backoff::infinite()),
)
.await
.unwrap();
let clock_future = async {
alpaca::api::incoming::clock::get(
&config.alpaca_client,
&config.alpaca_rate_limiter,
Some(backoff::infinite()),
)
.await
.unwrap()
};
let calendar_future = async {
alpaca::api::incoming::calendar::get(
&config.alpaca_client,
&config.alpaca_rate_limiter,
&alpaca::api::outgoing::calendar::Calendar::default(),
Some(backoff::infinite()),
)
.await
.unwrap()
.into_iter()
.map(Calendar::from)
.collect::<Vec<_>>()
};
let (clock, calendar) = join!(clock_future, calendar_future);
let sleep_until = duration_until(if clock.is_open {
info!("Market is open, will close at {}.", clock.next_close);
@@ -52,7 +71,15 @@ pub async fn run(config: Arc<Config>, sender: mpsc::Sender<Message>) {
clock.next_open
});
sleep(sleep_until).await;
let sleep_future = sleep(sleep_until);
let calendar_future = async {
database::calendar::upsert_batch_and_delete(&config.clickhouse_client, &calendar)
.await
.unwrap();
};
join!(sleep_future, calendar_future);
sender.send(clock.into()).await.unwrap();
}
}