mirror of
https://github.com/NexVeridian/ark-invest-api-rust-data.git
synced 2025-09-02 01:49:12 +00:00
111 lines
2.7 KiB
Rust
111 lines
2.7 KiB
Rust
use anyhow::{Error, Result};
|
|
use ark_invest_api_rust_data::{util::ticker::Ticker, *};
|
|
use clokwerk::{AsyncScheduler, Job, TimeUnits};
|
|
use futures::future::join_all;
|
|
use lazy_static::lazy_static;
|
|
use polars::prelude::DataFrame;
|
|
use rand::Rng;
|
|
use std::env;
|
|
use std::str::FromStr;
|
|
use std::thread;
|
|
use strum::IntoEnumIterator;
|
|
use tokio::task;
|
|
use tokio::time::Duration;
|
|
|
|
lazy_static! {
|
|
static ref SOURCE: Source = match env::var("ARK_SOURCE") {
|
|
Ok(val) =>
|
|
Source::from_str(val.as_str()).expect("Env string ARK_SOURCE is not in enum Source"),
|
|
Err(_) => Source::ApiIncremental,
|
|
};
|
|
}
|
|
|
|
fn print_df(ticker: &Ticker, df: &DataFrame) {
|
|
println!(
|
|
"Ticker: {:#?}\nShape: {:?}\n{:#?}",
|
|
ticker,
|
|
df.shape(),
|
|
df.tail(Some(1))
|
|
);
|
|
}
|
|
|
|
fn csv_merge() -> Result<(), Error> {
|
|
for ticker in Ticker::iter() {
|
|
if !std::path::Path::new(&format!("./data/csv/{}", ticker)).exists() {
|
|
continue;
|
|
}
|
|
|
|
let df = Ark::merge_old_csv_to_parquet(ticker, None)?
|
|
.format()?
|
|
.sort()?
|
|
.write_parquet()?
|
|
.collect()?;
|
|
print_df(&ticker, &df);
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
fn ark_plan(ticker: Ticker) -> Result<(), Error> {
|
|
println!("Starting: {:#?}", ticker);
|
|
let sec = Duration::from_secs(rand::rng().random_range(30 * 60..=4 * 60 * 60));
|
|
// sleep(sec).await;
|
|
thread::sleep(sec);
|
|
|
|
let df = Ark::new(*SOURCE, ticker, None)?
|
|
.format()?
|
|
.write_parquet()?
|
|
.collect()?;
|
|
|
|
print_df(&ticker, &df);
|
|
Ok(())
|
|
}
|
|
|
|
async fn spawn_ark_plan(ticker: Ticker) -> Result<(), Error> {
|
|
task::spawn_blocking(move || ark_plan(ticker).unwrap())
|
|
.await
|
|
.unwrap();
|
|
Ok(())
|
|
}
|
|
|
|
async fn ark_etf() {
|
|
let futures = Ticker::iter()
|
|
.filter(|&x| x != Ticker::ARKVX && x != Ticker::ARKC && x != Ticker::ARKY)
|
|
.map(spawn_ark_plan)
|
|
.collect::<Vec<_>>();
|
|
|
|
join_all(futures).await;
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let mut scheduler = AsyncScheduler::new();
|
|
println!("Scheduler Started");
|
|
|
|
if env::var("STARTUP_CSV_MERGE")
|
|
.map(|v| v == "true")
|
|
.unwrap_or(false)
|
|
{
|
|
println!("Merging CSVs to Parquet");
|
|
csv_merge().unwrap();
|
|
}
|
|
|
|
if env::var("STARTUP_ARK_ETF")
|
|
.map(|v| v == "true")
|
|
.unwrap_or(false)
|
|
{
|
|
ark_etf().await;
|
|
}
|
|
|
|
scheduler.every(1.day()).at("10:00 am").run(ark_etf);
|
|
|
|
scheduler
|
|
.every(5.day())
|
|
.at("11:30 pm")
|
|
.run(|| async { if spawn_ark_plan(Ticker::ARKVX).await.is_ok() {} });
|
|
|
|
loop {
|
|
scheduler.run_pending().await;
|
|
// tokio::time::sleep(Duration::from_millis(10)).await;
|
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
}
|
|
}
|