use super::{Candle, ChartMeta};
use crate::constants::{Interval, TimeRange};
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Chart {
pub symbol: String,
pub meta: ChartMeta,
pub candles: Vec<Candle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub interval: Option<Interval>,
#[serde(skip_serializing_if = "Option::is_none")]
pub range: Option<TimeRange>,
}
#[cfg(feature = "dataframe")]
impl Chart {
pub fn to_dataframe(&self) -> ::polars::prelude::PolarsResult<::polars::prelude::DataFrame> {
Candle::vec_to_dataframe(&self.candles)
}
}
#[cfg(feature = "indicators")]
impl Chart {
pub fn close_prices(&self) -> Vec<f64> {
self.candles.iter().map(|c| c.close).collect()
}
pub fn high_prices(&self) -> Vec<f64> {
self.candles.iter().map(|c| c.high).collect()
}
pub fn low_prices(&self) -> Vec<f64> {
self.candles.iter().map(|c| c.low).collect()
}
pub fn open_prices(&self) -> Vec<f64> {
self.candles.iter().map(|c| c.open).collect()
}
pub fn volumes(&self) -> Vec<f64> {
self.candles.iter().map(|c| c.volume as f64).collect()
}
pub fn sma(&self, period: usize) -> Vec<Option<f64>> {
crate::indicators::sma(&self.close_prices(), period)
}
pub fn ema(&self, period: usize) -> Vec<Option<f64>> {
crate::indicators::ema(&self.close_prices(), period)
}
pub fn rsi(&self, period: usize) -> crate::indicators::Result<Vec<Option<f64>>> {
crate::indicators::rsi(&self.close_prices(), period)
}
pub fn macd(
&self,
fast_period: usize,
slow_period: usize,
signal_period: usize,
) -> crate::indicators::Result<crate::indicators::MacdResult> {
crate::indicators::macd(
&self.close_prices(),
fast_period,
slow_period,
signal_period,
)
}
pub fn bollinger_bands(
&self,
period: usize,
std_dev_multiplier: f64,
) -> crate::indicators::Result<crate::indicators::BollingerBands> {
crate::indicators::bollinger_bands(&self.close_prices(), period, std_dev_multiplier)
}
pub fn atr(&self, period: usize) -> crate::indicators::Result<Vec<Option<f64>>> {
crate::indicators::atr(
&self.high_prices(),
&self.low_prices(),
&self.close_prices(),
period,
)
}
pub fn patterns(&self) -> Vec<Option<crate::indicators::CandlePattern>> {
crate::indicators::patterns(&self.candles)
}
}