use crate::bar_indicators::adaptive::frama::{FractalAdaptiveMovingAverage, FractalMethod};
use crate::bar_indicators::indicator_value::IndicatorValue;
#[derive(Debug, Clone)]
pub struct FramaAdvanced {
inner: FractalAdaptiveMovingAverage,
period: usize,
}
impl FramaAdvanced {
pub fn new(period: usize) -> Self {
let period = period.clamp(1, 512); Self {
inner: FractalAdaptiveMovingAverage::new(period, FractalMethod::Standard),
period,
}
}
pub fn new_with_method(period: usize, method: FractalMethod) -> Self {
let period = period.clamp(1, 512);
Self {
inner: FractalAdaptiveMovingAverage::new(period, method),
period,
}
}
pub fn new_with_alpha_bounds(period: usize, min_alpha: f64, max_alpha: f64) -> Self {
let period = period.clamp(1, 512);
let mut frama = FractalAdaptiveMovingAverage::new(period, FractalMethod::Standard);
frama.set_alpha_bounds(min_alpha, max_alpha);
Self {
inner: frama,
period,
}
}
pub fn new_custom(
period: usize,
method: FractalMethod,
min_alpha: f64,
max_alpha: f64,
dimension_smoothing: f64
) -> Self {
let period = period.clamp(1, 512);
let mut frama = FractalAdaptiveMovingAverage::new(period, method);
frama.set_alpha_bounds(min_alpha, max_alpha);
frama.set_dimension_smoothing(dimension_smoothing);
Self {
inner: frama,
period,
}
}
pub fn period(&self) -> usize {
self.period
}
pub fn is_ready(&self) -> bool {
self.inner.is_ready()
}
pub fn reset(&mut self) {
self.inner.reset();
}
pub fn update_bar(&mut self, open: f64, high: f64, low: f64, close: f64, _volume: f64) -> f64 {
let result = self.inner.update_ohlc(open, high, low, close);
result.value
}
pub fn value(&self) -> IndicatorValue {
self.inner.value()
}
pub fn is_initialized(&self) -> bool {
self.inner.is_ready()
}
pub fn fractal_dimension(&self) -> f64 {
self.inner.fractal_dimension()
}
pub fn alpha(&self) -> f64 {
self.inner.alpha()
}
pub fn efficiency(&self) -> f64 {
self.inner.efficiency()
}
pub fn noise_level(&self) -> f64 {
self.inner.noise_level()
}
pub fn trend_strength(&self) -> f64 {
self.inner.trend_strength()
}
pub fn method(&self) -> FractalMethod {
self.inner.method()
}
pub fn alpha_bounds(&self) -> (f64, f64) {
self.inner.alpha_bounds()
}
pub fn set_alpha_bounds(&mut self, min_alpha: f64, max_alpha: f64) {
self.inner.set_alpha_bounds(min_alpha, max_alpha);
}
pub fn set_dimension_smoothing(&mut self, alpha: f64) {
self.inner.set_dimension_smoothing(alpha);
}
pub fn trend_periods(&self) -> usize {
self.inner.trend_periods()
}
pub fn ranging_periods(&self) -> usize {
self.inner.ranging_periods()
}
pub fn high_noise_periods(&self) -> usize {
self.inner.high_noise_periods()
}
pub fn dimension_history(&self) -> &[f64] {
self.inner.dimension_history()
}
pub fn alpha_history(&self) -> &[f64] {
self.inner.alpha_history()
}
pub fn efficiency_history(&self) -> &[f64] {
self.inner.efficiency_history()
}
pub fn forecast(&self, periods: usize) -> Vec<f64> {
self.inner.forecast(periods)
}
}