From ad3b068d472bd14957b9cf63dfaee8a26b45e757 Mon Sep 17 00:00:00 2001 From: kingchenc Date: Fri, 22 May 2026 03:59:20 +0200 Subject: [PATCH] B4: complete reset/isReady/warmupPeriod across Node indicators KAMA and the nine candle indicators (CCI, WilliamsR, MFI, PSAR, Keltner, Donchian, VWAP, AO, Aroon) exposed none of the three lifecycle methods; Stochastic/OBV/ADX exposed only reset; MACD/Bollinger/ATR lacked warmupPeriod. Every indicator now exposes reset(), isReady() and warmupPeriod(), matching the scalar-macro surface. Verified against the rebuilt module (e.g. MACD warmupPeriod 34, Stochastic 16, KAMA 11). --- bindings/node/src/lib.rs | 156 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/bindings/node/src/lib.rs b/bindings/node/src/lib.rs index 0dec6f46..6e3ea8fa 100644 --- a/bindings/node/src/lib.rs +++ b/bindings/node/src/lib.rs @@ -155,6 +155,10 @@ impl MacdNode { pub fn is_ready(&self) -> bool { self.inner.is_ready() } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } } // ============================== Bollinger ============================== @@ -210,6 +214,10 @@ impl BollingerNode { pub fn is_ready(&self) -> bool { self.inner.is_ready() } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } } // ============================== Candle-input helpers ============================== @@ -265,6 +273,10 @@ impl AtrNode { pub fn is_ready(&self) -> bool { self.inner.is_ready() } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } } #[napi(object)] @@ -324,6 +336,14 @@ impl StochNode { pub fn reset(&mut self) { self.inner.reset(); } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } } #[napi(js_name = "OBV")] @@ -370,6 +390,14 @@ impl ObvNode { pub fn reset(&mut self) { self.inner.reset(); } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } } #[napi(object)] @@ -436,6 +464,14 @@ impl AdxNode { pub fn reset(&mut self) { self.inner.reset(); } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } } #[napi(js_name = "CCI")] @@ -451,6 +487,18 @@ impl CciNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update(&mut self, high: f64, low: f64, close: f64) -> napi::Result> { Ok(self.inner.update(cnd(high, low, close, 0.0)?)) } @@ -491,6 +539,18 @@ impl WilliamsRNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update(&mut self, high: f64, low: f64, close: f64) -> napi::Result> { Ok(self.inner.update(cnd(high, low, close, 0.0)?)) } @@ -531,6 +591,18 @@ impl MfiNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update( &mut self, high: f64, @@ -578,6 +650,18 @@ impl PsarNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update(&mut self, high: f64, low: f64, close: f64) -> napi::Result> { Ok(self.inner.update(cnd(high, low, close, 0.0)?)) } @@ -626,6 +710,18 @@ impl KeltnerNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update( &mut self, high: f64, @@ -685,6 +781,18 @@ impl DonchianNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update(&mut self, high: f64, low: f64) -> napi::Result> { Ok(self.inner.update(cnd(high, low, low, 0.0)?).map(|o| { DonchianValue { @@ -732,6 +840,18 @@ impl VwapNode { } } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update( &mut self, high: f64, @@ -779,6 +899,18 @@ impl AoNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update(&mut self, high: f64, low: f64) -> napi::Result> { Ok(self.inner.update(cnd(high, low, low, 0.0)?)) } @@ -820,6 +952,18 @@ impl AroonNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update(&mut self, high: f64, low: f64) -> napi::Result> { Ok(self .inner @@ -859,6 +1003,18 @@ impl KamaNode { }) } #[napi] + pub fn reset(&mut self) { + self.inner.reset(); + } + #[napi(js_name = "isReady")] + pub fn is_ready(&self) -> bool { + self.inner.is_ready() + } + #[napi(js_name = "warmupPeriod")] + pub fn warmup_period(&self) -> u32 { + self.inner.warmup_period() as u32 + } + #[napi] pub fn update(&mut self, value: f64) -> Option { self.inner.update(value) }