#![allow(dead_code)]
#![allow(unused_variables)]
#![allow(unused_imports)]
use std::{collections::HashMap, sync::Arc};
use nautilus_indicators::indicator::Indicator;
use nautilus_model::{data::BarType, identifiers::InstrumentId};
#[derive(Clone, Default)]
pub(crate) struct Indicators {
pub indicators: Vec<Arc<dyn Indicator>>,
pub indicators_for_quotes: HashMap<InstrumentId, Vec<Arc<dyn Indicator>>>,
pub indicators_for_trades: HashMap<InstrumentId, Vec<Arc<dyn Indicator>>>,
pub indicators_for_bars: HashMap<BarType, Vec<Arc<dyn Indicator>>>,
}
impl Indicators {
pub fn is_initialized(&self) -> bool {
if self.indicators.is_empty() {
return false;
}
self.indicators
.iter()
.all(|indicator| indicator.initialized())
}
pub fn register_indicator_for_quotes(
&mut self,
instrument_id: InstrumentId,
indicator: Arc<dyn Indicator>,
) {
if !self.indicators.iter().any(|i| Arc::ptr_eq(i, &indicator)) {
self.indicators.push(indicator.clone());
}
let indicators = self.indicators_for_quotes.entry(instrument_id).or_default();
if indicators.iter().any(|i| Arc::ptr_eq(i, &indicator)) {
} else {
indicators.push(indicator);
}
}
pub fn register_indicator_for_trades(
&mut self,
instrument_id: InstrumentId,
indicator: Arc<dyn Indicator>,
) {
if !self.indicators.iter().any(|i| Arc::ptr_eq(i, &indicator)) {
self.indicators.push(indicator.clone());
}
let indicators = self.indicators_for_trades.entry(instrument_id).or_default();
if indicators.iter().any(|i| Arc::ptr_eq(i, &indicator)) {
} else {
indicators.push(indicator);
}
}
pub fn register_indicator_for_bars(
&mut self,
bar_type: BarType,
indicator: Arc<dyn Indicator>,
) {
if !self.indicators.iter().any(|i| Arc::ptr_eq(i, &indicator)) {
self.indicators.push(indicator.clone());
}
let standard_bar_type = bar_type.standard();
let indicators = self
.indicators_for_bars
.entry(standard_bar_type)
.or_default();
if indicators.iter().any(|i| Arc::ptr_eq(i, &indicator)) {
} else {
indicators.push(indicator);
}
}
}