use std::fs;
use time::OffsetDateTime;
use crate::feeds::Bar;
use anyhow::Result;
use super::YFinance;
pub fn get_bar_from_csv(symbol: &str) -> Result<Vec<Bar>> {
csv::ReaderBuilder::new()
.has_headers(true)
.from_reader( fs::File::open(format!("data/{symbol}.csv"))?)
.deserialize::<YFinance>()
.map(|line| {
let record = line?;
Ok(Bar {
date: OffsetDateTime::now_utc(),
open: record.open,
high: record.high,
low: record.low,
close: record.close,
volume: 0.0,
wap: 0.0,
count: 0,
})
}).collect()
}
pub async fn get_bar_from_yahoo(symbol: &str, save_csv: bool) -> Result<Vec<YFinance>> {
let url = format!("https://query1.finance.yahoo.com/v7/finance/download/{symbol}?period1=1672502400&period2=1704038400&interval=1d&events=history&includeAdjustedClose=true");
let client = reqwest::Client::builder()
.user_agent("curl/7.68.0")
.build()?;
let response = client.get(url).send().await?;
log::info!("response: {:?}", response);
log::info!("Status Code: {}", response.status());
let response_body = response.text().await?;
log::info!("Response body: {}", response_body);
let finance_data: Vec<YFinance> = csv::ReaderBuilder::new()
.from_reader(response_body.as_bytes())
.records()
.map(|record| {
record.unwrap().deserialize::<YFinance>(None).unwrap()
})
.collect();
if save_csv {
let mut wtr = csv::WriterBuilder::new().from_path(format!("data/{symbol}.csv"))?;
wtr.write_record(&["date", "open", "high", "low", "close", "adj_close", "volume"])?;
for record in finance_data.iter() {
wtr.write_record(&[
&record.date,
&record.open.to_string(),
&record.high.to_string(),
&record.low.to_string(),
&record.close.to_string(),
&record.adj_close.to_string(),
&record.volume.to_string(),
])?;
}
wtr.flush()?;
}
Ok(finance_data)
}