Add local market calendar storage
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user