pub struct Jma { /* private fields */ }Expand description
Mark Jurik’s adaptive moving average. The original algorithm is proprietary
and Jurik Research has never published the full source. This implementation
follows the widely-used three-stage filter reconstruction circulated since
the 1999 TASC article on the indicator — the same form used by most
open-source ports (TradingView Pine, pandas-ta, various MQL ports):
beta = 0.45 * (period - 1) / (0.45 * (period - 1) + 2)
alpha = beta ^ power
phase_ratio = clamp(phase / 100 + 1.5, 0.5, 2.5)
e0_t = (1 - alpha) * x_t + alpha * e0_{t-1}
e1_t = (x_t - e0_t) * (1 - beta) + beta * e1_{t-1}
e2_t = (e0_t + phase_ratio * e1_t - JMA_{t-1}) * (1 - alpha)^2 + alpha^2 * e2_{t-1}
JMA_t = JMA_{t-1} + e2_tThe state is seeded by setting e0 = JMA = first input, so a constant
input stream is reproduced exactly from the first output onward.
§Parameters
period: smoothing length (default 14).phase: phase shift in[-100, 100]. Values outside this range are clamped to the boundaryphase_ratioso the constructor never fails on a finitephase.power: kernel exponent in1..=4(default 2 matches the popular reconstruction).
§Example
use wickra_core::{Indicator, Jma};
let mut jma = Jma::new(14, 0.0, 2).unwrap();
let mut last = None;
for i in 0..40 {
last = jma.update(100.0 + f64::from(i));
}
assert!(last.is_some());Implementations§
Source§impl Jma
impl Jma
Trait Implementations§
Source§impl Indicator for Jma
impl Indicator for Jma
Source§fn update(&mut self, input: f64) -> Option<f64>
fn update(&mut self, input: f64) -> Option<f64>
Feed one new data point into the indicator and return the freshly computed
output, or
None if the indicator is still warming up.Source§fn reset(&mut self)
fn reset(&mut self)
Reset all internal state, leaving the indicator equivalent to a freshly
constructed instance with the same parameters.
Source§fn warmup_period(&self) -> usize
fn warmup_period(&self) -> usize
Number of inputs required before the first non-
None output can be produced.Auto Trait Implementations§
impl Freeze for Jma
impl RefUnwindSafe for Jma
impl Send for Jma
impl Sync for Jma
impl Unpin for Jma
impl UnsafeUnpin for Jma
impl UnwindSafe for Jma
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>>
Run the indicator over a slice of inputs in order, returning one output (or
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
Mutably borrows from an owned value. Read more
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>
Converts
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>
Converts
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