pub struct Atr { /* private fields */ }Expand description
Average True Range with Wilder smoothing.
The first emitted value, by convention, appears after period candles: the
first period − 1 true-range values seed the Wilder average alongside the
period-th, then the smoothed update begins.
§Example
use wickra_core::{Candle, Indicator, Atr};
let mut indicator = Atr::new(5).unwrap();
let mut last = None;
for i in 0..80 {
let base = 100.0 + f64::from(i);
let candle =
Candle::new(base, base + 2.0, base - 2.0, base + 1.0, 10.0, i64::from(i)).unwrap();
last = indicator.update(candle);
}
assert!(last.is_some());Implementations§
Source§impl Atr
impl Atr
Sourcepub fn batch_atr(
&mut self,
high: &[f64],
low: &[f64],
close: &[f64],
) -> Vec<f64>
pub fn batch_atr( &mut self, high: &[f64], low: &[f64], close: &[f64], ) -> Vec<f64>
Vectorized batch over raw high/low/close columns: one f64 per bar
(NaN during warmup). The caller guarantees the three slices are equal
length and finite with valid OHLC ordering (the binding validates once up
front); ATR only reads high, low and the previous close.
Allocates the result and fills it through
batch_atr_into.
Sourcepub fn batch_atr_into(
&mut self,
high: &[f64],
low: &[f64],
close: &[f64],
out: &mut [f64],
)
pub fn batch_atr_into( &mut self, high: &[f64], low: &[f64], close: &[f64], out: &mut [f64], )
batch_atr into a caller-owned buffer, overwriting
every cell.
For a fresh indicator long enough to seed (n >= period) it runs the
true-range seed once and then the bare Wilder recurrence as a dispatched
kernel (hardware FMA where the CPU has it) — no per-bar Candle
construction/validation, no Option, identical division at the seed and
mul_add afterwards, so every value is bit-for-bit equal to replaying
update over the same candles. Shorter or non-fresh inputs defer to an
exact update replay.
§Panics
Panics if the four slices differ in length.
Sourcepub fn batch_atr_fast_into(
&mut self,
high: &[f64],
low: &[f64],
close: &[f64],
out: &mut [f64],
)
pub fn batch_atr_fast_into( &mut self, high: &[f64], low: &[f64], close: &[f64], out: &mut [f64], )
Opt-in fast variant of batch_atr_into: the
exact seed, then blocks of true ranges smoothed by a SIMD Wilder scan.
Every value agrees with the exact batch to within a few units in the
last place; the seed, warmup NaNs and length are identical, and the
result is the same on every platform. Only a fresh indicator over finite
values within 1e100, at least period bars long, takes the kernel;
anything else is the exact batch. Afterwards the ATR continues
streaming from the kernel’s last average.
§Panics
Panics if the four slices differ in length.
Sourcepub fn batch_atr_fast(
&mut self,
high: &[f64],
low: &[f64],
close: &[f64],
) -> Vec<f64>
pub fn batch_atr_fast( &mut self, high: &[f64], low: &[f64], close: &[f64], ) -> Vec<f64>
batch_atr_fast_into into a fresh vector.
Trait Implementations§
Source§impl Indicator for Atr
impl Indicator for Atr
Source§type Input = Candle
type Input = Candle
f64 for a price, or Candle / Tick).Source§fn update(&mut self, candle: Candle) -> Option<f64>
fn update(&mut self, candle: Candle) -> Option<f64>
None if there is no value for this input. Read moreSource§fn reset(&mut self)
fn reset(&mut self)
Source§fn warmup_period(&self) -> usize
fn warmup_period(&self) -> usize
None output can be produced.Source§fn is_ready(&self) -> bool
fn is_ready(&self) -> bool
Source§fn name(&self) -> &'static str
fn name(&self) -> &'static str
Source§fn batch_nan_into(&mut self, inputs: &[Self::Input], out: &mut [f64])
fn batch_nan_into(&mut self, inputs: &[Self::Input], out: &mut [f64])
Source§fn batch_fast_into(&mut self, inputs: &[Self::Input], out: &mut [f64])
fn batch_fast_into(&mut self, inputs: &[Self::Input], out: &mut [f64])
batch_nan_into, but
an indicator with a vectorised kernel may reassociate its arithmetic to
run it in SIMD lanes. Each value then agrees with the exact batch to within
the tolerance the indicator documents (a few units in the last place), not
bit for bit; warmup positions, NaN placement and the output length are
identical. The kernels are deterministic: the same input produces the same
bits on every platform, with or without SIMD hardware. Read moreAuto Trait Implementations§
impl Freeze for Atr
impl RefUnwindSafe for Atr
impl Send for Atr
impl Sync for Atr
impl Unpin for Atr
impl UnsafeUnpin for Atr
impl UnwindSafe for Atr
Blanket Implementations§
Source§impl<T> BatchExt for Twhere
T: Indicator,
impl<T> BatchExt for Twhere
T: Indicator,
Source§fn batch(&mut self, inputs: &[Self::Input]) -> Vec<Option<Self::Output>>
fn batch(&mut self, inputs: &[Self::Input]) -> Vec<Option<Self::Output>>
None during warmup) per input.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more