From cf5d7764ba2c27951f1ccf43674b6258251f987d Mon Sep 17 00:00:00 2001 From: Pratik Bhadane Date: Wed, 1 Apr 2026 23:03:05 +0530 Subject: [PATCH 1/2] chore: bump version to 1.1.1 and update changelog - Updated version numbers across Cargo.toml, Cargo.lock, pyproject.toml, and conda/meta.yaml to 1.1.1. - Added new features and improvements in CHANGELOG.md for version 1.1.1, including full feature parity across Rust, Python, and WASM targets, and numerous new indicator functions in ferro_ta_core. --- CHANGELOG.md | 18 + Cargo.lock | 4 +- Cargo.toml | 4 +- conda/meta.yaml | 2 +- crates/ferro_ta_core/Cargo.toml | 2 +- crates/ferro_ta_core/README.md | 2 +- crates/ferro_ta_core/src/math.rs | 55 + crates/ferro_ta_core/src/momentum.rs | 429 + crates/ferro_ta_core/src/overlap.rs | 520 + crates/ferro_ta_core/src/statistic.rs | 223 + crates/ferro_ta_core/src/volatility.rs | 16 + docs/api_manifest.json | 12820 ++++++++++++----------- docs/changelog.rst | 2 +- docs/support_matrix.rst | 2 +- pyproject.toml | 2 +- wasm/Cargo.lock | 4 +- wasm/Cargo.toml | 2 +- wasm/package.json | 2 +- wasm/src/lib.rs | 1467 +++ 19 files changed, 9343 insertions(+), 6233 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e24523..28deef2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,24 @@ and the project uses [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [1.1.1] — 2026-04-01 + +### Added + +- Full feature parity across Rust core, Python, and WASM targets. +- 56 new pure-Rust indicator functions in ferro_ta_core: ROC/ROCP/ROCR/ROCR100, + WILLR, AROON/AROONOSC, CCI, BOP, STOCHRSI, APO, PPO, CMO, TRIX, ULTOSC, + DEMA, TEMA, TRIMA, KAMA, T3, SAR, SAREXT, MAMA, MIDPOINT, MIDPRICE, + MACDFIX, MACDEXT, MA (generic dispatcher), MAVP, VAR, LINEARREG variants, + TSF, BETA, CORREL, NATR, and 19 math operators/transforms. +- 120+ new WASM bindings: all 61 candlestick patterns (via macro), 9 streaming + API structs, options pricing/greeks/IV/chain/surface, futures basis/roll/curve/ + synthetic, backtest engine (close-only + OHLCV), walk-forward analysis, + Monte Carlo bootstrap, performance metrics, batch operations, portfolio + analytics, and signal utilities. +- `workflow_dispatch` trigger added to `wasm-publish.yml` for manual npm + publishing. + ## [1.0.6] — 2026-03-24 ### Added diff --git a/Cargo.lock b/Cargo.lock index ab53d9a..da98fde 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -207,7 +207,7 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "ferro_ta" -version = "1.1.0" +version = "1.1.1" dependencies = [ "criterion", "ferro_ta_core", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "ferro_ta_core" -version = "1.1.0" +version = "1.1.1" dependencies = [ "criterion", "serde", diff --git a/Cargo.toml b/Cargo.toml index 5f9a6d6..e32ae38 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ resolver = "2" [package] name = "ferro_ta" -version = "1.1.0" +version = "1.1.1" edition = "2021" description = "Rust-powered Python technical analysis library with a TA-Lib-compatible API" license = "MIT" @@ -30,7 +30,7 @@ ndarray = "0.16" rayon = "1.10" log = "0.4" pyo3-log = "0.12" -ferro_ta_core = { path = "crates/ferro_ta_core", version = "1.1.0", features = ["serde"] } +ferro_ta_core = { path = "crates/ferro_ta_core", version = "1.1.1", features = ["serde"] } [dev-dependencies] criterion = { version = "0.8", features = ["html_reports"] } diff --git a/conda/meta.yaml b/conda/meta.yaml index 05f9edc..6acd8a9 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -1,5 +1,5 @@ {% set name = "ferro-ta" %} -{% set version = "1.1.0" %} +{% set version = "1.1.1" %} package: name: {{ name|lower }} diff --git a/crates/ferro_ta_core/Cargo.toml b/crates/ferro_ta_core/Cargo.toml index 5b6f23a..0b836d7 100644 --- a/crates/ferro_ta_core/Cargo.toml +++ b/crates/ferro_ta_core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ferro_ta_core" -version = "1.1.0" +version = "1.1.1" edition = "2021" description = "Pure Rust core indicator library — no PyO3, no numpy dependency" license = "MIT" diff --git a/crates/ferro_ta_core/README.md b/crates/ferro_ta_core/README.md index eaec724..7ca372e 100644 --- a/crates/ferro_ta_core/README.md +++ b/crates/ferro_ta_core/README.md @@ -13,7 +13,7 @@ PyO3, NumPy, or Python runtime dependency, which makes it a good fit for: ```toml [dependencies] -ferro_ta_core = "1.1.0" +ferro_ta_core = "1.1.1" ``` ## Design diff --git a/crates/ferro_ta_core/src/math.rs b/crates/ferro_ta_core/src/math.rs index bd08961..a8877ca 100644 --- a/crates/ferro_ta_core/src/math.rs +++ b/crates/ferro_ta_core/src/math.rs @@ -113,6 +113,61 @@ pub fn sliding_min(real: &[f64], timeperiod: usize) -> Vec { result } +// --------------------------------------------------------------------------- +// Element-wise arithmetic operators +// --------------------------------------------------------------------------- + +/// Element-wise addition of two arrays. +pub fn add(a: &[f64], b: &[f64]) -> Vec { + a.iter().zip(b.iter()).map(|(&x, &y)| x + y).collect() +} + +/// Element-wise subtraction of two arrays. +pub fn sub(a: &[f64], b: &[f64]) -> Vec { + a.iter().zip(b.iter()).map(|(&x, &y)| x - y).collect() +} + +/// Element-wise multiplication of two arrays. +pub fn mult(a: &[f64], b: &[f64]) -> Vec { + a.iter().zip(b.iter()).map(|(&x, &y)| x * y).collect() +} + +/// Element-wise division of two arrays (NaN where b=0). +pub fn div(a: &[f64], b: &[f64]) -> Vec { + a.iter() + .zip(b.iter()) + .map(|(&x, &y)| if y != 0.0 { x / y } else { f64::NAN }) + .collect() +} + +// --------------------------------------------------------------------------- +// Element-wise math transforms +// --------------------------------------------------------------------------- + +macro_rules! unary_transform { + ($name:ident, $method:ident) => { + pub fn $name(real: &[f64]) -> Vec { + real.iter().map(|&x| x.$method()).collect() + } + }; +} + +unary_transform!(math_acos, acos); +unary_transform!(math_asin, asin); +unary_transform!(math_atan, atan); +unary_transform!(math_ceil, ceil); +unary_transform!(math_cos, cos); +unary_transform!(math_cosh, cosh); +unary_transform!(math_exp, exp); +unary_transform!(math_floor, floor); +unary_transform!(math_ln, ln); +unary_transform!(math_log10, log10); +unary_transform!(math_sin, sin); +unary_transform!(math_sinh, sinh); +unary_transform!(math_sqrt, sqrt); +unary_transform!(math_tan, tan); +unary_transform!(math_tanh, tanh); + #[cfg(test)] mod tests { use super::*; diff --git a/crates/ferro_ta_core/src/momentum.rs b/crates/ferro_ta_core/src/momentum.rs index 648d74d..b70ac88 100644 --- a/crates/ferro_ta_core/src/momentum.rs +++ b/crates/ferro_ta_core/src/momentum.rs @@ -446,6 +446,435 @@ pub fn adxr(high: &[f64], low: &[f64], close: &[f64], timeperiod: usize) -> Vec< result } +// --------------------------------------------------------------------------- +// Rate of Change variants +// --------------------------------------------------------------------------- + +/// Rate of Change: `(close[i] - close[i-p]) / close[i-p] * 100`. +pub fn roc(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + for i in timeperiod..n { + let prev = close[i - timeperiod]; + if prev != 0.0 { + result[i] = (close[i] - prev) / prev * 100.0; + } + } + result +} + +/// Rate of Change Percentage: `(close[i] - close[i-p]) / close[i-p]`. +pub fn rocp(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + for i in timeperiod..n { + let prev = close[i - timeperiod]; + if prev != 0.0 { + result[i] = (close[i] - prev) / prev; + } + } + result +} + +/// Rate of Change Ratio: `close[i] / close[i-p]`. +pub fn rocr(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + for i in timeperiod..n { + let prev = close[i - timeperiod]; + if prev != 0.0 { + result[i] = close[i] / prev; + } + } + result +} + +/// Rate of Change Ratio x 100: `close[i] / close[i-p] * 100`. +pub fn rocr100(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + for i in timeperiod..n { + let prev = close[i - timeperiod]; + if prev != 0.0 { + result[i] = close[i] / prev * 100.0; + } + } + result +} + +// --------------------------------------------------------------------------- +// Williams %R +// --------------------------------------------------------------------------- + +/// Williams %R: `-100 * (HH - close) / (HH - LL)` over the window. +/// Returns values in `[-100, 0]`. +pub fn willr(high: &[f64], low: &[f64], close: &[f64], timeperiod: usize) -> Vec { + let n = high.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + for i in (timeperiod - 1)..n { + let start = i + 1 - timeperiod; + let mut highest = f64::NEG_INFINITY; + let mut lowest = f64::INFINITY; + for j in start..=i { + if high[j] > highest { + highest = high[j]; + } + if low[j] < lowest { + lowest = low[j]; + } + } + let range = highest - lowest; + result[i] = if range != 0.0 { + -100.0 * (highest - close[i]) / range + } else { + -50.0 + }; + } + result +} + +// --------------------------------------------------------------------------- +// Aroon +// --------------------------------------------------------------------------- + +/// Aroon indicator. Returns `(aroon_down, aroon_up)`. +pub fn aroon(high: &[f64], low: &[f64], timeperiod: usize) -> (Vec, Vec) { + let n = high.len(); + let mut aroon_down = vec![f64::NAN; n]; + let mut aroon_up = vec![f64::NAN; n]; + if timeperiod == 0 || n <= timeperiod { + return (aroon_down, aroon_up); + } + let period_f = timeperiod as f64; + let window_size = timeperiod + 1; + for i in timeperiod..n { + let start = i + 1 - window_size; + let mut max_val = high[start]; + let mut min_val = low[start]; + let mut max_idx = 0usize; + let mut min_idx = 0usize; + for j in 0..window_size { + if high[start + j] >= max_val { + max_val = high[start + j]; + max_idx = j; + } + if low[start + j] <= min_val { + min_val = low[start + j]; + min_idx = j; + } + } + aroon_up[i] = 100.0 * (max_idx as f64) / period_f; + aroon_down[i] = 100.0 * (min_idx as f64) / period_f; + } + (aroon_down, aroon_up) +} + +/// Aroon Oscillator: `aroon_up - aroon_down`. +pub fn aroonosc(high: &[f64], low: &[f64], timeperiod: usize) -> Vec { + let (down, up) = aroon(high, low, timeperiod); + up.iter() + .zip(down.iter()) + .map(|(&u, &d)| { + if u.is_nan() || d.is_nan() { + f64::NAN + } else { + u - d + } + }) + .collect() +} + +// --------------------------------------------------------------------------- +// CCI +// --------------------------------------------------------------------------- + +/// Commodity Channel Index: `(tp - SMA(tp)) / (0.015 * MAD)`. +pub fn cci(high: &[f64], low: &[f64], close: &[f64], timeperiod: usize) -> Vec { + let n = high.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + let tp: Vec = high + .iter() + .zip(low.iter()) + .zip(close.iter()) + .map(|((&h, &l), &c)| (h + l + c) / 3.0) + .collect(); + for i in (timeperiod - 1)..n { + let window = &tp[(i + 1 - timeperiod)..=i]; + let mean: f64 = window.iter().sum::() / timeperiod as f64; + let mad: f64 = window.iter().map(|&x| (x - mean).abs()).sum::() / timeperiod as f64; + result[i] = if mad != 0.0 { + (tp[i] - mean) / (0.015 * mad) + } else { + 0.0 + }; + } + result +} + +// --------------------------------------------------------------------------- +// BOP +// --------------------------------------------------------------------------- + +/// Balance of Power: `(close - open) / (high - low)`. +pub fn bop(open: &[f64], high: &[f64], low: &[f64], close: &[f64]) -> Vec { + open.iter() + .zip(high.iter()) + .zip(low.iter()) + .zip(close.iter()) + .map(|(((&o, &h), &l), &c)| { + let range = h - l; + if range != 0.0 { + (c - o) / range + } else { + 0.0 + } + }) + .collect() +} + +// --------------------------------------------------------------------------- +// Stochastic RSI +// --------------------------------------------------------------------------- + +/// Stochastic RSI. Returns `(fastk, fastd)`. +pub fn stochrsi( + close: &[f64], + timeperiod: usize, + fastk_period: usize, + fastd_period: usize, +) -> (Vec, Vec) { + let n = close.len(); + let nan_pair = || (vec![f64::NAN; n], vec![f64::NAN; n]); + if timeperiod == 0 || fastk_period == 0 || fastd_period == 0 { + return nan_pair(); + } + + let rsi_vals = rsi(close, timeperiod); + let rsi_warmup = timeperiod; + let k_warmup = rsi_warmup + fastk_period - 1; + let d_warmup = k_warmup + fastd_period - 1; + + let mut fastk = vec![f64::NAN; n]; + let mut fastd = vec![f64::NAN; n]; + + for i in k_warmup..n { + if rsi_vals[i].is_nan() { + continue; + } + let start = i + 1 - fastk_period; + if (start..=i).any(|j| rsi_vals[j].is_nan()) { + continue; + } + let mx = rsi_vals[start..=i] + .iter() + .cloned() + .fold(f64::NEG_INFINITY, f64::max); + let mn = rsi_vals[start..=i] + .iter() + .cloned() + .fold(f64::INFINITY, f64::min); + fastk[i] = if mx != mn { + 100.0 * (rsi_vals[i] - mn) / (mx - mn) + } else { + 50.0 + }; + } + + for i in d_warmup..n { + let start = i + 1 - fastd_period; + let window = &fastk[start..=i]; + if window.iter().all(|v| !v.is_nan()) { + fastd[i] = window.iter().sum::() / fastd_period as f64; + } + } + (fastk, fastd) +} + +// --------------------------------------------------------------------------- +// APO / PPO +// --------------------------------------------------------------------------- + +/// Absolute Price Oscillator: `fast EMA - slow EMA`. +pub fn apo(close: &[f64], fastperiod: usize, slowperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if fastperiod == 0 || slowperiod == 0 || fastperiod >= slowperiod { + return result; + } + let fast = crate::overlap::ema(close, fastperiod); + let slow = crate::overlap::ema(close, slowperiod); + let warmup = slowperiod - 1; + for i in warmup..n { + if !fast[i].is_nan() && !slow[i].is_nan() { + result[i] = fast[i] - slow[i]; + } + } + result +} + +/// Percentage Price Oscillator: `(fast EMA - slow EMA) / slow EMA * 100`. +/// Returns `(ppo_line, signal_line, histogram)`. +pub fn ppo( + close: &[f64], + fastperiod: usize, + slowperiod: usize, + signalperiod: usize, +) -> (Vec, Vec, Vec) { + let n = close.len(); + let nan3 = || (vec![f64::NAN; n], vec![f64::NAN; n], vec![f64::NAN; n]); + if fastperiod == 0 || slowperiod == 0 || signalperiod == 0 || fastperiod >= slowperiod { + return nan3(); + } + let fast = crate::overlap::ema(close, fastperiod); + let slow = crate::overlap::ema(close, slowperiod); + let warmup = slowperiod - 1; + + let mut ppo_line = vec![f64::NAN; n]; + for i in warmup..n { + if !fast[i].is_nan() && !slow[i].is_nan() && slow[i] != 0.0 { + ppo_line[i] = (fast[i] - slow[i]) / slow[i] * 100.0; + } + } + + // Signal line = EMA of PPO line (only over valid values) + let signal = crate::overlap::ema(&ppo_line, signalperiod); + let mut signal_line = vec![f64::NAN; n]; + let mut hist = vec![f64::NAN; n]; + let sig_warmup = warmup + signalperiod - 1; + for i in sig_warmup..n { + if !ppo_line[i].is_nan() && !signal[i].is_nan() { + signal_line[i] = signal[i]; + hist[i] = ppo_line[i] - signal[i]; + } + } + (ppo_line, signal_line, hist) +} + +// --------------------------------------------------------------------------- +// CMO +// --------------------------------------------------------------------------- + +/// Chande Momentum Oscillator: `100 * (sum_gains - sum_losses) / (sum_gains + sum_losses)`. +pub fn cmo(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod + 1 { + return result; + } + let changes: Vec = close.windows(2).map(|w| w[1] - w[0]).collect(); + for i in timeperiod..n { + let mut ups = 0.0_f64; + let mut downs = 0.0_f64; + for ch in &changes[(i - timeperiod)..i] { + if *ch > 0.0 { + ups += ch; + } else { + downs -= ch; + } + } + let denom = ups + downs; + result[i] = if denom != 0.0 { + 100.0 * (ups - downs) / denom + } else { + 0.0 + }; + } + result +} + +// --------------------------------------------------------------------------- +// TRIX +// --------------------------------------------------------------------------- + +/// TRIX: 1-period rate of change of triple-smoothed EMA. +pub fn trix(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + let warmup = 3 * (timeperiod - 1); + + // Triple EMA: EMA(EMA(EMA(close))) + let ema1 = crate::overlap::ema(close, timeperiod); + let ema2 = crate::overlap::ema(&ema1, timeperiod); + let ema3 = crate::overlap::ema(&ema2, timeperiod); + + for i in (warmup + 1)..n { + let prev = ema3[i - 1]; + if !ema3[i].is_nan() && !prev.is_nan() && prev != 0.0 { + result[i] = (ema3[i] - prev) / prev * 100.0; + } + } + result +} + +// --------------------------------------------------------------------------- +// Ultimate Oscillator +// --------------------------------------------------------------------------- + +/// Ultimate Oscillator: weighted average of buying pressure over three periods. +pub fn ultosc( + high: &[f64], + low: &[f64], + close: &[f64], + timeperiod1: usize, + timeperiod2: usize, + timeperiod3: usize, +) -> Vec { + let n = high.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod1 == 0 || timeperiod2 == 0 || timeperiod3 == 0 || n < 2 { + return result; + } + let max_period = timeperiod1.max(timeperiod2).max(timeperiod3); + if n <= max_period { + return result; + } + + let mut bp = vec![0.0_f64; n]; + let mut tr = vec![0.0_f64; n]; + for i in 1..n { + let true_low = low[i].min(close[i - 1]); + let true_high = high[i].max(close[i - 1]); + bp[i] = close[i] - true_low; + tr[i] = true_high - true_low; + } + + for i in max_period..n { + let avg = |period: usize| -> f64 { + let sum_bp: f64 = bp[(i + 1 - period)..=i].iter().sum(); + let sum_tr: f64 = tr[(i + 1 - period)..=i].iter().sum(); + if sum_tr != 0.0 { + sum_bp / sum_tr + } else { + 0.0 + } + }; + result[i] = + 100.0 * (4.0 * avg(timeperiod1) + 2.0 * avg(timeperiod2) + avg(timeperiod3)) / 7.0; + } + result +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/ferro_ta_core/src/overlap.rs b/crates/ferro_ta_core/src/overlap.rs index 93134b4..9404b0a 100644 --- a/crates/ferro_ta_core/src/overlap.rs +++ b/crates/ferro_ta_core/src/overlap.rs @@ -447,6 +447,526 @@ pub fn macd( (macd_line, signal_line, histogram) } +// --------------------------------------------------------------------------- +// DEMA — Double Exponential Moving Average +// --------------------------------------------------------------------------- + +/// Double Exponential Moving Average: `2*EMA - EMA(EMA)`. +pub fn dema(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + let warmup = 2 * (timeperiod - 1); + let ema1 = ema(close, timeperiod); + let ema2 = ema(&ema1, timeperiod); + for i in warmup..n { + if !ema1[i].is_nan() && !ema2[i].is_nan() { + result[i] = 2.0 * ema1[i] - ema2[i]; + } + } + result +} + +// --------------------------------------------------------------------------- +// TEMA — Triple Exponential Moving Average +// --------------------------------------------------------------------------- + +/// Triple Exponential Moving Average: `3*EMA - 3*EMA(EMA) + EMA(EMA(EMA))`. +pub fn tema(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + let warmup = 3 * (timeperiod - 1); + let ema1 = ema(close, timeperiod); + let ema2 = ema(&ema1, timeperiod); + let ema3 = ema(&ema2, timeperiod); + for i in warmup..n { + if !ema1[i].is_nan() && !ema2[i].is_nan() && !ema3[i].is_nan() { + result[i] = 3.0 * ema1[i] - 3.0 * ema2[i] + ema3[i]; + } + } + result +} + +// --------------------------------------------------------------------------- +// TRIMA — Triangular Moving Average +// --------------------------------------------------------------------------- + +/// Triangular Moving Average (triangle-weighted). +pub fn trima(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + let half = timeperiod.div_ceil(2); + let mut weights = Vec::with_capacity(timeperiod); + for i in 1..=timeperiod { + let w = if i <= half { i } else { timeperiod + 1 - i }; + weights.push(w as f64); + } + let weight_sum: f64 = weights.iter().sum(); + for i in (timeperiod - 1)..n { + let mut val = 0.0_f64; + for (j, &w) in weights.iter().enumerate() { + val += close[i - (timeperiod - 1 - j)] * w; + } + result[i] = val / weight_sum; + } + result +} + +// --------------------------------------------------------------------------- +// KAMA — Kaufman Adaptive Moving Average +// --------------------------------------------------------------------------- + +/// Kaufman Adaptive Moving Average. +pub fn kama(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + let fast_sc = 2.0 / 3.0_f64; + let slow_sc = 2.0 / 31.0_f64; + let mut kama_val = close[timeperiod - 1]; + result[timeperiod - 1] = kama_val; + for i in timeperiod..n { + let direction = (close[i] - close[i - timeperiod]).abs(); + let mut volatility = 0.0_f64; + for j in 1..=timeperiod { + volatility += (close[i - j + 1] - close[i - j]).abs(); + } + let er = if volatility > 0.0 { + direction / volatility + } else { + 0.0 + }; + let sc = (er * (fast_sc - slow_sc) + slow_sc).powi(2); + kama_val += sc * (close[i] - kama_val); + result[i] = kama_val; + } + result +} + +// --------------------------------------------------------------------------- +// T3 — Tillson T3 +// --------------------------------------------------------------------------- + +/// Tillson T3: 6x smoothed EMA with volume factor. +pub fn t3(close: &[f64], timeperiod: usize, vfactor: f64) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 { + return result; + } + let k = 2.0 / (timeperiod as f64 + 1.0); + let v = vfactor; + let c1 = -(v * v * v); + let c2 = 3.0 * v * v + 3.0 * v * v * v; + let c3 = -6.0 * v * v - 3.0 * v - 3.0 * v * v * v; + let c4 = 1.0 + 3.0 * v + v * v * v + 3.0 * v * v; + let warmup = 6 * (timeperiod - 1); + let mut e = [0.0_f64; 6]; + for (i, &price) in close.iter().enumerate() { + if i == 0 { + for ej in e.iter_mut() { + *ej = price; + } + } else { + e[0] += k * (price - e[0]); + for j in 1..6 { + e[j] += k * (e[j - 1] - e[j]); + } + } + if i >= warmup { + result[i] = c1 * e[5] + c2 * e[4] + c3 * e[3] + c4 * e[2]; + } + } + result +} + +// --------------------------------------------------------------------------- +// SAR — Parabolic SAR +// --------------------------------------------------------------------------- + +/// Parabolic SAR. +pub fn sar(high: &[f64], low: &[f64], acceleration: f64, maximum: f64) -> Vec { + let n = high.len(); + if n < 2 { + return vec![f64::NAN; n]; + } + let mut result = vec![f64::NAN; n]; + let mut is_rising = high[1] >= high[0]; + let mut af = acceleration; + let (mut ep, mut sar_val) = if is_rising { + (high[1], low[0]) + } else { + (low[1], high[0]) + }; + result[1] = sar_val; + for i in 2..n { + let prev_sar = sar_val; + sar_val = prev_sar + af * (ep - prev_sar); + if is_rising { + sar_val = sar_val.min(low[i - 1]).min(low[i - 2]); + if low[i] < sar_val { + is_rising = false; + sar_val = ep; + ep = low[i]; + af = acceleration; + } else if high[i] > ep { + ep = high[i]; + af = (af + acceleration).min(maximum); + } + } else { + sar_val = sar_val.max(high[i - 1]).max(high[i - 2]); + if high[i] > sar_val { + is_rising = true; + sar_val = ep; + ep = high[i]; + af = acceleration; + } else if low[i] < ep { + ep = low[i]; + af = (af + acceleration).min(maximum); + } + } + result[i] = sar_val; + } + result +} + +// --------------------------------------------------------------------------- +// SAREXT — Extended Parabolic SAR +// --------------------------------------------------------------------------- + +/// Parabolic SAR Extended with configurable acceleration factors. +#[allow(clippy::too_many_arguments)] +pub fn sarext( + high: &[f64], + low: &[f64], + startvalue: f64, + offsetonreverse: f64, + accelerationinitlong: f64, + accelerationlong: f64, + accelerationmaxlong: f64, + accelerationinitshort: f64, + accelerationshort: f64, + accelerationmaxshort: f64, +) -> Vec { + let n = high.len(); + if n < 2 { + return vec![f64::NAN; n]; + } + let mut result = vec![f64::NAN; n]; + let mut is_rising = high[1] >= high[0]; + let (mut af, mut af_step_cur, mut af_max_cur) = if is_rising { + (accelerationinitlong, accelerationlong, accelerationmaxlong) + } else { + ( + accelerationinitshort, + accelerationshort, + accelerationmaxshort, + ) + }; + let (mut ep, mut sar_val) = if is_rising { + ( + high[1], + if startvalue != 0.0 { + startvalue + } else { + low[0] + }, + ) + } else { + ( + low[1], + if startvalue != 0.0 { + -startvalue + } else { + high[0] + }, + ) + }; + result[1] = sar_val; + for i in 2..n { + let prev_sar = sar_val; + sar_val = prev_sar + af * (ep - prev_sar); + if is_rising { + sar_val = sar_val.min(low[i - 1]).min(low[i - 2]); + if low[i] < sar_val { + is_rising = false; + sar_val = ep + sar_val.abs() * offsetonreverse; + ep = low[i]; + af = accelerationinitshort; + af_step_cur = accelerationshort; + af_max_cur = accelerationmaxshort; + } else if high[i] > ep { + ep = high[i]; + af = (af + af_step_cur).min(af_max_cur); + } + } else { + sar_val = sar_val.max(high[i - 1]).max(high[i - 2]); + if high[i] > sar_val { + is_rising = true; + sar_val = ep - sar_val.abs() * offsetonreverse; + ep = high[i]; + af = accelerationinitlong; + af_step_cur = accelerationlong; + af_max_cur = accelerationmaxlong; + } else if low[i] < ep { + ep = low[i]; + af = (af + af_step_cur).min(af_max_cur); + } + } + result[i] = sar_val; + } + result +} + +// --------------------------------------------------------------------------- +// MAMA — MESA Adaptive Moving Average +// --------------------------------------------------------------------------- + +/// MESA Adaptive Moving Average. Returns `(mama, fama)`. +pub fn mama(close: &[f64], fastlimit: f64, slowlimit: f64) -> (Vec, Vec) { + let n = close.len(); + let lookback = 32; + let mut mama_arr = vec![f64::NAN; n]; + let mut fama_arr = vec![f64::NAN; n]; + if n <= lookback { + return (mama_arr, fama_arr); + } + + let mut smooth = vec![0.0f64; n]; + for i in 0..n { + smooth[i] = if i >= 3 { + (4.0 * close[i] + 3.0 * close[i - 1] + 2.0 * close[i - 2] + close[i - 3]) / 10.0 + } else { + close[i] + }; + } + + let mut detrender = vec![0.0f64; n]; + let mut q1 = vec![0.0f64; n]; + let mut i1 = vec![0.0f64; n]; + let mut ji = vec![0.0f64; n]; + let mut jq = vec![0.0f64; n]; + let mut i2 = vec![0.0f64; n]; + let mut q2 = vec![0.0f64; n]; + let mut re = vec![0.0f64; n]; + let mut im = vec![0.0f64; n]; + let mut period = vec![0.0f64; n]; + let mut phase = vec![0.0f64; n]; + let mut mama_val = close[0]; + let mut fama_val = close[0]; + + for i in 6..n { + let prev_period = period[i - 1].max(1.0); + let alpha = 0.075 * prev_period + 0.54; + detrender[i] = (0.0962 * smooth[i] + 0.5769 * smooth[i - 2] + - 0.5769 * smooth[i - 4] + - 0.0962 * smooth[i - 6]) + * alpha; + if i >= 12 { + q1[i] = (0.0962 * detrender[i] + 0.5769 * detrender[i - 2] + - 0.5769 * detrender[i - 4] + - 0.0962 * detrender[i - 6]) + * alpha; + } + if i >= 9 { + i1[i] = detrender[i - 3]; + } + if i >= 15 { + ji[i] = (0.0962 * i1[i] + 0.5769 * i1[i - 2] - 0.5769 * i1[i - 4] - 0.0962 * i1[i - 6]) + * alpha; + } + if i >= 18 { + jq[i] = (0.0962 * q1[i] + 0.5769 * q1[i - 2] - 0.5769 * q1[i - 4] - 0.0962 * q1[i - 6]) + * alpha; + } + let i2_raw = i1[i] - jq[i]; + let q2_raw = q1[i] + ji[i]; + i2[i] = 0.2 * i2_raw + 0.8 * i2[i - 1]; + q2[i] = 0.2 * q2_raw + 0.8 * q2[i - 1]; + re[i] = 0.2 * (i2[i] * i2[i - 1] + q2[i] * q2[i - 1]) + 0.8 * re[i - 1]; + im[i] = 0.2 * (i2[i] * q2[i - 1] - q2[i] * i2[i - 1]) + 0.8 * im[i - 1]; + let mut p = if re[i] != 0.0 && im[i] != 0.0 && re[i] > 0.0 { + std::f64::consts::PI * 2.0 / (im[i] / re[i]).atan() + } else { + prev_period + }; + p = p + .clamp(0.67 * prev_period, 1.5 * prev_period) + .clamp(6.0, 50.0); + period[i] = 0.2 * p + 0.8 * prev_period; + phase[i] = if i1[i] != 0.0 { + q1[i].atan2(i1[i]) * 180.0 / std::f64::consts::PI + } else if q1[i] > 0.0 { + 90.0 + } else if q1[i] < 0.0 { + -90.0 + } else { + 0.0 + }; + let mut delta_phase = phase[i - 1] - phase[i]; + if delta_phase < 1.0 { + delta_phase = 1.0; + } + let adaptive_alpha = (fastlimit / delta_phase).clamp(slowlimit, fastlimit); + if i >= lookback { + mama_val = adaptive_alpha * close[i] + (1.0 - adaptive_alpha) * mama_val; + fama_val = 0.5 * adaptive_alpha * mama_val + (1.0 - 0.5 * adaptive_alpha) * fama_val; + mama_arr[i] = mama_val; + fama_arr[i] = fama_val; + } else { + mama_val = close[i]; + fama_val = close[i]; + } + } + (mama_arr, fama_arr) +} + +// --------------------------------------------------------------------------- +// MIDPOINT / MIDPRICE +// --------------------------------------------------------------------------- + +/// Midpoint: `(max(close) + min(close)) / 2` over rolling window. +pub fn midpoint(close: &[f64], timeperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + for i in (timeperiod - 1)..n { + let window = &close[(i + 1 - timeperiod)..=i]; + let mx = window.iter().cloned().fold(f64::NEG_INFINITY, f64::max); + let mn = window.iter().cloned().fold(f64::INFINITY, f64::min); + result[i] = (mx + mn) / 2.0; + } + result +} + +/// MidPrice: `(highest_high + lowest_low) / 2` over rolling window. +pub fn midprice(high: &[f64], low: &[f64], timeperiod: usize) -> Vec { + let n = high.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + for i in (timeperiod - 1)..n { + let start = i + 1 - timeperiod; + let mx = high[start..=i] + .iter() + .cloned() + .fold(f64::NEG_INFINITY, f64::max); + let mn = low[start..=i].iter().cloned().fold(f64::INFINITY, f64::min); + result[i] = (mx + mn) / 2.0; + } + result +} + +// --------------------------------------------------------------------------- +// MACDFIX / MACDEXT +// --------------------------------------------------------------------------- + +/// MACD with fixed 12/26 periods. +pub fn macdfix(close: &[f64], signalperiod: usize) -> (Vec, Vec, Vec) { + macd(close, 12, 26, signalperiod) +} + +/// Compute MA by type: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=T3. +fn compute_ma_by_type(close: &[f64], timeperiod: usize, matype: u8) -> Vec { + match matype { + 0 => sma(close, timeperiod), + 1 => ema(close, timeperiod), + 2 => wma(close, timeperiod), + 3 => dema(close, timeperiod), + 4 => tema(close, timeperiod), + 5 => trima(close, timeperiod), + 6 => kama(close, timeperiod), + 7 => t3(close, timeperiod, 0.7), + _ => sma(close, timeperiod), + } +} + +/// MACD with configurable MA types for fast/slow/signal. +pub fn macdext( + close: &[f64], + fastperiod: usize, + fastmatype: u8, + slowperiod: usize, + slowmatype: u8, + signalperiod: usize, + signalmatype: u8, +) -> (Vec, Vec, Vec) { + let n = close.len(); + let nan3 = || (vec![f64::NAN; n], vec![f64::NAN; n], vec![f64::NAN; n]); + if fastperiod == 0 || slowperiod == 0 || signalperiod == 0 || fastperiod >= slowperiod { + return nan3(); + } + let fast_ma = compute_ma_by_type(close, fastperiod, fastmatype); + let slow_ma = compute_ma_by_type(close, slowperiod, slowmatype); + let macd_start = slowperiod - 1; + let mut macd_line = vec![f64::NAN; n]; + for i in macd_start..n { + if !fast_ma[i].is_nan() && !slow_ma[i].is_nan() { + macd_line[i] = fast_ma[i] - slow_ma[i]; + } + } + let macd_valid: Vec = macd_line[macd_start..].to_vec(); + let signal_slice = compute_ma_by_type(&macd_valid, signalperiod, signalmatype); + let mut signal_line = vec![f64::NAN; n]; + let warmup = macd_start + signalperiod - 1; + #[allow(clippy::needless_range_loop)] + for i in warmup..n { + let j = i - macd_start; + if j < signal_slice.len() && !signal_slice[j].is_nan() { + signal_line[i] = signal_slice[j]; + } + } + let mut histogram = vec![f64::NAN; n]; + for i in 0..n { + if !macd_line[i].is_nan() && !signal_line[i].is_nan() { + histogram[i] = macd_line[i] - signal_line[i]; + } + } + (macd_line, signal_line, histogram) +} + +// --------------------------------------------------------------------------- +// MA (generic dispatcher) / MAVP (variable period) +// --------------------------------------------------------------------------- + +/// Generic Moving Average. matype: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=T3. +pub fn ma(close: &[f64], timeperiod: usize, matype: u8) -> Vec { + compute_ma_by_type(close, timeperiod, matype) +} + +/// Moving Average with Variable Period per bar (SMA over period from periods array). +pub fn mavp(close: &[f64], periods: &[f64], minperiod: usize, maxperiod: usize) -> Vec { + let n = close.len(); + let mut result = vec![f64::NAN; n]; + if minperiod == 0 || maxperiod < minperiod { + return result; + } + for i in 0..n { + if i >= periods.len() { + break; + } + let p = (periods[i].round() as usize).clamp(minperiod, maxperiod); + if i + 1 >= p { + let sum: f64 = close[(i + 1 - p)..=i].iter().sum(); + result[i] = sum / p as f64; + } + } + result +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/ferro_ta_core/src/statistic.rs b/crates/ferro_ta_core/src/statistic.rs index d87ca26..694429c 100644 --- a/crates/ferro_ta_core/src/statistic.rs +++ b/crates/ferro_ta_core/src/statistic.rs @@ -24,6 +24,229 @@ pub fn stddev(real: &[f64], timeperiod: usize, nbdev: f64) -> Vec { result } +/// Rolling population variance, scaled by `nbdev²`. +pub fn var(real: &[f64], timeperiod: usize, nbdev: f64) -> Vec { + let n = real.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod < 1 || n < timeperiod { + return result; + } + for i in (timeperiod - 1)..n { + let window = &real[i + 1 - timeperiod..=i]; + let mean: f64 = window.iter().sum::() / timeperiod as f64; + let variance: f64 = + window.iter().map(|&x| (x - mean).powi(2)).sum::() / timeperiod as f64; + result[i] = variance * nbdev * nbdev; + } + result +} + +// --------------------------------------------------------------------------- +// Linear regression helpers +// --------------------------------------------------------------------------- + +fn rolling_linreg_apply(prices: &[f64], timeperiod: usize, mut map: F) -> Vec +where + F: FnMut(f64, f64) -> f64, +{ + let n = prices.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + let period = timeperiod as f64; + let last_x = (timeperiod - 1) as f64; + let sum_x = last_x * period / 2.0; + let sum_x2 = last_x * period * (2.0 * period - 1.0) / 6.0; + let denom = period * sum_x2 - sum_x * sum_x; + + let mut sum_y: f64 = prices[..timeperiod].iter().sum(); + let mut sum_xy: f64 = prices[..timeperiod] + .iter() + .enumerate() + .map(|(idx, &v)| idx as f64 * v) + .sum(); + + for end in (timeperiod - 1)..n { + let slope = if denom != 0.0 { + (period * sum_xy - sum_x * sum_y) / denom + } else { + 0.0 + }; + let intercept = (sum_y - slope * sum_x) / period; + result[end] = map(slope, intercept); + if end + 1 < n { + let outgoing = prices[end + 1 - timeperiod]; + let incoming = prices[end + 1]; + let prev_sum_y = sum_y; + sum_y = prev_sum_y - outgoing + incoming; + sum_xy = sum_xy - (prev_sum_y - outgoing) + last_x * incoming; + } + } + result +} + +/// Linear regression fitted value at the last point of the window. +pub fn linearreg(close: &[f64], timeperiod: usize) -> Vec { + let last_x = if timeperiod > 0 { + (timeperiod - 1) as f64 + } else { + 0.0 + }; + rolling_linreg_apply(close, timeperiod, |slope, intercept| { + intercept + slope * last_x + }) +} + +/// Slope of the rolling linear regression line. +pub fn linearreg_slope(close: &[f64], timeperiod: usize) -> Vec { + rolling_linreg_apply(close, timeperiod, |slope, _| slope) +} + +/// Intercept of the rolling linear regression line. +pub fn linearreg_intercept(close: &[f64], timeperiod: usize) -> Vec { + rolling_linreg_apply(close, timeperiod, |_, intercept| intercept) +} + +/// Angle of the regression line in degrees. +pub fn linearreg_angle(close: &[f64], timeperiod: usize) -> Vec { + rolling_linreg_apply(close, timeperiod, |slope, _| { + slope.atan() * 180.0 / std::f64::consts::PI + }) +} + +/// Time Series Forecast: linear regression extrapolated one period ahead. +pub fn tsf(close: &[f64], timeperiod: usize) -> Vec { + let forecast_x = timeperiod as f64; + rolling_linreg_apply(close, timeperiod, |slope, intercept| { + intercept + slope * forecast_x + }) +} + +// --------------------------------------------------------------------------- +// Beta (rolling, return-based) +// --------------------------------------------------------------------------- + +/// Rolling beta: regression of real1 daily returns on real0 daily returns. +pub fn beta(real0: &[f64], real1: &[f64], timeperiod: usize) -> Vec { + let n = real0.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n <= timeperiod { + return result; + } + + let price_return = |curr: f64, prev: f64| -> f64 { + if prev != 0.0 { + curr / prev - 1.0 + } else { + f64::NAN + } + }; + let rx: Vec = real0.windows(2).map(|w| price_return(w[1], w[0])).collect(); + let ry: Vec = real1.windows(2).map(|w| price_return(w[1], w[0])).collect(); + + let period = timeperiod as f64; + let mut sum_rx = 0.0_f64; + let mut sum_ry = 0.0_f64; + let mut sum_rx2 = 0.0_f64; + let mut sum_rxry = 0.0_f64; + let mut invalid = 0usize; + + for idx in 0..timeperiod { + let (ret_x, ret_y) = (rx[idx], ry[idx]); + if ret_x.is_finite() && ret_y.is_finite() { + sum_rx += ret_x; + sum_ry += ret_y; + sum_rx2 += ret_x * ret_x; + sum_rxry += ret_x * ret_y; + } else { + invalid += 1; + } + } + + for end in timeperiod..n { + result[end] = if invalid == 0 { + let denom = period * sum_rx2 - sum_rx * sum_rx; + if denom != 0.0 { + (period * sum_rxry - sum_rx * sum_ry) / denom + } else { + f64::NAN + } + } else { + f64::NAN + }; + + if end + 1 < n { + let out = end - timeperiod; + let (ox, oy) = (rx[out], ry[out]); + if ox.is_finite() && oy.is_finite() { + sum_rx -= ox; + sum_ry -= oy; + sum_rx2 -= ox * ox; + sum_rxry -= ox * oy; + } else { + invalid -= 1; + } + let (ix, iy) = (rx[end], ry[end]); + if ix.is_finite() && iy.is_finite() { + sum_rx += ix; + sum_ry += iy; + sum_rx2 += ix * ix; + sum_rxry += ix * iy; + } else { + invalid += 1; + } + } + } + result +} + +// --------------------------------------------------------------------------- +// Correlation (rolling Pearson) +// --------------------------------------------------------------------------- + +/// Rolling Pearson correlation coefficient between two series. +pub fn correl(real0: &[f64], real1: &[f64], timeperiod: usize) -> Vec { + let n = real0.len(); + let mut result = vec![f64::NAN; n]; + if timeperiod == 0 || n < timeperiod { + return result; + } + + let period = timeperiod as f64; + let mut sum_x: f64 = real0[..timeperiod].iter().sum(); + let mut sum_y: f64 = real1[..timeperiod].iter().sum(); + let mut sum_x2: f64 = real0[..timeperiod].iter().map(|v| v * v).sum(); + let mut sum_y2: f64 = real1[..timeperiod].iter().map(|v| v * v).sum(); + let mut sum_xy: f64 = real0[..timeperiod] + .iter() + .zip(real1[..timeperiod].iter()) + .map(|(&a, &b)| a * b) + .sum(); + + #[allow(clippy::needless_range_loop)] + for end in (timeperiod - 1)..n { + let denom_x = period * sum_x2 - sum_x * sum_x; + let denom_y = period * sum_y2 - sum_y * sum_y; + result[end] = if denom_x > 0.0 && denom_y > 0.0 { + (period * sum_xy - sum_x * sum_y) / (denom_x * denom_y).sqrt() + } else { + f64::NAN + }; + + if end + 1 < n { + let out = end + 1 - timeperiod; + let inc = end + 1; + sum_x += real0[inc] - real0[out]; + sum_y += real1[inc] - real1[out]; + sum_x2 += real0[inc] * real0[inc] - real0[out] * real0[out]; + sum_y2 += real1[inc] * real1[inc] - real1[out] * real1[out]; + sum_xy += real0[inc] * real1[inc] - real0[out] * real1[out]; + } + } + result +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/ferro_ta_core/src/volatility.rs b/crates/ferro_ta_core/src/volatility.rs index 277f69b..67778cf 100644 --- a/crates/ferro_ta_core/src/volatility.rs +++ b/crates/ferro_ta_core/src/volatility.rs @@ -62,6 +62,22 @@ pub fn trange(high: &[f64], low: &[f64], close: &[f64]) -> Vec { result } +/// Normalized Average True Range: `ATR / close * 100`. +pub fn natr(high: &[f64], low: &[f64], close: &[f64], timeperiod: usize) -> Vec { + let atr_vals = atr(high, low, close, timeperiod); + atr_vals + .iter() + .zip(close.iter()) + .map(|(&a, &c)| { + if a.is_nan() || c == 0.0 { + f64::NAN + } else { + a / c * 100.0 + } + }) + .collect() +} + #[cfg(test)] mod tests { use super::*; diff --git a/docs/api_manifest.json b/docs/api_manifest.json index 8cf0564..e9bc942 100644 --- a/docs/api_manifest.json +++ b/docs/api_manifest.json @@ -1,20 +1,6524 @@ { + "surfaces": { + "python": { + "indicator_count": 208, + "method_count": 447, + "categories": [ + "aggregation", + "alerts", + "batch", + "crypto", + "cycle", + "extended", + "features", + "math_ops", + "momentum", + "overlap", + "pattern", + "portfolio", + "price_transform", + "regime", + "resampling", + "signals", + "statistic", + "streaming", + "volatility", + "volume" + ], + "indicators": [ + { + "name": "ACOS", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "AD", + "category": "volume", + "module": "ferro_ta.indicators.volume", + "doc": "", + "params": [] + }, + { + "name": "ADD", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "ADOSC", + "category": "volume", + "module": "ferro_ta.indicators.volume", + "doc": "", + "params": [] + }, + { + "name": "ADX", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ADXR", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "APO", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "AROON", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "AROONOSC", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ASIN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "ATAN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "ATR", + "category": "volatility", + "module": "ferro_ta.indicators.volatility", + "doc": "", + "params": [] + }, + { + "name": "AVGPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "AlertEvent", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "AlertManager", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "BBANDS", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "BETA", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "BOP", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "CCI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "CDL2CROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3BLACKCROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3INSIDE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3LINESTRIKE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3OUTSIDE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3STARSINSOUTH", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3WHITESOLDIERS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLABANDONEDBABY", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLADVANCEBLOCK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLBELTHOLD", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLBREAKAWAY", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLCLOSINGMARUBOZU", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLCONCEALBABYSWALL", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLCOUNTERATTACK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDARKCLOUDCOVER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDOJISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDRAGONFLYDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLENGULFING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLEVENINGDOJISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLEVENINGSTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLGAPSIDESIDEWHITE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLGRAVESTONEDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHAMMER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHANGINGMAN", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHARAMI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHARAMICROSS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHIGHWAVE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHIKKAKE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHIKKAKEMOD", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHOMINGPIGEON", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLIDENTICAL3CROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLINNECK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLINVERTEDHAMMER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLKICKING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLKICKINGBYLENGTH", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLLADDERBOTTOM", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLLONGLEGGEDDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLLONGLINE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMARUBOZU", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMATCHINGLOW", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMATHOLD", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMORNINGDOJISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMORNINGSTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLONNECK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLPIERCING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLRICKSHAWMAN", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLRISEFALL3METHODS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSEPARATINGLINES", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSHOOTINGSTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSHORTLINE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSPINNINGTOP", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSTALLEDPATTERN", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSTICKSANDWICH", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTAKURI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTASUKIGAP", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTHRUSTING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTRISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLUNIQUE3RIVER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLUPSIDEGAP2CROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLXSIDEGAP3METHODS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CEIL", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "CHANDELIER_EXIT", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "CHOPPINESS_INDEX", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "CMO", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "CORREL", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "COS", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "COSH", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "DEMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "DIV", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "DONCHIAN", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "DX", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "EMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "EXP", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "FLOOR", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "HT_DCPERIOD", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_DCPHASE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_PHASOR", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_SINE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_TRENDLINE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_TRENDMODE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HULL_MA", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "ICHIMOKU", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "KAMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "KELTNER_CHANNELS", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_ANGLE", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_INTERCEPT", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_SLOPE", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "LOG10", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MACD", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MACDEXT", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MACDFIX", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MAMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MAVP", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MAX", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MAXINDEX", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MEDPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "MFI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MIDPOINT", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MIDPRICE", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MIN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MININDEX", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MINUS_DI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MINUS_DM", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MOM", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MULT", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "NATR", + "category": "volatility", + "module": "ferro_ta.indicators.volatility", + "doc": "", + "params": [] + }, + { + "name": "OBV", + "category": "volume", + "module": "ferro_ta.indicators.volume", + "doc": "", + "params": [] + }, + { + "name": "PIVOT_POINTS", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "PLUS_DI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "PLUS_DM", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "PPO", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROC", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROCP", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROCR", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROCR100", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "RSI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "SAR", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "SAREXT", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "SIN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SINH", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "SQRT", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "STDDEV", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "STOCH", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "STOCHF", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "STOCHRSI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "SUB", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SUM", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SUPERTREND", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "StreamingATR", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingBBands", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingEMA", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingMACD", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingRSI", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingSMA", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingStoch", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingSupertrend", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingVWAP", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "T3", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "TAN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "TANH", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "TEMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "TRANGE", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "TRIMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "TRIX", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "TSF", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "TYPPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "TickAggregator", + "category": "aggregation", + "module": "ferro_ta.data.aggregation", + "doc": "", + "params": [] + }, + { + "name": "ULTOSC", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "VAR", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "VWAP", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "VWMA", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "WCLPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "WILLR", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "WMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "aggregate_ticks", + "category": "aggregation", + "module": "ferro_ta.data.aggregation", + "doc": "", + "params": [] + }, + { + "name": "batch_apply", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "batch_ema", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "batch_rsi", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "batch_sma", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "beta", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "check_cross", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "check_threshold", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "collect_alert_bars", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "compose", + "category": "signals", + "module": "ferro_ta.analysis.signals", + "doc": "", + "params": [] + }, + { + "name": "compute_many", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "continuous_bar_labels", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "correlation_matrix", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "detect_breaks_cusum", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "drawdown", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "feature_matrix", + "category": "features", + "module": "ferro_ta.analysis.features", + "doc": "", + "params": [] + }, + { + "name": "funding_pnl", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "multi_timeframe", + "category": "resampling", + "module": "ferro_ta.data.resampling", + "doc": "", + "params": [] + }, + { + "name": "portfolio_volatility", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "rank_signals", + "category": "signals", + "module": "ferro_ta.analysis.signals", + "doc": "", + "params": [] + }, + { + "name": "regime", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "regime_adx", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "regime_combined", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "resample", + "category": "resampling", + "module": "ferro_ta.data.resampling", + "doc": "", + "params": [] + }, + { + "name": "resample_continuous", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "rolling_variance_break", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "screen", + "category": "signals", + "module": "ferro_ta.analysis.signals", + "doc": "", + "params": [] + }, + { + "name": "session_boundaries", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "structural_breaks", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "volume_bars", + "category": "resampling", + "module": "ferro_ta.data.resampling", + "doc": "", + "params": [] + } + ], + "methods": [ + { + "name": "TickAggregator", + "category": "aggregation", + "module": "ferro_ta.data.aggregation", + "doc": "", + "params": [] + }, + { + "name": "aggregate_ticks", + "category": "aggregation", + "module": "ferro_ta.data.aggregation", + "doc": "", + "params": [] + }, + { + "name": "AlertEvent", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "AlertManager", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "check_cross", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "check_threshold", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "collect_alert_bars", + "category": "alerts", + "module": "ferro_ta.tools.alerts", + "doc": "", + "params": [] + }, + { + "name": "TradeStats", + "category": "attribution", + "module": "ferro_ta.analysis.attribution", + "doc": "", + "params": [] + }, + { + "name": "attribution_by_month", + "category": "attribution", + "module": "ferro_ta.analysis.attribution", + "doc": "", + "params": [] + }, + { + "name": "attribution_by_signal", + "category": "attribution", + "module": "ferro_ta.analysis.attribution", + "doc": "", + "params": [] + }, + { + "name": "from_backtest", + "category": "attribution", + "module": "ferro_ta.analysis.attribution", + "doc": "", + "params": [] + }, + { + "name": "trade_stats", + "category": "attribution", + "module": "ferro_ta.analysis.attribution", + "doc": "", + "params": [] + }, + { + "name": "batch_apply", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "batch_ema", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "batch_rsi", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "batch_sma", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "compute_many", + "category": "batch", + "module": "ferro_ta.data.batch", + "doc": "", + "params": [] + }, + { + "name": "ratio", + "category": "cross_asset", + "module": "ferro_ta.analysis.cross_asset", + "doc": "", + "params": [] + }, + { + "name": "relative_strength", + "category": "cross_asset", + "module": "ferro_ta.analysis.cross_asset", + "doc": "", + "params": [] + }, + { + "name": "rolling_beta", + "category": "cross_asset", + "module": "ferro_ta.analysis.cross_asset", + "doc": "", + "params": [] + }, + { + "name": "spread", + "category": "cross_asset", + "module": "ferro_ta.analysis.cross_asset", + "doc": "", + "params": [] + }, + { + "name": "zscore", + "category": "cross_asset", + "module": "ferro_ta.analysis.cross_asset", + "doc": "", + "params": [] + }, + { + "name": "continuous_bar_labels", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "funding_pnl", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "resample_continuous", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "session_boundaries", + "category": "crypto", + "module": "ferro_ta.analysis.crypto", + "doc": "", + "params": [] + }, + { + "name": "HT_DCPERIOD", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_DCPHASE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_PHASOR", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_SINE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_TRENDLINE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "HT_TRENDMODE", + "category": "cycle", + "module": "ferro_ta.indicators.cycle", + "doc": "", + "params": [] + }, + { + "name": "PayoffLeg", + "category": "derivatives_payoff", + "module": "ferro_ta.analysis.derivatives_payoff", + "doc": "", + "params": [] + }, + { + "name": "aggregate_greeks", + "category": "derivatives_payoff", + "module": "ferro_ta.analysis.derivatives_payoff", + "doc": "", + "params": [] + }, + { + "name": "futures_leg_payoff", + "category": "derivatives_payoff", + "module": "ferro_ta.analysis.derivatives_payoff", + "doc": "", + "params": [] + }, + { + "name": "option_leg_payoff", + "category": "derivatives_payoff", + "module": "ferro_ta.analysis.derivatives_payoff", + "doc": "", + "params": [] + }, + { + "name": "strategy_payoff", + "category": "derivatives_payoff", + "module": "ferro_ta.analysis.derivatives_payoff", + "doc": "", + "params": [] + }, + { + "name": "CHANDELIER_EXIT", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "CHOPPINESS_INDEX", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "DONCHIAN", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "HULL_MA", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "ICHIMOKU", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "KELTNER_CHANNELS", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "PIVOT_POINTS", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "SUPERTREND", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "VWAP", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "VWMA", + "category": "extended", + "module": "ferro_ta.indicators.extended", + "doc": "", + "params": [] + }, + { + "name": "feature_matrix", + "category": "features", + "module": "ferro_ta.analysis.features", + "doc": "", + "params": [] + }, + { + "name": "CurveSummary", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "annualized_basis", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "back_adjusted_continuous_contract", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "basis", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "calendar_spreads", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "carry_spread", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "curve_slope", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "curve_summary", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "implied_carry_rate", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "parity_gap", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "ratio_adjusted_continuous_contract", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "roll_yield", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "synthetic_forward", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "synthetic_spot", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "weighted_continuous_contract", + "category": "futures", + "module": "ferro_ta.analysis.futures", + "doc": "", + "params": [] + }, + { + "name": "ACOS", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "ADD", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "ASIN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "ATAN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "CEIL", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "COS", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "COSH", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "DIV", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "EXP", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "FLOOR", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "LN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "LOG10", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MAX", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MAXINDEX", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MIN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MININDEX", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "MULT", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SIN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SINH", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SQRT", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SUB", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "SUM", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "TAN", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "TANH", + "category": "math_ops", + "module": "ferro_ta.indicators.math_ops", + "doc": "", + "params": [] + }, + { + "name": "ADX", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ADXR", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "APO", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "AROON", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "AROONOSC", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "BOP", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "CCI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "CMO", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "DX", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MFI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MINUS_DI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MINUS_DM", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "MOM", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "PLUS_DI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "PLUS_DM", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "PPO", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROC", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROCP", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROCR", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ROCR100", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "RSI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "STOCH", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "STOCHF", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "STOCHRSI", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "TRANGE", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "TRIX", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "ULTOSC", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "WILLR", + "category": "momentum", + "module": "ferro_ta.indicators.momentum", + "doc": "", + "params": [] + }, + { + "name": "OptionGreeks", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "SmileMetrics", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "black_76_price", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "black_scholes_price", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "greeks", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "implied_volatility", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "iv_percentile", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "iv_rank", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "iv_zscore", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "label_moneyness", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "option_price", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "select_strike", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "smile_metrics", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "term_structure_slope", + "category": "options", + "module": "ferro_ta.analysis.options", + "doc": "", + "params": [] + }, + { + "name": "DerivativesStrategy", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "ExpirySelector", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "ExpirySelectorKind", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "LegPreset", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "RiskControl", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "RiskMode", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "SimulationLimits", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "StrategyLeg", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "StrikeSelector", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "StrikeSelectorKind", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "build_strategy_preset", + "category": "options_strategy", + "module": "ferro_ta.analysis.options_strategy", + "doc": "", + "params": [] + }, + { + "name": "BBANDS", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "DEMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "EMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "KAMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MACD", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MACDEXT", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MACDFIX", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MAMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MAVP", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MIDPOINT", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "MIDPRICE", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "SAR", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "SAREXT", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "SMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "T3", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "TEMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "TRIMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "WMA", + "category": "overlap", + "module": "ferro_ta.indicators.overlap", + "doc": "", + "params": [] + }, + { + "name": "CDL2CROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3BLACKCROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3INSIDE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3LINESTRIKE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3OUTSIDE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3STARSINSOUTH", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDL3WHITESOLDIERS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLABANDONEDBABY", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLADVANCEBLOCK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLBELTHOLD", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLBREAKAWAY", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLCLOSINGMARUBOZU", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLCONCEALBABYSWALL", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLCOUNTERATTACK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDARKCLOUDCOVER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDOJISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLDRAGONFLYDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLENGULFING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLEVENINGDOJISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLEVENINGSTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLGAPSIDESIDEWHITE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLGRAVESTONEDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHAMMER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHANGINGMAN", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHARAMI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHARAMICROSS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHIGHWAVE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHIKKAKE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHIKKAKEMOD", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLHOMINGPIGEON", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLIDENTICAL3CROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLINNECK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLINVERTEDHAMMER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLKICKING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLKICKINGBYLENGTH", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLLADDERBOTTOM", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLLONGLEGGEDDOJI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLLONGLINE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMARUBOZU", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMATCHINGLOW", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMATHOLD", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMORNINGDOJISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLMORNINGSTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLONNECK", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLPIERCING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLRICKSHAWMAN", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLRISEFALL3METHODS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSEPARATINGLINES", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSHOOTINGSTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSHORTLINE", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSPINNINGTOP", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSTALLEDPATTERN", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLSTICKSANDWICH", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTAKURI", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTASUKIGAP", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTHRUSTING", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLTRISTAR", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLUNIQUE3RIVER", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLUPSIDEGAP2CROWS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "CDLXSIDEGAP3METHODS", + "category": "pattern", + "module": "ferro_ta.indicators.pattern", + "doc": "", + "params": [] + }, + { + "name": "beta", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "correlation_matrix", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "drawdown", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "portfolio_volatility", + "category": "portfolio", + "module": "ferro_ta.analysis.portfolio", + "doc": "", + "params": [] + }, + { + "name": "AVGPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "MEDPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "TYPPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "WCLPRICE", + "category": "price_transform", + "module": "ferro_ta.indicators.price_transform", + "doc": "", + "params": [] + }, + { + "name": "detect_breaks_cusum", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "regime", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "regime_adx", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "regime_combined", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "rolling_variance_break", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "structural_breaks", + "category": "regime", + "module": "ferro_ta.analysis.regime", + "doc": "", + "params": [] + }, + { + "name": "multi_timeframe", + "category": "resampling", + "module": "ferro_ta.data.resampling", + "doc": "", + "params": [] + }, + { + "name": "resample", + "category": "resampling", + "module": "ferro_ta.data.resampling", + "doc": "", + "params": [] + }, + { + "name": "volume_bars", + "category": "resampling", + "module": "ferro_ta.data.resampling", + "doc": "", + "params": [] + }, + { + "name": "compose", + "category": "signals", + "module": "ferro_ta.analysis.signals", + "doc": "", + "params": [] + }, + { + "name": "rank_signals", + "category": "signals", + "module": "ferro_ta.analysis.signals", + "doc": "", + "params": [] + }, + { + "name": "screen", + "category": "signals", + "module": "ferro_ta.analysis.signals", + "doc": "", + "params": [] + }, + { + "name": "BETA", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "CORREL", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_ANGLE", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_INTERCEPT", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_SLOPE", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "STDDEV", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "TSF", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "VAR", + "category": "statistic", + "module": "ferro_ta.indicators.statistic", + "doc": "", + "params": [] + }, + { + "name": "StreamingATR", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingBBands", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingEMA", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingMACD", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingRSI", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingSMA", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingStoch", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingSupertrend", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "StreamingVWAP", + "category": "streaming", + "module": "ferro_ta.data.streaming", + "doc": "", + "params": [] + }, + { + "name": "compute_indicator", + "category": "tools", + "module": "ferro_ta.tools.tools", + "doc": "", + "params": [] + }, + { + "name": "describe_indicator", + "category": "tools", + "module": "ferro_ta.tools.tools", + "doc": "", + "params": [] + }, + { + "name": "list_indicators", + "category": "tools", + "module": "ferro_ta.tools.tools", + "doc": "", + "params": [] + }, + { + "name": "run_backtest", + "category": "tools", + "module": "ferro_ta.tools.tools", + "doc": "", + "params": [] + }, + { + "name": "ACOS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "AD", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ADD", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ADOSC", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ADX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ADXR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "APO", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "AROON", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "AROONOSC", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ASIN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ATAN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ATR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "AVGPRICE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "BBANDS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "BETA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "BOP", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CCI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDL2CROWS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDL3BLACKCROWS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDL3INSIDE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDL3LINESTRIKE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDL3OUTSIDE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDL3STARSINSOUTH", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDL3WHITESOLDIERS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLABANDONEDBABY", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLADVANCEBLOCK", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLBELTHOLD", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLBREAKAWAY", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLCLOSINGMARUBOZU", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLCONCEALBABYSWALL", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLCOUNTERATTACK", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLDARKCLOUDCOVER", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLDOJI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLDOJISTAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLDRAGONFLYDOJI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLENGULFING", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLEVENINGDOJISTAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLEVENINGSTAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLGAPSIDESIDEWHITE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLGRAVESTONEDOJI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHAMMER", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHANGINGMAN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHARAMI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHARAMICROSS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHIGHWAVE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHIKKAKE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHIKKAKEMOD", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLHOMINGPIGEON", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLIDENTICAL3CROWS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLINNECK", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLINVERTEDHAMMER", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLKICKING", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLKICKINGBYLENGTH", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLLADDERBOTTOM", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLLONGLEGGEDDOJI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLLONGLINE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLMARUBOZU", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLMATCHINGLOW", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLMATHOLD", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLMORNINGDOJISTAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLMORNINGSTAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLONNECK", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLPIERCING", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLRICKSHAWMAN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLRISEFALL3METHODS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLSEPARATINGLINES", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLSHOOTINGSTAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLSHORTLINE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLSPINNINGTOP", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLSTALLEDPATTERN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLSTICKSANDWICH", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLTAKURI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLTASUKIGAP", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLTHRUSTING", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLTRISTAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLUNIQUE3RIVER", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLUPSIDEGAP2CROWS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CDLXSIDEGAP3METHODS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CEIL", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CHANDELIER_EXIT", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CHOPPINESS_INDEX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CMO", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "CORREL", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "COS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "COSH", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "DEMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "DIV", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "DONCHIAN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "DX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "EMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "EXP", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "FLOOR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "HT_DCPERIOD", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "HT_DCPHASE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "HT_PHASOR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "HT_SINE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "HT_TRENDLINE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "HT_TRENDMODE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "HULL_MA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ICHIMOKU", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "KAMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "KELTNER_CHANNELS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_ANGLE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_INTERCEPT", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "LINEARREG_SLOPE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "LN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "LOG10", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MACD", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MACDEXT", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MACDFIX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MAMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MAVP", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MAX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MAXINDEX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MEDPRICE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MFI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MIDPOINT", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MIDPRICE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MIN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MININDEX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MINUS_DI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MINUS_DM", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MOM", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "MULT", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "NATR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "OBV", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "PIVOT_POINTS", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "PLUS_DI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "PLUS_DM", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "PPO", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ROC", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ROCP", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ROCR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ROCR100", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "RSI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SAREXT", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SIN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SINH", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SQRT", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "STDDEV", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "STOCH", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "STOCHF", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "STOCHRSI", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SUB", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SUM", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "SUPERTREND", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "T3", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TAN", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TANH", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TEMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TRANGE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TRIMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TRIX", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TSF", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "TYPPRICE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "ULTOSC", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "VAR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "VWAP", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "VWMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "WCLPRICE", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "WILLR", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "WMA", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "__version__", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "about", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "benchmark", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "debug_mode", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "disable_debug", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "enable_debug", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "get_logger", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "indicators", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "info", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "log_call", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "methods", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "traced", + "category": "top_level", + "module": "ferro_ta", + "doc": "", + "params": [] + }, + { + "name": "plot", + "category": "viz", + "module": "ferro_ta.tools.viz", + "doc": "", + "params": [] + }, + { + "name": "ATR", + "category": "volatility", + "module": "ferro_ta.indicators.volatility", + "doc": "", + "params": [] + }, + { + "name": "NATR", + "category": "volatility", + "module": "ferro_ta.indicators.volatility", + "doc": "", + "params": [] + }, + { + "name": "TRANGE", + "category": "volatility", + "module": "ferro_ta.indicators.volatility", + "doc": "", + "params": [] + }, + { + "name": "AD", + "category": "volume", + "module": "ferro_ta.indicators.volume", + "doc": "", + "params": [] + }, + { + "name": "ADOSC", + "category": "volume", + "module": "ferro_ta.indicators.volume", + "doc": "", + "params": [] + }, + { + "name": "OBV", + "category": "volume", + "module": "ferro_ta.indicators.volume", + "doc": "", + "params": [] + } + ] + }, + "rust_core": { + "public_function_count": 331, + "functions": [ + { + "module": "aggregation", + "function": "aggregate_tick_bars", + "file": "aggregation.rs" + }, + { + "module": "aggregation", + "function": "aggregate_time_bars", + "file": "aggregation.rs" + }, + { + "module": "aggregation", + "function": "aggregate_volume_bars_ticks", + "file": "aggregation.rs" + }, + { + "module": "alerts", + "function": "check_cross", + "file": "alerts.rs" + }, + { + "module": "alerts", + "function": "check_threshold", + "file": "alerts.rs" + }, + { + "module": "alerts", + "function": "collect_alert_bars", + "file": "alerts.rs" + }, + { + "module": "attribution", + "function": "extract_trades", + "file": "attribution.rs" + }, + { + "module": "attribution", + "function": "monthly_contribution", + "file": "attribution.rs" + }, + { + "module": "attribution", + "function": "signal_attribution", + "file": "attribution.rs" + }, + { + "module": "attribution", + "function": "trade_stats", + "file": "attribution.rs" + }, + { + "module": "backtest", + "function": "backtest_core", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "backtest_multi_asset_core", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "backtest_ohlcv_core", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "close_position", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "commission_fraction", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "compute_performance_metrics", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "extract_trades_ohlcv", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "half_kelly_fraction", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "kelly_formula", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "kelly_fraction", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "lcg_index", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "lcg_next", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "macd_crossover_signals", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "monte_carlo_bootstrap", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "nan_to_num", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "new", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "new", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "on_bar", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "reset", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "resolve_commission_model", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "rsi_threshold_signals", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "single_asset_backtest", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "sma_crossover_signals", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "summary", + "file": "backtest.rs" + }, + { + "module": "backtest", + "function": "walk_forward_indices", + "file": "backtest.rs" + }, + { + "module": "batch", + "function": "batch_adx", + "file": "batch.rs" + }, + { + "module": "batch", + "function": "batch_atr", + "file": "batch.rs" + }, + { + "module": "batch", + "function": "batch_ema", + "file": "batch.rs" + }, + { + "module": "batch", + "function": "batch_rsi", + "file": "batch.rs" + }, + { + "module": "batch", + "function": "batch_sma", + "file": "batch.rs" + }, + { + "module": "batch", + "function": "batch_stoch", + "file": "batch.rs" + }, + { + "module": "batch", + "function": "run_close_indicators", + "file": "batch.rs" + }, + { + "module": "batch", + "function": "run_hlc_indicators", + "file": "batch.rs" + }, + { + "module": "chunked", + "function": "forward_fill_nan", + "file": "chunked.rs" + }, + { + "module": "chunked", + "function": "make_chunk_ranges", + "file": "chunked.rs" + }, + { + "module": "chunked", + "function": "stitch_chunks", + "file": "chunked.rs" + }, + { + "module": "chunked", + "function": "trim_overlap", + "file": "chunked.rs" + }, + { + "module": "commission", + "function": "cost_fraction", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "equity_delivery_india", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "equity_intraday_india", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "from_json", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "futures_india", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "options_india", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "proportional", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "short_borrow_cost", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "to_json", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "total_cost", + "file": "commission.rs" + }, + { + "module": "commission", + "function": "zero", + "file": "commission.rs" + }, + { + "module": "crypto", + "function": "continuous_bar_labels", + "file": "crypto.rs" + }, + { + "module": "crypto", + "function": "funding_cumulative_pnl", + "file": "crypto.rs" + }, + { + "module": "crypto", + "function": "mark_session_boundaries", + "file": "crypto.rs" + }, + { + "module": "currency", + "function": "format", + "file": "currency.rs" + }, + { + "module": "currency", + "function": "from_code", + "file": "currency.rs" + }, + { + "module": "cycle", + "function": "compute_ht_core", + "file": "cycle.rs" + }, + { + "module": "cycle", + "function": "ht_dcperiod", + "file": "cycle.rs" + }, + { + "module": "cycle", + "function": "ht_dcphase", + "file": "cycle.rs" + }, + { + "module": "cycle", + "function": "ht_phasor", + "file": "cycle.rs" + }, + { + "module": "cycle", + "function": "ht_sine", + "file": "cycle.rs" + }, + { + "module": "cycle", + "function": "ht_trendline", + "file": "cycle.rs" + }, + { + "module": "cycle", + "function": "ht_trendmode", + "file": "cycle.rs" + }, + { + "module": "extended", + "function": "chandelier_exit", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "choppiness_index", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "donchian", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "hull_ma", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "ichimoku", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "keltner_channels", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "pivot_points", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "supertrend", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "vwap", + "file": "extended.rs" + }, + { + "module": "extended", + "function": "vwma", + "file": "extended.rs" + }, + { + "module": "futures.basis", + "function": "annualized_basis", + "file": "futures/basis.rs" + }, + { + "module": "futures.basis", + "function": "basis", + "file": "futures/basis.rs" + }, + { + "module": "futures.basis", + "function": "carry_spread", + "file": "futures/basis.rs" + }, + { + "module": "futures.basis", + "function": "implied_carry_rate", + "file": "futures/basis.rs" + }, + { + "module": "futures.curve", + "function": "calendar_spreads", + "file": "futures/curve.rs" + }, + { + "module": "futures.curve", + "function": "curve_slope", + "file": "futures/curve.rs" + }, + { + "module": "futures.curve", + "function": "curve_summary", + "file": "futures/curve.rs" + }, + { + "module": "futures.roll", + "function": "back_adjusted_continuous", + "file": "futures/roll.rs" + }, + { + "module": "futures.roll", + "function": "ratio_adjusted_continuous", + "file": "futures/roll.rs" + }, + { + "module": "futures.roll", + "function": "roll_yield", + "file": "futures/roll.rs" + }, + { + "module": "futures.roll", + "function": "weighted_continuous", + "file": "futures/roll.rs" + }, + { + "module": "futures.synthetic", + "function": "parity_gap", + "file": "futures/synthetic.rs" + }, + { + "module": "futures.synthetic", + "function": "synthetic_forward", + "file": "futures/synthetic.rs" + }, + { + "module": "futures.synthetic", + "function": "synthetic_spot", + "file": "futures/synthetic.rs" + }, + { + "module": "math", + "function": "add", + "file": "math.rs" + }, + { + "module": "math", + "function": "div", + "file": "math.rs" + }, + { + "module": "math", + "function": "max", + "file": "math.rs" + }, + { + "module": "math", + "function": "min", + "file": "math.rs" + }, + { + "module": "math", + "function": "mult", + "file": "math.rs" + }, + { + "module": "math", + "function": "sliding_max", + "file": "math.rs" + }, + { + "module": "math", + "function": "sliding_min", + "file": "math.rs" + }, + { + "module": "math", + "function": "sub", + "file": "math.rs" + }, + { + "module": "math", + "function": "sum", + "file": "math.rs" + }, + { + "module": "math_ops", + "function": "rolling_max", + "file": "math_ops.rs" + }, + { + "module": "math_ops", + "function": "rolling_maxindex", + "file": "math_ops.rs" + }, + { + "module": "math_ops", + "function": "rolling_min", + "file": "math_ops.rs" + }, + { + "module": "math_ops", + "function": "rolling_minindex", + "file": "math_ops.rs" + }, + { + "module": "math_ops", + "function": "rolling_sum", + "file": "math_ops.rs" + }, + { + "module": "momentum", + "function": "adx", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "adx_all", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "adxr", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "apo", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "aroon", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "aroonosc", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "bop", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "cci", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "cmo", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "dx", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "minus_di", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "minus_dm", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "mom", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "plus_di", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "plus_dm", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "ppo", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "roc", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "rocp", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "rocr", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "rocr100", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "rsi", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "stoch", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "stochrsi", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "trix", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "ultosc", + "file": "momentum.rs" + }, + { + "module": "momentum", + "function": "willr", + "file": "momentum.rs" + }, + { + "module": "options.chain", + "function": "atm_index", + "file": "options/chain.rs" + }, + { + "module": "options.chain", + "function": "label_moneyness", + "file": "options/chain.rs" + }, + { + "module": "options.chain", + "function": "select_strike_by_delta", + "file": "options/chain.rs" + }, + { + "module": "options.chain", + "function": "select_strike_by_offset", + "file": "options/chain.rs" + }, + { + "module": "options.greeks", + "function": "black_76_greeks", + "file": "options/greeks.rs" + }, + { + "module": "options.greeks", + "function": "black_scholes_greeks", + "file": "options/greeks.rs" + }, + { + "module": "options.greeks", + "function": "model_greeks", + "file": "options/greeks.rs" + }, + { + "module": "options.greeks", + "function": "model_theta", + "file": "options/greeks.rs" + }, + { + "module": "options.iv", + "function": "implied_volatility", + "file": "options/iv.rs" + }, + { + "module": "options.iv", + "function": "iv_percentile", + "file": "options/iv.rs" + }, + { + "module": "options.iv", + "function": "iv_rank", + "file": "options/iv.rs" + }, + { + "module": "options.iv", + "function": "iv_zscore", + "file": "options/iv.rs" + }, + { + "module": "options.mod", + "function": "sign", + "file": "options/mod.rs" + }, + { + "module": "options.normal", + "function": "cdf", + "file": "options/normal.rs" + }, + { + "module": "options.normal", + "function": "pdf", + "file": "options/normal.rs" + }, + { + "module": "options.pricing", + "function": "black_76_price", + "file": "options/pricing.rs" + }, + { + "module": "options.pricing", + "function": "black_scholes_price", + "file": "options/pricing.rs" + }, + { + "module": "options.pricing", + "function": "model_price", + "file": "options/pricing.rs" + }, + { + "module": "options.pricing", + "function": "price_lower_bound", + "file": "options/pricing.rs" + }, + { + "module": "options.pricing", + "function": "price_upper_bound", + "file": "options/pricing.rs" + }, + { + "module": "options.surface", + "function": "atm_iv", + "file": "options/surface.rs" + }, + { + "module": "options.surface", + "function": "linear_interpolate", + "file": "options/surface.rs" + }, + { + "module": "options.surface", + "function": "smile_metrics", + "file": "options/surface.rs" + }, + { + "module": "options.surface", + "function": "term_structure_slope", + "file": "options/surface.rs" + }, + { + "module": "overlap", + "function": "bbands", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "dema", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "ema", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "kama", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "ma", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "macd", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "macdext", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "macdfix", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "mama", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "mavp", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "midpoint", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "midprice", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "sar", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "sarext", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "sma", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "sma_into", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "t3", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "tema", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "trima", + "file": "overlap.rs" + }, + { + "module": "overlap", + "function": "wma", + "file": "overlap.rs" + }, + { + "module": "pattern", + "function": "body_size", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "candle_range", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdl2crows", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdl3blackcrows", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdl3inside", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdl3linestrike", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdl3outside", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdl3starsinsouth", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdl3whitesoldiers", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlabandonedbaby", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdladvanceblock", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlbelthold", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlbreakaway", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlclosingmarubozu", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlconcealbabyswall", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlcounterattack", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdldarkcloudcover", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdldoji", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdldojistar", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdldragonflydoji", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlengulfing", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdleveningdojistar", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdleveningstar", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlgapsidesidewhite", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlgravestonedoji", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlhammer", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlhangingman", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlharami", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlharamicross", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlhighwave", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlhikkake", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlhikkakemod", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlhomingpigeon", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlidentical3crows", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlinneck", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlinvertedhammer", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlkicking", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlkickingbylength", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlladderbottom", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdllongleggeddoji", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdllongline", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlmarubozu", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlmatchinglow", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlmathold", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlmorningdojistar", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlmorningstar", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlonneck", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlpiercing", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlrickshawman", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlrisefall3methods", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlseparatinglines", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlshootingstar", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlshortline", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlspinningtop", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlstalledpattern", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlsticksandwich", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdltakuri", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdltasukigap", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlthrusting", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdltristar", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlunique3river", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlupsidegap2crows", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "cdlxsidegap3methods", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "is_bearish", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "is_bullish", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "lower_shadow", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "upper_shadow", + "file": "pattern.rs" + }, + { + "module": "pattern", + "function": "validate_ohlc", + "file": "pattern.rs" + }, + { + "module": "portfolio", + "function": "beta_full", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "compose_weighted", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "correlation_matrix", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "drawdown_series", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "portfolio_volatility", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "ratio", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "relative_strength", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "rolling_beta", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "spread", + "file": "portfolio.rs" + }, + { + "module": "portfolio", + "function": "zscore_series", + "file": "portfolio.rs" + }, + { + "module": "price_transform", + "function": "avgprice", + "file": "price_transform.rs" + }, + { + "module": "price_transform", + "function": "medprice", + "file": "price_transform.rs" + }, + { + "module": "price_transform", + "function": "typprice", + "file": "price_transform.rs" + }, + { + "module": "price_transform", + "function": "wclprice", + "file": "price_transform.rs" + }, + { + "module": "regime", + "function": "detect_breaks_cusum", + "file": "regime.rs" + }, + { + "module": "regime", + "function": "regime_adx", + "file": "regime.rs" + }, + { + "module": "regime", + "function": "regime_combined", + "file": "regime.rs" + }, + { + "module": "regime", + "function": "rolling_variance_break", + "file": "regime.rs" + }, + { + "module": "resampling", + "function": "ohlcv_agg", + "file": "resampling.rs" + }, + { + "module": "resampling", + "function": "volume_bars", + "file": "resampling.rs" + }, + { + "module": "signals", + "function": "bottom_n_indices", + "file": "signals.rs" + }, + { + "module": "signals", + "function": "compose_rank", + "file": "signals.rs" + }, + { + "module": "signals", + "function": "rank_values", + "file": "signals.rs" + }, + { + "module": "signals", + "function": "top_n_indices", + "file": "signals.rs" + }, + { + "module": "statistic", + "function": "beta", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "correl", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "linearreg", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "linearreg_angle", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "linearreg_intercept", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "linearreg_slope", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "stddev", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "tsf", + "file": "statistic.rs" + }, + { + "module": "statistic", + "function": "var", + "file": "statistic.rs" + }, + { + "module": "streaming", + "function": "fast_period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "new", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "reset", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "signal_period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "slow_period", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "streaming", + "function": "update", + "file": "streaming.rs" + }, + { + "module": "volatility", + "function": "atr", + "file": "volatility.rs" + }, + { + "module": "volatility", + "function": "natr", + "file": "volatility.rs" + }, + { + "module": "volatility", + "function": "trange", + "file": "volatility.rs" + }, + { + "module": "volume", + "function": "ad", + "file": "volume.rs" + }, + { + "module": "volume", + "function": "adosc", + "file": "volume.rs" + }, + { + "module": "volume", + "function": "mfi", + "file": "volume.rs" + }, + { + "module": "volume", + "function": "obv", + "file": "volume.rs" + } + ] + }, + "wasm_node": { + "export_count": 205, + "exports": [ + "ad", + "adosc", + "adx", + "adx_all", + "adxr", + "aggregate_tick_bars", + "aggregate_time_bars", + "aggregate_volume_bars_ticks", + "annualized_basis", + "apo", + "aroon", + "aroonosc", + "atm_index", + "atm_iv", + "atr", + "avgprice", + "back_adjusted_continuous", + "backtest_core", + "batch_adx", + "batch_atr", + "batch_ema", + "batch_rsi", + "batch_sma", + "batch_stoch", + "bbands", + "beta_full", + "beta_rolling", + "black_76_greeks", + "black_76_price", + "black_scholes_greeks", + "black_scholes_price", + "bop", + "bottom_n_indices", + "calendar_spreads", + "carry_spread", + "cci", + "chandelier_exit", + "check_cross", + "check_threshold", + "choppiness_index", + "cmo", + "collect_alert_bars", + "compose_rank", + "compose_weighted", + "compute_performance_metrics", + "continuous_bar_labels", + "correl", + "correlation_matrix", + "curve_slope", + "curve_summary", + "dema", + "detect_breaks_cusum", + "donchian", + "drawdown_series", + "dx", + "ema", + "exchange_charges_rate", + "extract_trades", + "fast_period", + "flat_per_order", + "forward_fill_nan", + "funding_cumulative_pnl", + "futures_basis", + "gst_rate", + "half_kelly_fraction", + "ht_dcperiod", + "ht_dcphase", + "ht_phasor", + "ht_sine", + "ht_trendline", + "ht_trendmode", + "hull_ma", + "ichimoku", + "implied_carry_rate", + "implied_volatility", + "iv_percentile", + "iv_rank", + "iv_zscore", + "kama", + "kelly_fraction", + "keltner_channels", + "label_moneyness", + "linear_interpolate", + "linearreg", + "linearreg_angle", + "linearreg_intercept", + "linearreg_slope", + "lot_size", + "ma", + "macd", + "macd_crossover_signals", + "macdfix", + "make_chunk_ranges", + "mama", + "mark_session_boundaries", + "math_add", + "math_div", + "math_mult", + "math_sub", + "mavp", + "max_brokerage", + "medprice", + "mfi", + "midpoint", + "midprice", + "minus_di", + "minus_dm", + "model_greeks", + "model_price", + "model_theta", + "mom", + "monte_carlo_bootstrap", + "monthly_contribution", + "natr", + "new", + "obv", + "ohlcv_agg", + "parity_gap", + "per_lot", + "period", + "pivot_points", + "plus_di", + "plus_dm", + "portfolio_volatility", + "ppo", + "price_lower_bound", + "price_upper_bound", + "rank_series", + "rank_values", + "rate_of_value", + "ratio", + "ratio_adjusted_continuous", + "regime_adx", + "regime_combined", + "regulatory_charges_rate", + "relative_strength", + "roc", + "rocp", + "rocr", + "rocr100", + "roll_yield", + "rolling_beta", + "rolling_max", + "rolling_maxindex", + "rolling_min", + "rolling_minindex", + "rolling_sum", + "rolling_variance_break", + "rsi", + "rsi_threshold_signals", + "sar", + "select_strike_by_offset", + "set_exchange_charges_rate", + "set_flat_per_order", + "set_gst_rate", + "set_lot_size", + "set_max_brokerage", + "set_per_lot", + "set_rate_of_value", + "set_regulatory_charges_rate", + "set_stamp_duty_rate", + "set_stt_on_buy", + "set_stt_on_sell", + "set_stt_rate", + "signal_attribution", + "signal_period", + "single_asset_backtest", + "slow_period", + "sma", + "sma_crossover_signals", + "spread", + "stamp_duty_rate", + "stddev", + "stitch_chunks", + "stoch", + "stochf", + "stochrsi", + "stt_on_buy", + "stt_on_sell", + "stt_rate", + "supertrend", + "synthetic_forward", + "synthetic_spot", + "t3", + "tema", + "term_structure_slope", + "top_n_indices", + "trade_stats", + "trange", + "trim_overlap", + "trima", + "trix_indicator", + "tsf", + "typprice", + "ultosc", + "var", + "volume_bars", + "vwap", + "vwma", + "walk_forward_indices", + "wclprice", + "weighted_continuous", + "willr", + "wma", + "zscore_series" + ] + } + }, "parity_summary": { + "python_indicator_count": 207, + "wasm_export_count": 205, + "common_python_wasm_count": 91, "common_python_wasm": [ "ad", "adosc", "adx", + "adxr", + "apo", + "aroon", + "aroonosc", "atr", "avgprice", + "batch_ema", + "batch_rsi", + "batch_sma", "bbands", + "bop", + "cci", "chandelier_exit", "check_cross", "check_threshold", "choppiness_index", + "cmo", "collect_alert_bars", "continuous_bar_labels", + "correl", + "correlation_matrix", + "dema", "detect_breaks_cusum", "donchian", + "dx", "ema", "ht_dcperiod", "ht_dcphase", @@ -24,48 +6528,71 @@ "ht_trendmode", "hull_ma", "ichimoku", + "kama", "keltner_channels", + "linearreg", + "linearreg_angle", + "linearreg_intercept", + "linearreg_slope", + "ma", "macd", + "macdfix", + "mama", + "mavp", "medprice", "mfi", + "midpoint", + "midprice", + "minus_di", + "minus_dm", "mom", + "natr", "obv", "pivot_points", + "plus_di", + "plus_dm", + "portfolio_volatility", + "ppo", "regime_adx", "regime_combined", + "roc", + "rocp", + "rocr", + "rocr100", "rolling_variance_break", "rsi", + "sar", "sma", + "stddev", + "stoch", "stochf", + "stochrsi", "supertrend", + "t3", + "tema", + "trange", + "trima", + "tsf", "typprice", + "ultosc", + "var", "volume_bars", "vwap", "vwma", "wclprice", + "willr", "wma" ], - "common_python_wasm_count": 43, - "python_indicator_count": 207, "python_only_vs_wasm": [ "acos", "add", - "adxr", "aggregate_ticks", "alertevent", "alertmanager", - "apo", - "aroon", - "aroonosc", "asin", "atan", "batch_apply", - "batch_ema", - "batch_rsi", - "batch_sma", "beta", - "bop", - "cci", "cdl2crows", "cdl3blackcrows", "cdl3inside", @@ -128,66 +6655,35 @@ "cdlupsidegap2crows", "cdlxsidegap3methods", "ceil", - "cmo", "compose", "compute_many", - "correl", - "correlation_matrix", "cos", "cosh", - "dema", "div", "drawdown", - "dx", "exp", "feature_matrix", "floor", "funding_pnl", - "kama", - "linearreg", - "linearreg_angle", - "linearreg_intercept", - "linearreg_slope", "ln", "log10", - "ma", "macdext", - "macdfix", - "mama", - "mavp", "max", "maxindex", - "midpoint", - "midprice", "min", "minindex", - "minus_di", - "minus_dm", "mult", "multi_timeframe", - "natr", - "plus_di", - "plus_dm", - "portfolio_volatility", - "ppo", "rank_signals", "regime", "resample", "resample_continuous", - "roc", - "rocp", - "rocr", - "rocr100", - "sar", "sarext", "screen", "session_boundaries", "sin", "sinh", "sqrt", - "stddev", - "stoch", - "stochrsi", "streamingatr", "streamingbbands", "streamingema", @@ -200,51 +6696,93 @@ "structural_breaks", "sub", "sum", - "t3", "tan", "tanh", - "tema", "tickaggregator", - "trange", - "trima", - "trix", - "tsf", - "ultosc", - "var", - "willr" + "trix" ], - "wasm_export_count": 95, "wasm_only_vs_python": [ + "adx_all", "aggregate_tick_bars", "aggregate_time_bars", "aggregate_volume_bars_ticks", + "annualized_basis", + "atm_index", + "atm_iv", + "back_adjusted_continuous", + "backtest_core", + "batch_adx", + "batch_atr", + "batch_stoch", "beta_full", + "beta_rolling", + "black_76_greeks", + "black_76_price", + "black_scholes_greeks", + "black_scholes_price", "bottom_n_indices", + "calendar_spreads", + "carry_spread", + "compose_rank", + "compose_weighted", + "compute_performance_metrics", + "curve_slope", + "curve_summary", "drawdown_series", "exchange_charges_rate", "extract_trades", + "fast_period", "flat_per_order", "forward_fill_nan", "funding_cumulative_pnl", + "futures_basis", "gst_rate", + "half_kelly_fraction", + "implied_carry_rate", + "implied_volatility", + "iv_percentile", + "iv_rank", + "iv_zscore", + "kelly_fraction", + "label_moneyness", + "linear_interpolate", "lot_size", + "macd_crossover_signals", "make_chunk_ranges", + "mark_session_boundaries", + "math_add", + "math_div", + "math_mult", + "math_sub", "max_brokerage", + "model_greeks", + "model_price", + "model_theta", + "monte_carlo_bootstrap", "monthly_contribution", "new", "ohlcv_agg", + "parity_gap", "per_lot", + "period", + "price_lower_bound", + "price_upper_bound", "rank_series", + "rank_values", "rate_of_value", "ratio", + "ratio_adjusted_continuous", "regulatory_charges_rate", "relative_strength", + "roll_yield", "rolling_beta", "rolling_max", "rolling_maxindex", "rolling_min", "rolling_minindex", "rolling_sum", + "rsi_threshold_signals", + "select_strike_by_offset", "set_exchange_charges_rate", "set_flat_per_order", "set_gst_rate", @@ -258,6182 +6796,26 @@ "set_stt_on_sell", "set_stt_rate", "signal_attribution", + "signal_period", + "single_asset_backtest", + "slow_period", + "sma_crossover_signals", "spread", "stamp_duty_rate", + "stitch_chunks", "stt_on_buy", "stt_on_sell", "stt_rate", + "synthetic_forward", + "synthetic_spot", + "term_structure_slope", "top_n_indices", "trade_stats", "trim_overlap", + "trix_indicator", + "walk_forward_indices", + "weighted_continuous", "zscore_series" ] - }, - "surfaces": { - "python": { - "categories": [ - "aggregation", - "alerts", - "batch", - "crypto", - "cycle", - "extended", - "features", - "math_ops", - "momentum", - "overlap", - "pattern", - "portfolio", - "price_transform", - "regime", - "resampling", - "signals", - "statistic", - "streaming", - "volatility", - "volume" - ], - "indicator_count": 208, - "indicators": [ - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ACOS", - "params": [] - }, - { - "category": "volume", - "doc": "", - "module": "ferro_ta.indicators.volume", - "name": "AD", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ADD", - "params": [] - }, - { - "category": "volume", - "doc": "", - "module": "ferro_ta.indicators.volume", - "name": "ADOSC", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ADX", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ADXR", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "APO", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "AROON", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "AROONOSC", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ASIN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ATAN", - "params": [] - }, - { - "category": "volatility", - "doc": "", - "module": "ferro_ta.indicators.volatility", - "name": "ATR", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "AVGPRICE", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "AlertEvent", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "AlertManager", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "BBANDS", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "BETA", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "BOP", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "CCI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL2CROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3BLACKCROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3INSIDE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3LINESTRIKE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3OUTSIDE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3STARSINSOUTH", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3WHITESOLDIERS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLABANDONEDBABY", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLADVANCEBLOCK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLBELTHOLD", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLBREAKAWAY", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLCLOSINGMARUBOZU", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLCONCEALBABYSWALL", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLCOUNTERATTACK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDARKCLOUDCOVER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDOJISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDRAGONFLYDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLENGULFING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLEVENINGDOJISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLEVENINGSTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLGAPSIDESIDEWHITE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLGRAVESTONEDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHAMMER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHANGINGMAN", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHARAMI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHARAMICROSS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHIGHWAVE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHIKKAKE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHIKKAKEMOD", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHOMINGPIGEON", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLIDENTICAL3CROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLINNECK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLINVERTEDHAMMER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLKICKING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLKICKINGBYLENGTH", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLLADDERBOTTOM", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLLONGLEGGEDDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLLONGLINE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMARUBOZU", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMATCHINGLOW", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMATHOLD", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMORNINGDOJISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMORNINGSTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLONNECK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLPIERCING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLRICKSHAWMAN", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLRISEFALL3METHODS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSEPARATINGLINES", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSHOOTINGSTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSHORTLINE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSPINNINGTOP", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSTALLEDPATTERN", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSTICKSANDWICH", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTAKURI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTASUKIGAP", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTHRUSTING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTRISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLUNIQUE3RIVER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLUPSIDEGAP2CROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLXSIDEGAP3METHODS", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "CEIL", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "CHANDELIER_EXIT", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "CHOPPINESS_INDEX", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "CMO", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "CORREL", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "COS", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "COSH", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "DEMA", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "DIV", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "DONCHIAN", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "DX", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "EMA", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "EXP", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "FLOOR", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_DCPERIOD", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_DCPHASE", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_PHASOR", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_SINE", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_TRENDLINE", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_TRENDMODE", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "HULL_MA", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "ICHIMOKU", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "KAMA", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "KELTNER_CHANNELS", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG_ANGLE", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG_INTERCEPT", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG_SLOPE", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "LN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "LOG10", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MACD", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MACDEXT", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MACDFIX", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MAMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MAVP", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MAX", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MAXINDEX", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "MEDPRICE", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MFI", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MIDPOINT", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MIDPRICE", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MIN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MININDEX", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MINUS_DI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MINUS_DM", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MOM", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MULT", - "params": [] - }, - { - "category": "volatility", - "doc": "", - "module": "ferro_ta.indicators.volatility", - "name": "NATR", - "params": [] - }, - { - "category": "volume", - "doc": "", - "module": "ferro_ta.indicators.volume", - "name": "OBV", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "PIVOT_POINTS", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "PLUS_DI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "PLUS_DM", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "PPO", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROC", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROCP", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROCR", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROCR100", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "RSI", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "SAR", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "SAREXT", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SIN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SINH", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "SMA", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SQRT", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "STDDEV", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "STOCH", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "STOCHF", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "STOCHRSI", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SUB", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SUM", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "SUPERTREND", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingATR", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingBBands", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingEMA", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingMACD", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingRSI", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingSMA", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingStoch", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingSupertrend", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingVWAP", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "T3", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "TAN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "TANH", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "TEMA", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "TRANGE", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "TRIMA", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "TRIX", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "TSF", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "TYPPRICE", - "params": [] - }, - { - "category": "aggregation", - "doc": "", - "module": "ferro_ta.data.aggregation", - "name": "TickAggregator", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ULTOSC", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "VAR", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "VWAP", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "VWMA", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "WCLPRICE", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "WILLR", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "WMA", - "params": [] - }, - { - "category": "aggregation", - "doc": "", - "module": "ferro_ta.data.aggregation", - "name": "aggregate_ticks", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_apply", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_ema", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_rsi", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_sma", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "beta", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "check_cross", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "check_threshold", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "collect_alert_bars", - "params": [] - }, - { - "category": "signals", - "doc": "", - "module": "ferro_ta.analysis.signals", - "name": "compose", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "compute_many", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "continuous_bar_labels", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "correlation_matrix", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "detect_breaks_cusum", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "drawdown", - "params": [] - }, - { - "category": "features", - "doc": "", - "module": "ferro_ta.analysis.features", - "name": "feature_matrix", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "funding_pnl", - "params": [] - }, - { - "category": "resampling", - "doc": "", - "module": "ferro_ta.data.resampling", - "name": "multi_timeframe", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "portfolio_volatility", - "params": [] - }, - { - "category": "signals", - "doc": "", - "module": "ferro_ta.analysis.signals", - "name": "rank_signals", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "regime", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "regime_adx", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "regime_combined", - "params": [] - }, - { - "category": "resampling", - "doc": "", - "module": "ferro_ta.data.resampling", - "name": "resample", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "resample_continuous", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "rolling_variance_break", - "params": [] - }, - { - "category": "signals", - "doc": "", - "module": "ferro_ta.analysis.signals", - "name": "screen", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "session_boundaries", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "structural_breaks", - "params": [] - }, - { - "category": "resampling", - "doc": "", - "module": "ferro_ta.data.resampling", - "name": "volume_bars", - "params": [] - } - ], - "method_count": 447, - "methods": [ - { - "category": "aggregation", - "doc": "", - "module": "ferro_ta.data.aggregation", - "name": "TickAggregator", - "params": [] - }, - { - "category": "aggregation", - "doc": "", - "module": "ferro_ta.data.aggregation", - "name": "aggregate_ticks", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "AlertEvent", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "AlertManager", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "check_cross", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "check_threshold", - "params": [] - }, - { - "category": "alerts", - "doc": "", - "module": "ferro_ta.tools.alerts", - "name": "collect_alert_bars", - "params": [] - }, - { - "category": "attribution", - "doc": "", - "module": "ferro_ta.analysis.attribution", - "name": "TradeStats", - "params": [] - }, - { - "category": "attribution", - "doc": "", - "module": "ferro_ta.analysis.attribution", - "name": "attribution_by_month", - "params": [] - }, - { - "category": "attribution", - "doc": "", - "module": "ferro_ta.analysis.attribution", - "name": "attribution_by_signal", - "params": [] - }, - { - "category": "attribution", - "doc": "", - "module": "ferro_ta.analysis.attribution", - "name": "from_backtest", - "params": [] - }, - { - "category": "attribution", - "doc": "", - "module": "ferro_ta.analysis.attribution", - "name": "trade_stats", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_apply", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_ema", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_rsi", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "batch_sma", - "params": [] - }, - { - "category": "batch", - "doc": "", - "module": "ferro_ta.data.batch", - "name": "compute_many", - "params": [] - }, - { - "category": "cross_asset", - "doc": "", - "module": "ferro_ta.analysis.cross_asset", - "name": "ratio", - "params": [] - }, - { - "category": "cross_asset", - "doc": "", - "module": "ferro_ta.analysis.cross_asset", - "name": "relative_strength", - "params": [] - }, - { - "category": "cross_asset", - "doc": "", - "module": "ferro_ta.analysis.cross_asset", - "name": "rolling_beta", - "params": [] - }, - { - "category": "cross_asset", - "doc": "", - "module": "ferro_ta.analysis.cross_asset", - "name": "spread", - "params": [] - }, - { - "category": "cross_asset", - "doc": "", - "module": "ferro_ta.analysis.cross_asset", - "name": "zscore", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "continuous_bar_labels", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "funding_pnl", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "resample_continuous", - "params": [] - }, - { - "category": "crypto", - "doc": "", - "module": "ferro_ta.analysis.crypto", - "name": "session_boundaries", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_DCPERIOD", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_DCPHASE", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_PHASOR", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_SINE", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_TRENDLINE", - "params": [] - }, - { - "category": "cycle", - "doc": "", - "module": "ferro_ta.indicators.cycle", - "name": "HT_TRENDMODE", - "params": [] - }, - { - "category": "derivatives_payoff", - "doc": "", - "module": "ferro_ta.analysis.derivatives_payoff", - "name": "PayoffLeg", - "params": [] - }, - { - "category": "derivatives_payoff", - "doc": "", - "module": "ferro_ta.analysis.derivatives_payoff", - "name": "aggregate_greeks", - "params": [] - }, - { - "category": "derivatives_payoff", - "doc": "", - "module": "ferro_ta.analysis.derivatives_payoff", - "name": "futures_leg_payoff", - "params": [] - }, - { - "category": "derivatives_payoff", - "doc": "", - "module": "ferro_ta.analysis.derivatives_payoff", - "name": "option_leg_payoff", - "params": [] - }, - { - "category": "derivatives_payoff", - "doc": "", - "module": "ferro_ta.analysis.derivatives_payoff", - "name": "strategy_payoff", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "CHANDELIER_EXIT", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "CHOPPINESS_INDEX", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "DONCHIAN", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "HULL_MA", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "ICHIMOKU", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "KELTNER_CHANNELS", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "PIVOT_POINTS", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "SUPERTREND", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "VWAP", - "params": [] - }, - { - "category": "extended", - "doc": "", - "module": "ferro_ta.indicators.extended", - "name": "VWMA", - "params": [] - }, - { - "category": "features", - "doc": "", - "module": "ferro_ta.analysis.features", - "name": "feature_matrix", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "CurveSummary", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "annualized_basis", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "back_adjusted_continuous_contract", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "basis", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "calendar_spreads", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "carry_spread", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "curve_slope", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "curve_summary", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "implied_carry_rate", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "parity_gap", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "ratio_adjusted_continuous_contract", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "roll_yield", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "synthetic_forward", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "synthetic_spot", - "params": [] - }, - { - "category": "futures", - "doc": "", - "module": "ferro_ta.analysis.futures", - "name": "weighted_continuous_contract", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ACOS", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ADD", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ASIN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "ATAN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "CEIL", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "COS", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "COSH", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "DIV", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "EXP", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "FLOOR", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "LN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "LOG10", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MAX", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MAXINDEX", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MIN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MININDEX", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "MULT", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SIN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SINH", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SQRT", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SUB", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "SUM", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "TAN", - "params": [] - }, - { - "category": "math_ops", - "doc": "", - "module": "ferro_ta.indicators.math_ops", - "name": "TANH", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ADX", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ADXR", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "APO", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "AROON", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "AROONOSC", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "BOP", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "CCI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "CMO", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "DX", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MFI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MINUS_DI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MINUS_DM", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "MOM", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "PLUS_DI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "PLUS_DM", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "PPO", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROC", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROCP", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROCR", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ROCR100", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "RSI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "STOCH", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "STOCHF", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "STOCHRSI", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "TRANGE", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "TRIX", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "ULTOSC", - "params": [] - }, - { - "category": "momentum", - "doc": "", - "module": "ferro_ta.indicators.momentum", - "name": "WILLR", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "OptionGreeks", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "SmileMetrics", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "black_76_price", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "black_scholes_price", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "greeks", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "implied_volatility", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "iv_percentile", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "iv_rank", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "iv_zscore", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "label_moneyness", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "option_price", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "select_strike", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "smile_metrics", - "params": [] - }, - { - "category": "options", - "doc": "", - "module": "ferro_ta.analysis.options", - "name": "term_structure_slope", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "DerivativesStrategy", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "ExpirySelector", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "ExpirySelectorKind", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "LegPreset", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "RiskControl", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "RiskMode", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "SimulationLimits", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "StrategyLeg", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "StrikeSelector", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "StrikeSelectorKind", - "params": [] - }, - { - "category": "options_strategy", - "doc": "", - "module": "ferro_ta.analysis.options_strategy", - "name": "build_strategy_preset", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "BBANDS", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "DEMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "EMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "KAMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MACD", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MACDEXT", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MACDFIX", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MAMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MAVP", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MIDPOINT", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "MIDPRICE", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "SAR", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "SAREXT", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "SMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "T3", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "TEMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "TRIMA", - "params": [] - }, - { - "category": "overlap", - "doc": "", - "module": "ferro_ta.indicators.overlap", - "name": "WMA", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL2CROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3BLACKCROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3INSIDE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3LINESTRIKE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3OUTSIDE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3STARSINSOUTH", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDL3WHITESOLDIERS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLABANDONEDBABY", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLADVANCEBLOCK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLBELTHOLD", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLBREAKAWAY", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLCLOSINGMARUBOZU", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLCONCEALBABYSWALL", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLCOUNTERATTACK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDARKCLOUDCOVER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDOJISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLDRAGONFLYDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLENGULFING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLEVENINGDOJISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLEVENINGSTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLGAPSIDESIDEWHITE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLGRAVESTONEDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHAMMER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHANGINGMAN", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHARAMI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHARAMICROSS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHIGHWAVE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHIKKAKE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHIKKAKEMOD", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLHOMINGPIGEON", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLIDENTICAL3CROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLINNECK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLINVERTEDHAMMER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLKICKING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLKICKINGBYLENGTH", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLLADDERBOTTOM", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLLONGLEGGEDDOJI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLLONGLINE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMARUBOZU", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMATCHINGLOW", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMATHOLD", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMORNINGDOJISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLMORNINGSTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLONNECK", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLPIERCING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLRICKSHAWMAN", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLRISEFALL3METHODS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSEPARATINGLINES", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSHOOTINGSTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSHORTLINE", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSPINNINGTOP", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSTALLEDPATTERN", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLSTICKSANDWICH", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTAKURI", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTASUKIGAP", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTHRUSTING", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLTRISTAR", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLUNIQUE3RIVER", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLUPSIDEGAP2CROWS", - "params": [] - }, - { - "category": "pattern", - "doc": "", - "module": "ferro_ta.indicators.pattern", - "name": "CDLXSIDEGAP3METHODS", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "beta", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "correlation_matrix", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "drawdown", - "params": [] - }, - { - "category": "portfolio", - "doc": "", - "module": "ferro_ta.analysis.portfolio", - "name": "portfolio_volatility", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "AVGPRICE", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "MEDPRICE", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "TYPPRICE", - "params": [] - }, - { - "category": "price_transform", - "doc": "", - "module": "ferro_ta.indicators.price_transform", - "name": "WCLPRICE", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "detect_breaks_cusum", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "regime", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "regime_adx", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "regime_combined", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "rolling_variance_break", - "params": [] - }, - { - "category": "regime", - "doc": "", - "module": "ferro_ta.analysis.regime", - "name": "structural_breaks", - "params": [] - }, - { - "category": "resampling", - "doc": "", - "module": "ferro_ta.data.resampling", - "name": "multi_timeframe", - "params": [] - }, - { - "category": "resampling", - "doc": "", - "module": "ferro_ta.data.resampling", - "name": "resample", - "params": [] - }, - { - "category": "resampling", - "doc": "", - "module": "ferro_ta.data.resampling", - "name": "volume_bars", - "params": [] - }, - { - "category": "signals", - "doc": "", - "module": "ferro_ta.analysis.signals", - "name": "compose", - "params": [] - }, - { - "category": "signals", - "doc": "", - "module": "ferro_ta.analysis.signals", - "name": "rank_signals", - "params": [] - }, - { - "category": "signals", - "doc": "", - "module": "ferro_ta.analysis.signals", - "name": "screen", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "BETA", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "CORREL", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG_ANGLE", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG_INTERCEPT", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "LINEARREG_SLOPE", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "STDDEV", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "TSF", - "params": [] - }, - { - "category": "statistic", - "doc": "", - "module": "ferro_ta.indicators.statistic", - "name": "VAR", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingATR", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingBBands", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingEMA", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingMACD", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingRSI", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingSMA", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingStoch", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingSupertrend", - "params": [] - }, - { - "category": "streaming", - "doc": "", - "module": "ferro_ta.data.streaming", - "name": "StreamingVWAP", - "params": [] - }, - { - "category": "tools", - "doc": "", - "module": "ferro_ta.tools.tools", - "name": "compute_indicator", - "params": [] - }, - { - "category": "tools", - "doc": "", - "module": "ferro_ta.tools.tools", - "name": "describe_indicator", - "params": [] - }, - { - "category": "tools", - "doc": "", - "module": "ferro_ta.tools.tools", - "name": "list_indicators", - "params": [] - }, - { - "category": "tools", - "doc": "", - "module": "ferro_ta.tools.tools", - "name": "run_backtest", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ACOS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "AD", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ADD", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ADOSC", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ADX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ADXR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "APO", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "AROON", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "AROONOSC", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ASIN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ATAN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ATR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "AVGPRICE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "BBANDS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "BETA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "BOP", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CCI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDL2CROWS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDL3BLACKCROWS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDL3INSIDE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDL3LINESTRIKE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDL3OUTSIDE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDL3STARSINSOUTH", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDL3WHITESOLDIERS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLABANDONEDBABY", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLADVANCEBLOCK", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLBELTHOLD", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLBREAKAWAY", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLCLOSINGMARUBOZU", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLCONCEALBABYSWALL", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLCOUNTERATTACK", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLDARKCLOUDCOVER", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLDOJI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLDOJISTAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLDRAGONFLYDOJI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLENGULFING", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLEVENINGDOJISTAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLEVENINGSTAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLGAPSIDESIDEWHITE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLGRAVESTONEDOJI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHAMMER", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHANGINGMAN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHARAMI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHARAMICROSS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHIGHWAVE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHIKKAKE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHIKKAKEMOD", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLHOMINGPIGEON", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLIDENTICAL3CROWS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLINNECK", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLINVERTEDHAMMER", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLKICKING", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLKICKINGBYLENGTH", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLLADDERBOTTOM", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLLONGLEGGEDDOJI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLLONGLINE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLMARUBOZU", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLMATCHINGLOW", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLMATHOLD", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLMORNINGDOJISTAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLMORNINGSTAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLONNECK", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLPIERCING", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLRICKSHAWMAN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLRISEFALL3METHODS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLSEPARATINGLINES", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLSHOOTINGSTAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLSHORTLINE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLSPINNINGTOP", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLSTALLEDPATTERN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLSTICKSANDWICH", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLTAKURI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLTASUKIGAP", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLTHRUSTING", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLTRISTAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLUNIQUE3RIVER", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLUPSIDEGAP2CROWS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CDLXSIDEGAP3METHODS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CEIL", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CHANDELIER_EXIT", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CHOPPINESS_INDEX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CMO", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "CORREL", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "COS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "COSH", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "DEMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "DIV", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "DONCHIAN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "DX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "EMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "EXP", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "FLOOR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "HT_DCPERIOD", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "HT_DCPHASE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "HT_PHASOR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "HT_SINE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "HT_TRENDLINE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "HT_TRENDMODE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "HULL_MA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ICHIMOKU", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "KAMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "KELTNER_CHANNELS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "LINEARREG", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "LINEARREG_ANGLE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "LINEARREG_INTERCEPT", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "LINEARREG_SLOPE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "LN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "LOG10", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MACD", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MACDEXT", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MACDFIX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MAMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MAVP", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MAX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MAXINDEX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MEDPRICE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MFI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MIDPOINT", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MIDPRICE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MIN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MININDEX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MINUS_DI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MINUS_DM", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MOM", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "MULT", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "NATR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "OBV", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "PIVOT_POINTS", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "PLUS_DI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "PLUS_DM", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "PPO", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ROC", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ROCP", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ROCR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ROCR100", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "RSI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SAREXT", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SIN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SINH", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SQRT", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "STDDEV", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "STOCH", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "STOCHF", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "STOCHRSI", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SUB", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SUM", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "SUPERTREND", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "T3", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TAN", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TANH", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TEMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TRANGE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TRIMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TRIX", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TSF", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "TYPPRICE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "ULTOSC", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "VAR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "VWAP", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "VWMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "WCLPRICE", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "WILLR", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "WMA", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "__version__", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "about", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "benchmark", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "debug_mode", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "disable_debug", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "enable_debug", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "get_logger", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "indicators", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "info", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "log_call", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "methods", - "params": [] - }, - { - "category": "top_level", - "doc": "", - "module": "ferro_ta", - "name": "traced", - "params": [] - }, - { - "category": "viz", - "doc": "", - "module": "ferro_ta.tools.viz", - "name": "plot", - "params": [] - }, - { - "category": "volatility", - "doc": "", - "module": "ferro_ta.indicators.volatility", - "name": "ATR", - "params": [] - }, - { - "category": "volatility", - "doc": "", - "module": "ferro_ta.indicators.volatility", - "name": "NATR", - "params": [] - }, - { - "category": "volatility", - "doc": "", - "module": "ferro_ta.indicators.volatility", - "name": "TRANGE", - "params": [] - }, - { - "category": "volume", - "doc": "", - "module": "ferro_ta.indicators.volume", - "name": "AD", - "params": [] - }, - { - "category": "volume", - "doc": "", - "module": "ferro_ta.indicators.volume", - "name": "ADOSC", - "params": [] - }, - { - "category": "volume", - "doc": "", - "module": "ferro_ta.indicators.volume", - "name": "OBV", - "params": [] - } - ] - }, - "rust_core": { - "functions": [ - { - "file": "aggregation.rs", - "function": "aggregate_tick_bars", - "module": "aggregation" - }, - { - "file": "aggregation.rs", - "function": "aggregate_time_bars", - "module": "aggregation" - }, - { - "file": "aggregation.rs", - "function": "aggregate_volume_bars_ticks", - "module": "aggregation" - }, - { - "file": "alerts.rs", - "function": "check_cross", - "module": "alerts" - }, - { - "file": "alerts.rs", - "function": "check_threshold", - "module": "alerts" - }, - { - "file": "alerts.rs", - "function": "collect_alert_bars", - "module": "alerts" - }, - { - "file": "attribution.rs", - "function": "extract_trades", - "module": "attribution" - }, - { - "file": "attribution.rs", - "function": "monthly_contribution", - "module": "attribution" - }, - { - "file": "attribution.rs", - "function": "signal_attribution", - "module": "attribution" - }, - { - "file": "attribution.rs", - "function": "trade_stats", - "module": "attribution" - }, - { - "file": "backtest.rs", - "function": "backtest_core", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "backtest_multi_asset_core", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "backtest_ohlcv_core", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "close_position", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "commission_fraction", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "compute_performance_metrics", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "extract_trades_ohlcv", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "half_kelly_fraction", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "kelly_formula", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "kelly_fraction", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "lcg_index", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "lcg_next", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "macd_crossover_signals", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "monte_carlo_bootstrap", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "nan_to_num", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "new", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "new", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "on_bar", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "reset", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "resolve_commission_model", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "rsi_threshold_signals", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "single_asset_backtest", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "sma_crossover_signals", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "summary", - "module": "backtest" - }, - { - "file": "backtest.rs", - "function": "walk_forward_indices", - "module": "backtest" - }, - { - "file": "batch.rs", - "function": "batch_adx", - "module": "batch" - }, - { - "file": "batch.rs", - "function": "batch_atr", - "module": "batch" - }, - { - "file": "batch.rs", - "function": "batch_ema", - "module": "batch" - }, - { - "file": "batch.rs", - "function": "batch_rsi", - "module": "batch" - }, - { - "file": "batch.rs", - "function": "batch_sma", - "module": "batch" - }, - { - "file": "batch.rs", - "function": "batch_stoch", - "module": "batch" - }, - { - "file": "batch.rs", - "function": "run_close_indicators", - "module": "batch" - }, - { - "file": "batch.rs", - "function": "run_hlc_indicators", - "module": "batch" - }, - { - "file": "chunked.rs", - "function": "forward_fill_nan", - "module": "chunked" - }, - { - "file": "chunked.rs", - "function": "make_chunk_ranges", - "module": "chunked" - }, - { - "file": "chunked.rs", - "function": "stitch_chunks", - "module": "chunked" - }, - { - "file": "chunked.rs", - "function": "trim_overlap", - "module": "chunked" - }, - { - "file": "commission.rs", - "function": "cost_fraction", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "equity_delivery_india", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "equity_intraday_india", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "from_json", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "futures_india", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "options_india", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "proportional", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "short_borrow_cost", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "to_json", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "total_cost", - "module": "commission" - }, - { - "file": "commission.rs", - "function": "zero", - "module": "commission" - }, - { - "file": "crypto.rs", - "function": "continuous_bar_labels", - "module": "crypto" - }, - { - "file": "crypto.rs", - "function": "funding_cumulative_pnl", - "module": "crypto" - }, - { - "file": "crypto.rs", - "function": "mark_session_boundaries", - "module": "crypto" - }, - { - "file": "currency.rs", - "function": "format", - "module": "currency" - }, - { - "file": "currency.rs", - "function": "from_code", - "module": "currency" - }, - { - "file": "cycle.rs", - "function": "compute_ht_core", - "module": "cycle" - }, - { - "file": "cycle.rs", - "function": "ht_dcperiod", - "module": "cycle" - }, - { - "file": "cycle.rs", - "function": "ht_dcphase", - "module": "cycle" - }, - { - "file": "cycle.rs", - "function": "ht_phasor", - "module": "cycle" - }, - { - "file": "cycle.rs", - "function": "ht_sine", - "module": "cycle" - }, - { - "file": "cycle.rs", - "function": "ht_trendline", - "module": "cycle" - }, - { - "file": "cycle.rs", - "function": "ht_trendmode", - "module": "cycle" - }, - { - "file": "extended.rs", - "function": "chandelier_exit", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "choppiness_index", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "donchian", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "hull_ma", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "ichimoku", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "keltner_channels", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "pivot_points", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "supertrend", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "vwap", - "module": "extended" - }, - { - "file": "extended.rs", - "function": "vwma", - "module": "extended" - }, - { - "file": "futures/basis.rs", - "function": "annualized_basis", - "module": "futures.basis" - }, - { - "file": "futures/basis.rs", - "function": "basis", - "module": "futures.basis" - }, - { - "file": "futures/basis.rs", - "function": "carry_spread", - "module": "futures.basis" - }, - { - "file": "futures/basis.rs", - "function": "implied_carry_rate", - "module": "futures.basis" - }, - { - "file": "futures/curve.rs", - "function": "calendar_spreads", - "module": "futures.curve" - }, - { - "file": "futures/curve.rs", - "function": "curve_slope", - "module": "futures.curve" - }, - { - "file": "futures/curve.rs", - "function": "curve_summary", - "module": "futures.curve" - }, - { - "file": "futures/roll.rs", - "function": "back_adjusted_continuous", - "module": "futures.roll" - }, - { - "file": "futures/roll.rs", - "function": "ratio_adjusted_continuous", - "module": "futures.roll" - }, - { - "file": "futures/roll.rs", - "function": "roll_yield", - "module": "futures.roll" - }, - { - "file": "futures/roll.rs", - "function": "weighted_continuous", - "module": "futures.roll" - }, - { - "file": "futures/synthetic.rs", - "function": "parity_gap", - "module": "futures.synthetic" - }, - { - "file": "futures/synthetic.rs", - "function": "synthetic_forward", - "module": "futures.synthetic" - }, - { - "file": "futures/synthetic.rs", - "function": "synthetic_spot", - "module": "futures.synthetic" - }, - { - "file": "math.rs", - "function": "max", - "module": "math" - }, - { - "file": "math.rs", - "function": "min", - "module": "math" - }, - { - "file": "math.rs", - "function": "sliding_max", - "module": "math" - }, - { - "file": "math.rs", - "function": "sliding_min", - "module": "math" - }, - { - "file": "math.rs", - "function": "sum", - "module": "math" - }, - { - "file": "math_ops.rs", - "function": "rolling_max", - "module": "math_ops" - }, - { - "file": "math_ops.rs", - "function": "rolling_maxindex", - "module": "math_ops" - }, - { - "file": "math_ops.rs", - "function": "rolling_min", - "module": "math_ops" - }, - { - "file": "math_ops.rs", - "function": "rolling_minindex", - "module": "math_ops" - }, - { - "file": "math_ops.rs", - "function": "rolling_sum", - "module": "math_ops" - }, - { - "file": "momentum.rs", - "function": "adx", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "adx_all", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "adxr", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "dx", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "minus_di", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "minus_dm", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "mom", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "plus_di", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "plus_dm", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "rsi", - "module": "momentum" - }, - { - "file": "momentum.rs", - "function": "stoch", - "module": "momentum" - }, - { - "file": "options/chain.rs", - "function": "atm_index", - "module": "options.chain" - }, - { - "file": "options/chain.rs", - "function": "label_moneyness", - "module": "options.chain" - }, - { - "file": "options/chain.rs", - "function": "select_strike_by_delta", - "module": "options.chain" - }, - { - "file": "options/chain.rs", - "function": "select_strike_by_offset", - "module": "options.chain" - }, - { - "file": "options/greeks.rs", - "function": "black_76_greeks", - "module": "options.greeks" - }, - { - "file": "options/greeks.rs", - "function": "black_scholes_greeks", - "module": "options.greeks" - }, - { - "file": "options/greeks.rs", - "function": "model_greeks", - "module": "options.greeks" - }, - { - "file": "options/greeks.rs", - "function": "model_theta", - "module": "options.greeks" - }, - { - "file": "options/iv.rs", - "function": "implied_volatility", - "module": "options.iv" - }, - { - "file": "options/iv.rs", - "function": "iv_percentile", - "module": "options.iv" - }, - { - "file": "options/iv.rs", - "function": "iv_rank", - "module": "options.iv" - }, - { - "file": "options/iv.rs", - "function": "iv_zscore", - "module": "options.iv" - }, - { - "file": "options/mod.rs", - "function": "sign", - "module": "options.mod" - }, - { - "file": "options/normal.rs", - "function": "cdf", - "module": "options.normal" - }, - { - "file": "options/normal.rs", - "function": "pdf", - "module": "options.normal" - }, - { - "file": "options/pricing.rs", - "function": "black_76_price", - "module": "options.pricing" - }, - { - "file": "options/pricing.rs", - "function": "black_scholes_price", - "module": "options.pricing" - }, - { - "file": "options/pricing.rs", - "function": "model_price", - "module": "options.pricing" - }, - { - "file": "options/pricing.rs", - "function": "price_lower_bound", - "module": "options.pricing" - }, - { - "file": "options/pricing.rs", - "function": "price_upper_bound", - "module": "options.pricing" - }, - { - "file": "options/surface.rs", - "function": "atm_iv", - "module": "options.surface" - }, - { - "file": "options/surface.rs", - "function": "linear_interpolate", - "module": "options.surface" - }, - { - "file": "options/surface.rs", - "function": "smile_metrics", - "module": "options.surface" - }, - { - "file": "options/surface.rs", - "function": "term_structure_slope", - "module": "options.surface" - }, - { - "file": "overlap.rs", - "function": "bbands", - "module": "overlap" - }, - { - "file": "overlap.rs", - "function": "ema", - "module": "overlap" - }, - { - "file": "overlap.rs", - "function": "macd", - "module": "overlap" - }, - { - "file": "overlap.rs", - "function": "sma", - "module": "overlap" - }, - { - "file": "overlap.rs", - "function": "sma_into", - "module": "overlap" - }, - { - "file": "overlap.rs", - "function": "wma", - "module": "overlap" - }, - { - "file": "pattern.rs", - "function": "body_size", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "candle_range", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdl2crows", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdl3blackcrows", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdl3inside", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdl3linestrike", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdl3outside", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdl3starsinsouth", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdl3whitesoldiers", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlabandonedbaby", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdladvanceblock", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlbelthold", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlbreakaway", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlclosingmarubozu", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlconcealbabyswall", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlcounterattack", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdldarkcloudcover", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdldoji", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdldojistar", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdldragonflydoji", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlengulfing", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdleveningdojistar", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdleveningstar", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlgapsidesidewhite", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlgravestonedoji", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlhammer", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlhangingman", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlharami", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlharamicross", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlhighwave", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlhikkake", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlhikkakemod", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlhomingpigeon", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlidentical3crows", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlinneck", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlinvertedhammer", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlkicking", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlkickingbylength", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlladderbottom", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdllongleggeddoji", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdllongline", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlmarubozu", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlmatchinglow", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlmathold", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlmorningdojistar", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlmorningstar", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlonneck", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlpiercing", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlrickshawman", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlrisefall3methods", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlseparatinglines", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlshootingstar", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlshortline", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlspinningtop", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlstalledpattern", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlsticksandwich", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdltakuri", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdltasukigap", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlthrusting", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdltristar", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlunique3river", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlupsidegap2crows", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "cdlxsidegap3methods", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "is_bearish", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "is_bullish", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "lower_shadow", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "upper_shadow", - "module": "pattern" - }, - { - "file": "pattern.rs", - "function": "validate_ohlc", - "module": "pattern" - }, - { - "file": "portfolio.rs", - "function": "beta_full", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "compose_weighted", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "correlation_matrix", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "drawdown_series", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "portfolio_volatility", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "ratio", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "relative_strength", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "rolling_beta", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "spread", - "module": "portfolio" - }, - { - "file": "portfolio.rs", - "function": "zscore_series", - "module": "portfolio" - }, - { - "file": "price_transform.rs", - "function": "avgprice", - "module": "price_transform" - }, - { - "file": "price_transform.rs", - "function": "medprice", - "module": "price_transform" - }, - { - "file": "price_transform.rs", - "function": "typprice", - "module": "price_transform" - }, - { - "file": "price_transform.rs", - "function": "wclprice", - "module": "price_transform" - }, - { - "file": "regime.rs", - "function": "detect_breaks_cusum", - "module": "regime" - }, - { - "file": "regime.rs", - "function": "regime_adx", - "module": "regime" - }, - { - "file": "regime.rs", - "function": "regime_combined", - "module": "regime" - }, - { - "file": "regime.rs", - "function": "rolling_variance_break", - "module": "regime" - }, - { - "file": "resampling.rs", - "function": "ohlcv_agg", - "module": "resampling" - }, - { - "file": "resampling.rs", - "function": "volume_bars", - "module": "resampling" - }, - { - "file": "signals.rs", - "function": "bottom_n_indices", - "module": "signals" - }, - { - "file": "signals.rs", - "function": "compose_rank", - "module": "signals" - }, - { - "file": "signals.rs", - "function": "rank_values", - "module": "signals" - }, - { - "file": "signals.rs", - "function": "top_n_indices", - "module": "signals" - }, - { - "file": "statistic.rs", - "function": "stddev", - "module": "statistic" - }, - { - "file": "streaming.rs", - "function": "fast_period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "new", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "reset", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "signal_period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "slow_period", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "streaming.rs", - "function": "update", - "module": "streaming" - }, - { - "file": "volatility.rs", - "function": "atr", - "module": "volatility" - }, - { - "file": "volatility.rs", - "function": "trange", - "module": "volatility" - }, - { - "file": "volume.rs", - "function": "ad", - "module": "volume" - }, - { - "file": "volume.rs", - "function": "adosc", - "module": "volume" - }, - { - "file": "volume.rs", - "function": "mfi", - "module": "volume" - }, - { - "file": "volume.rs", - "function": "obv", - "module": "volume" - } - ], - "public_function_count": 289 - }, - "wasm_node": { - "export_count": 95, - "exports": [ - "ad", - "adosc", - "adx", - "aggregate_tick_bars", - "aggregate_time_bars", - "aggregate_volume_bars_ticks", - "atr", - "avgprice", - "bbands", - "beta_full", - "bottom_n_indices", - "chandelier_exit", - "check_cross", - "check_threshold", - "choppiness_index", - "collect_alert_bars", - "continuous_bar_labels", - "detect_breaks_cusum", - "donchian", - "drawdown_series", - "ema", - "exchange_charges_rate", - "extract_trades", - "flat_per_order", - "forward_fill_nan", - "funding_cumulative_pnl", - "gst_rate", - "ht_dcperiod", - "ht_dcphase", - "ht_phasor", - "ht_sine", - "ht_trendline", - "ht_trendmode", - "hull_ma", - "ichimoku", - "keltner_channels", - "lot_size", - "macd", - "make_chunk_ranges", - "max_brokerage", - "medprice", - "mfi", - "mom", - "monthly_contribution", - "new", - "obv", - "ohlcv_agg", - "per_lot", - "pivot_points", - "rank_series", - "rate_of_value", - "ratio", - "regime_adx", - "regime_combined", - "regulatory_charges_rate", - "relative_strength", - "rolling_beta", - "rolling_max", - "rolling_maxindex", - "rolling_min", - "rolling_minindex", - "rolling_sum", - "rolling_variance_break", - "rsi", - "set_exchange_charges_rate", - "set_flat_per_order", - "set_gst_rate", - "set_lot_size", - "set_max_brokerage", - "set_per_lot", - "set_rate_of_value", - "set_regulatory_charges_rate", - "set_stamp_duty_rate", - "set_stt_on_buy", - "set_stt_on_sell", - "set_stt_rate", - "signal_attribution", - "sma", - "spread", - "stamp_duty_rate", - "stochf", - "stt_on_buy", - "stt_on_sell", - "stt_rate", - "supertrend", - "top_n_indices", - "trade_stats", - "trim_overlap", - "typprice", - "volume_bars", - "vwap", - "vwma", - "wclprice", - "wma", - "zscore_series" - ] - } } } diff --git a/docs/changelog.rst b/docs/changelog.rst index fe0f698..532c4d7 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,7 +1,7 @@ Release Notes ============= -These docs track package version ``1.1.0``. +These docs track package version ``1.1.1``. 1.1.0-audit (2026-03-28) ------------------------ diff --git a/docs/support_matrix.rst b/docs/support_matrix.rst index 5960b1a..ae3f970 100644 --- a/docs/support_matrix.rst +++ b/docs/support_matrix.rst @@ -180,7 +180,7 @@ For source builds, packaging details, and platform notes, see Release status -------------- -These docs track package version ``1.1.0``. +These docs track package version ``1.1.1``. - Release notes by version: :doc:`changelog` - Canonical project changelog: `CHANGELOG.md `_ diff --git a/pyproject.toml b/pyproject.toml index 9bf7233..ad9c39e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "ferro-ta" -version = "1.1.0" +version = "1.1.1" description = "Rust-powered Python technical analysis library with a TA-Lib-compatible API" readme = "README.md" license = { text = "MIT" } diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 34eab2e..61b1bb0 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -49,11 +49,11 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "ferro_ta_core" -version = "1.1.0" +version = "1.1.1" [[package]] name = "ferro_ta_wasm" -version = "1.1.0" +version = "1.1.1" dependencies = [ "ferro_ta_core", "js-sys", diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 3ab7217..3313837 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ferro_ta_wasm" -version = "1.1.0" +version = "1.1.1" edition = "2021" description = "WebAssembly bindings for ferro-ta technical analysis indicators" license = "MIT" diff --git a/wasm/package.json b/wasm/package.json index 6c407c7..dbdccc4 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -1,6 +1,6 @@ { "name": "ferro-ta-wasm", - "version": "1.1.0", + "version": "1.1.1", "description": "WebAssembly bindings for ferro-ta technical analysis indicators", "main": "pkg/ferro_ta_wasm.js", "types": "pkg/ferro_ta_wasm.d.ts", diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 2722df4..caa7c53 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -1257,6 +1257,1473 @@ pub fn adosc(high: &Float64Array, low: &Float64Array, close: &Float64Array, volu from_vec(ferro_ta_core::volume::adosc(&h, &l, &c, &v, fastperiod, slowperiod)) } +// =========================================================================== +// Momentum (additional exports) +// =========================================================================== + +/// Full Stochastic Oscillator (slow %K and slow %D). +#[wasm_bindgen] +pub fn stoch( + high: &Float64Array, + low: &Float64Array, + close: &Float64Array, + fastk_period: usize, + slowk_period: usize, + slowd_period: usize, +) -> Array { + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + let (slowk, slowd) = ferro_ta_core::momentum::stoch(&h, &l, &c, fastk_period, slowk_period, slowd_period); + let out = Array::new(); + out.push(&from_vec(slowk)); + out.push(&from_vec(slowd)); + out +} + +/// Plus Directional Movement (+DM). +#[wasm_bindgen] +pub fn plus_dm(high: &Float64Array, low: &Float64Array, timeperiod: usize) -> Float64Array { + let h = to_vec(high); + let l = to_vec(low); + from_vec(ferro_ta_core::momentum::plus_dm(&h, &l, timeperiod)) +} + +/// Minus Directional Movement (-DM). +#[wasm_bindgen] +pub fn minus_dm(high: &Float64Array, low: &Float64Array, timeperiod: usize) -> Float64Array { + let h = to_vec(high); + let l = to_vec(low); + from_vec(ferro_ta_core::momentum::minus_dm(&h, &l, timeperiod)) +} + +/// Plus Directional Indicator (+DI). +#[wasm_bindgen] +pub fn plus_di(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Float64Array { + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + from_vec(ferro_ta_core::momentum::plus_di(&h, &l, &c, timeperiod)) +} + +/// Minus Directional Indicator (-DI). +#[wasm_bindgen] +pub fn minus_di(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Float64Array { + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + from_vec(ferro_ta_core::momentum::minus_di(&h, &l, &c, timeperiod)) +} + +/// Directional Movement Index (DX). +#[wasm_bindgen] +pub fn dx(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Float64Array { + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + from_vec(ferro_ta_core::momentum::dx(&h, &l, &c, timeperiod)) +} + +/// Average Directional Movement Index Rating (ADXR). +#[wasm_bindgen] +pub fn adxr(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Float64Array { + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + from_vec(ferro_ta_core::momentum::adxr(&h, &l, &c, timeperiod)) +} + +/// All ADX components: returns [+DM, -DM, +DI, -DI, DX, ADX]. +#[wasm_bindgen] +pub fn adx_all(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Array { + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + let (pdm, mdm, pdi, mdi, dxv, adxv) = ferro_ta_core::momentum::adx_all(&h, &l, &c, timeperiod); + let out = Array::new(); + out.push(&from_vec(pdm)); + out.push(&from_vec(mdm)); + out.push(&from_vec(pdi)); + out.push(&from_vec(mdi)); + out.push(&from_vec(dxv)); + out.push(&from_vec(adxv)); + out +} + +// =========================================================================== +// Overlap Studies (additional exports) +// =========================================================================== + +/// Double Exponential Moving Average. +#[wasm_bindgen] +pub fn dema(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::overlap::dema(&to_vec(close), timeperiod)) +} + +/// Triple Exponential Moving Average. +#[wasm_bindgen] +pub fn tema(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::overlap::tema(&to_vec(close), timeperiod)) +} + +/// Triangular Moving Average. +#[wasm_bindgen] +pub fn trima(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::overlap::trima(&to_vec(close), timeperiod)) +} + +/// Kaufman Adaptive Moving Average. +#[wasm_bindgen] +pub fn kama(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::overlap::kama(&to_vec(close), timeperiod)) +} + +/// Tillson T3. +#[wasm_bindgen] +pub fn t3(close: &Float64Array, timeperiod: usize, vfactor: f64) -> Float64Array { + from_vec(ferro_ta_core::overlap::t3(&to_vec(close), timeperiod, vfactor)) +} + +/// Parabolic SAR. +#[wasm_bindgen] +pub fn sar(high: &Float64Array, low: &Float64Array, acceleration: f64, maximum: f64) -> Float64Array { + from_vec(ferro_ta_core::overlap::sar(&to_vec(high), &to_vec(low), acceleration, maximum)) +} + +/// Parabolic SAR Extended. +#[wasm_bindgen] +#[allow(clippy::too_many_arguments)] +pub fn sarext( + high: &Float64Array, low: &Float64Array, + startvalue: f64, offsetonreverse: f64, + accelerationinitlong: f64, accelerationlong: f64, accelerationmaxlong: f64, + accelerationinitshort: f64, accelerationshort: f64, accelerationmaxshort: f64, +) -> Float64Array { + from_vec(ferro_ta_core::overlap::sarext( + &to_vec(high), &to_vec(low), + startvalue, offsetonreverse, + accelerationinitlong, accelerationlong, accelerationmaxlong, + accelerationinitshort, accelerationshort, accelerationmaxshort, + )) +} + +/// MESA Adaptive Moving Average. Returns [mama, fama]. +#[wasm_bindgen] +pub fn mama(close: &Float64Array, fastlimit: f64, slowlimit: f64) -> Array { + let (m, f) = ferro_ta_core::overlap::mama(&to_vec(close), fastlimit, slowlimit); + let out = Array::new(); + out.push(&from_vec(m)); + out.push(&from_vec(f)); + out +} + +/// Midpoint over rolling window. +#[wasm_bindgen] +pub fn midpoint(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::overlap::midpoint(&to_vec(close), timeperiod)) +} + +/// MidPrice over rolling window. +#[wasm_bindgen] +pub fn midprice(high: &Float64Array, low: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::overlap::midprice(&to_vec(high), &to_vec(low), timeperiod)) +} + +/// MACD with fixed 12/26 periods. Returns [macd, signal, histogram]. +#[wasm_bindgen] +pub fn macdfix(close: &Float64Array, signalperiod: usize) -> Array { + let (m, s, h) = ferro_ta_core::overlap::macdfix(&to_vec(close), signalperiod); + let out = Array::new(); + out.push(&from_vec(m)); + out.push(&from_vec(s)); + out.push(&from_vec(h)); + out +} + +/// MACD with configurable MA types. Returns [macd, signal, histogram]. +#[wasm_bindgen] +#[allow(clippy::too_many_arguments)] +pub fn macdext( + close: &Float64Array, fastperiod: usize, fastmatype: u8, + slowperiod: usize, slowmatype: u8, signalperiod: usize, signalmatype: u8, +) -> Array { + let (m, s, h) = ferro_ta_core::overlap::macdext( + &to_vec(close), fastperiod, fastmatype, slowperiod, slowmatype, signalperiod, signalmatype, + ); + let out = Array::new(); + out.push(&from_vec(m)); + out.push(&from_vec(s)); + out.push(&from_vec(h)); + out +} + +/// Generic Moving Average (matype: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=T3). +#[wasm_bindgen] +pub fn ma(close: &Float64Array, timeperiod: usize, matype: u8) -> Float64Array { + from_vec(ferro_ta_core::overlap::ma(&to_vec(close), timeperiod, matype)) +} + +/// Moving Average with Variable Period. +#[wasm_bindgen] +pub fn mavp(close: &Float64Array, periods: &Float64Array, minperiod: usize, maxperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::overlap::mavp(&to_vec(close), &to_vec(periods), minperiod, maxperiod)) +} + +// =========================================================================== +// Momentum (additional exports — new core indicators) +// =========================================================================== + +/// Rate of Change: `(close[i] - close[i-p]) / close[i-p] * 100`. +#[wasm_bindgen] +pub fn roc(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::roc(&to_vec(close), timeperiod)) +} + +/// Rate of Change Percentage. +#[wasm_bindgen] +pub fn rocp(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::rocp(&to_vec(close), timeperiod)) +} + +/// Rate of Change Ratio. +#[wasm_bindgen] +pub fn rocr(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::rocr(&to_vec(close), timeperiod)) +} + +/// Rate of Change Ratio x 100. +#[wasm_bindgen] +pub fn rocr100(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::rocr100(&to_vec(close), timeperiod)) +} + +/// Williams %R. +#[wasm_bindgen] +pub fn willr(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::willr(&to_vec(high), &to_vec(low), &to_vec(close), timeperiod)) +} + +/// Aroon indicator. Returns [aroon_down, aroon_up]. +#[wasm_bindgen] +pub fn aroon(high: &Float64Array, low: &Float64Array, timeperiod: usize) -> Array { + let (down, up) = ferro_ta_core::momentum::aroon(&to_vec(high), &to_vec(low), timeperiod); + let out = Array::new(); + out.push(&from_vec(down)); + out.push(&from_vec(up)); + out +} + +/// Aroon Oscillator. +#[wasm_bindgen] +pub fn aroonosc(high: &Float64Array, low: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::aroonosc(&to_vec(high), &to_vec(low), timeperiod)) +} + +/// Commodity Channel Index. +#[wasm_bindgen] +pub fn cci(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::cci(&to_vec(high), &to_vec(low), &to_vec(close), timeperiod)) +} + +/// Balance of Power. +#[wasm_bindgen] +pub fn bop(open: &Float64Array, high: &Float64Array, low: &Float64Array, close: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::momentum::bop(&to_vec(open), &to_vec(high), &to_vec(low), &to_vec(close))) +} + +/// Stochastic RSI. Returns [fastk, fastd]. +#[wasm_bindgen] +pub fn stochrsi(close: &Float64Array, timeperiod: usize, fastk_period: usize, fastd_period: usize) -> Array { + let (k, d) = ferro_ta_core::momentum::stochrsi(&to_vec(close), timeperiod, fastk_period, fastd_period); + let out = Array::new(); + out.push(&from_vec(k)); + out.push(&from_vec(d)); + out +} + +/// Absolute Price Oscillator. +#[wasm_bindgen] +pub fn apo(close: &Float64Array, fastperiod: usize, slowperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::apo(&to_vec(close), fastperiod, slowperiod)) +} + +/// Percentage Price Oscillator. Returns [ppo, signal, histogram]. +#[wasm_bindgen] +pub fn ppo(close: &Float64Array, fastperiod: usize, slowperiod: usize, signalperiod: usize) -> Array { + let (p, s, h) = ferro_ta_core::momentum::ppo(&to_vec(close), fastperiod, slowperiod, signalperiod); + let out = Array::new(); + out.push(&from_vec(p)); + out.push(&from_vec(s)); + out.push(&from_vec(h)); + out +} + +/// Chande Momentum Oscillator. +#[wasm_bindgen] +pub fn cmo(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::cmo(&to_vec(close), timeperiod)) +} + +/// TRIX: 1-period rate of change of triple-smoothed EMA. +#[wasm_bindgen] +pub fn trix_indicator(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::trix(&to_vec(close), timeperiod)) +} + +/// Ultimate Oscillator. +#[wasm_bindgen] +pub fn ultosc(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod1: usize, timeperiod2: usize, timeperiod3: usize) -> Float64Array { + from_vec(ferro_ta_core::momentum::ultosc(&to_vec(high), &to_vec(low), &to_vec(close), timeperiod1, timeperiod2, timeperiod3)) +} + +// =========================================================================== +// Volatility (additional exports) +// =========================================================================== + +/// True Range. +#[wasm_bindgen] +pub fn trange(high: &Float64Array, low: &Float64Array, close: &Float64Array) -> Float64Array { + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + from_vec(ferro_ta_core::volatility::trange(&h, &l, &c)) +} + +/// Normalized Average True Range: ATR / close * 100. +#[wasm_bindgen] +pub fn natr(high: &Float64Array, low: &Float64Array, close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::volatility::natr(&to_vec(high), &to_vec(low), &to_vec(close), timeperiod)) +} + +// =========================================================================== +// Statistic (additional exports) +// =========================================================================== + +/// Rolling population standard deviation scaled by `nbdev`. +#[wasm_bindgen] +pub fn stddev(close: &Float64Array, timeperiod: usize, nbdev: f64) -> Float64Array { + from_vec(ferro_ta_core::statistic::stddev(&to_vec(close), timeperiod, nbdev)) +} + +/// Rolling population variance scaled by `nbdev²`. +#[wasm_bindgen] +pub fn var(close: &Float64Array, timeperiod: usize, nbdev: f64) -> Float64Array { + from_vec(ferro_ta_core::statistic::var(&to_vec(close), timeperiod, nbdev)) +} + +/// Linear regression fitted value. +#[wasm_bindgen] +pub fn linearreg(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::statistic::linearreg(&to_vec(close), timeperiod)) +} + +/// Linear regression slope. +#[wasm_bindgen] +pub fn linearreg_slope(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::statistic::linearreg_slope(&to_vec(close), timeperiod)) +} + +/// Linear regression intercept. +#[wasm_bindgen] +pub fn linearreg_intercept(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::statistic::linearreg_intercept(&to_vec(close), timeperiod)) +} + +/// Linear regression angle in degrees. +#[wasm_bindgen] +pub fn linearreg_angle(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::statistic::linearreg_angle(&to_vec(close), timeperiod)) +} + +/// Time Series Forecast. +#[wasm_bindgen] +pub fn tsf(close: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::statistic::tsf(&to_vec(close), timeperiod)) +} + +/// Rolling beta (return-based regression). +#[wasm_bindgen] +pub fn beta_rolling(real0: &Float64Array, real1: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::statistic::beta(&to_vec(real0), &to_vec(real1), timeperiod)) +} + +/// Rolling Pearson correlation. +#[wasm_bindgen] +pub fn correl(real0: &Float64Array, real1: &Float64Array, timeperiod: usize) -> Float64Array { + from_vec(ferro_ta_core::statistic::correl(&to_vec(real0), &to_vec(real1), timeperiod)) +} + +// =========================================================================== +// Streaming / Stateful API +// =========================================================================== + +/// Streaming Simple Moving Average. +#[wasm_bindgen] +pub struct WasmStreamingSMA { + inner: ferro_ta_core::streaming::StreamingSMA, +} + +#[wasm_bindgen] +impl WasmStreamingSMA { + #[wasm_bindgen(constructor)] + pub fn new(period: usize) -> Result { + let inner = ferro_ta_core::streaming::StreamingSMA::new(period) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, value: f64) -> f64 { self.inner.update(value) } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn period(&self) -> usize { self.inner.period() } +} + +/// Streaming Exponential Moving Average. +#[wasm_bindgen] +pub struct WasmStreamingEMA { + inner: ferro_ta_core::streaming::StreamingEMA, +} + +#[wasm_bindgen] +impl WasmStreamingEMA { + #[wasm_bindgen(constructor)] + pub fn new(period: usize) -> Result { + let inner = ferro_ta_core::streaming::StreamingEMA::new(period) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, value: f64) -> f64 { self.inner.update(value) } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn period(&self) -> usize { self.inner.period() } +} + +/// Streaming Relative Strength Index. +#[wasm_bindgen] +pub struct WasmStreamingRSI { + inner: ferro_ta_core::streaming::StreamingRSI, +} + +#[wasm_bindgen] +impl WasmStreamingRSI { + #[wasm_bindgen(constructor)] + pub fn new(period: usize) -> Result { + let inner = ferro_ta_core::streaming::StreamingRSI::new(period) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, value: f64) -> f64 { self.inner.update(value) } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn period(&self) -> usize { self.inner.period() } +} + +/// Streaming Average True Range. +#[wasm_bindgen] +pub struct WasmStreamingATR { + inner: ferro_ta_core::streaming::StreamingATR, +} + +#[wasm_bindgen] +impl WasmStreamingATR { + #[wasm_bindgen(constructor)] + pub fn new(period: usize) -> Result { + let inner = ferro_ta_core::streaming::StreamingATR::new(period) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, high: f64, low: f64, close: f64) -> f64 { + self.inner.update(high, low, close) + } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn period(&self) -> usize { self.inner.period() } +} + +/// Streaming Bollinger Bands. Returns [upper, middle, lower] from `update()`. +#[wasm_bindgen] +pub struct WasmStreamingBBands { + inner: ferro_ta_core::streaming::StreamingBBands, +} + +#[wasm_bindgen] +impl WasmStreamingBBands { + #[wasm_bindgen(constructor)] + pub fn new(period: usize, nbdevup: f64, nbdevdn: f64) -> Result { + let inner = ferro_ta_core::streaming::StreamingBBands::new(period, nbdevup, nbdevdn) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, value: f64) -> Array { + let (u, m, l) = self.inner.update(value); + let out = Array::new(); + out.push(&JsValue::from_f64(u)); + out.push(&JsValue::from_f64(m)); + out.push(&JsValue::from_f64(l)); + out + } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn period(&self) -> usize { self.inner.period() } +} + +/// Streaming MACD. Returns [macd, signal, histogram] from `update()`. +#[wasm_bindgen] +pub struct WasmStreamingMACD { + inner: ferro_ta_core::streaming::StreamingMACD, +} + +#[wasm_bindgen] +impl WasmStreamingMACD { + #[wasm_bindgen(constructor)] + pub fn new(fastperiod: usize, slowperiod: usize, signalperiod: usize) -> Result { + let inner = ferro_ta_core::streaming::StreamingMACD::new(fastperiod, slowperiod, signalperiod) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, value: f64) -> Array { + let (m, s, h) = self.inner.update(value); + let out = Array::new(); + out.push(&JsValue::from_f64(m)); + out.push(&JsValue::from_f64(s)); + out.push(&JsValue::from_f64(h)); + out + } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn fast_period(&self) -> usize { self.inner.fast_period() } + #[wasm_bindgen(getter)] + pub fn slow_period(&self) -> usize { self.inner.slow_period() } + #[wasm_bindgen(getter)] + pub fn signal_period(&self) -> usize { self.inner.signal_period() } +} + +/// Streaming Stochastic Oscillator. Returns [slowk, slowd] from `update()`. +#[wasm_bindgen] +pub struct WasmStreamingStoch { + inner: ferro_ta_core::streaming::StreamingStoch, +} + +#[wasm_bindgen] +impl WasmStreamingStoch { + #[wasm_bindgen(constructor)] + pub fn new(fastk_period: usize, slowk_period: usize, slowd_period: usize) -> Result { + let inner = ferro_ta_core::streaming::StreamingStoch::new(fastk_period, slowk_period, slowd_period) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, high: f64, low: f64, close: f64) -> Array { + let (sk, sd) = self.inner.update(high, low, close); + let out = Array::new(); + out.push(&JsValue::from_f64(sk)); + out.push(&JsValue::from_f64(sd)); + out + } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn period(&self) -> usize { self.inner.period() } +} + +/// Streaming cumulative VWAP. +#[wasm_bindgen] +pub struct WasmStreamingVWAP { + inner: ferro_ta_core::streaming::StreamingVWAP, +} + +#[wasm_bindgen] +impl WasmStreamingVWAP { + #[wasm_bindgen(constructor)] + pub fn new() -> WasmStreamingVWAP { + Self { inner: ferro_ta_core::streaming::StreamingVWAP::new() } + } + pub fn update(&mut self, high: f64, low: f64, close: f64, volume: f64) -> f64 { + self.inner.update(high, low, close, volume) + } + pub fn reset(&mut self) { self.inner.reset(); } +} + +/// Streaming Supertrend. Returns [line, direction] from `update()`. +#[wasm_bindgen] +pub struct WasmStreamingSupertrend { + inner: ferro_ta_core::streaming::StreamingSupertrend, +} + +#[wasm_bindgen] +impl WasmStreamingSupertrend { + #[wasm_bindgen(constructor)] + pub fn new(period: usize, multiplier: f64) -> Result { + let inner = ferro_ta_core::streaming::StreamingSupertrend::new(period, multiplier) + .map_err(|e| JsError::new(&e.0))?; + Ok(Self { inner }) + } + pub fn update(&mut self, high: f64, low: f64, close: f64) -> Array { + let (line, dir) = self.inner.update(high, low, close); + let out = Array::new(); + out.push(&JsValue::from_f64(line)); + out.push(&JsValue::from_f64(dir as f64)); + out + } + pub fn reset(&mut self) { self.inner.reset(); } + #[wasm_bindgen(getter)] + pub fn period(&self) -> usize { self.inner.period() } +} + +// =========================================================================== +// Batch Operations +// =========================================================================== + +/// Convert a js_sys::Array of Float64Array into Vec>. +fn array_of_f64arr_to_vecs(arr: &Array) -> Vec> { + (0..arr.length()) + .map(|i| { + let item: Float64Array = arr.get(i).unchecked_into(); + to_vec(&item) + }) + .collect() +} + +/// Convert Vec> into a js_sys::Array of Float64Array. +fn vecs_to_array_of_f64arr(data: Vec>) -> Array { + let out = Array::new(); + for v in data { + out.push(&from_vec(v)); + } + out +} + +/// Batch SMA: compute SMA on each column of 2D data. +#[wasm_bindgen] +pub fn batch_sma(data: &Array, timeperiod: usize) -> Array { + let vecs = array_of_f64arr_to_vecs(data); + match ferro_ta_core::batch::batch_sma(&vecs, timeperiod) { + Ok(r) => vecs_to_array_of_f64arr(r), + Err(_) => Array::new(), + } +} + +/// Batch EMA: compute EMA on each column of 2D data. +#[wasm_bindgen] +pub fn batch_ema(data: &Array, timeperiod: usize) -> Array { + let vecs = array_of_f64arr_to_vecs(data); + match ferro_ta_core::batch::batch_ema(&vecs, timeperiod) { + Ok(r) => vecs_to_array_of_f64arr(r), + Err(_) => Array::new(), + } +} + +/// Batch RSI: compute RSI on each column of 2D data. +#[wasm_bindgen] +pub fn batch_rsi(data: &Array, timeperiod: usize) -> Array { + let vecs = array_of_f64arr_to_vecs(data); + match ferro_ta_core::batch::batch_rsi(&vecs, timeperiod) { + Ok(r) => vecs_to_array_of_f64arr(r), + Err(_) => Array::new(), + } +} + +// =========================================================================== +// Portfolio (additional exports) +// =========================================================================== + +/// Portfolio volatility: sqrt(w' * cov * w). +#[wasm_bindgen] +pub fn portfolio_volatility(cov_matrix: &Array, weights: &Float64Array) -> f64 { + let cov = array_of_f64arr_to_vecs(cov_matrix); + let w = to_vec(weights); + ferro_ta_core::portfolio::portfolio_volatility(&cov, &w) +} + +/// Pairwise correlation matrix. +#[wasm_bindgen] +pub fn correlation_matrix(data: &Array) -> Array { + let vecs = array_of_f64arr_to_vecs(data); + vecs_to_array_of_f64arr(ferro_ta_core::portfolio::correlation_matrix(&vecs)) +} + +/// Weighted composite of multiple series. +#[wasm_bindgen] +pub fn compose_weighted(data: &Array, weights: &Float64Array) -> Float64Array { + let vecs = array_of_f64arr_to_vecs(data); + let w = to_vec(weights); + from_vec(ferro_ta_core::portfolio::compose_weighted(&vecs, &w)) +} + +// =========================================================================== +// Crypto (additional exports) +// =========================================================================== + +/// Mark session boundaries from nanosecond timestamps. +#[wasm_bindgen] +pub fn mark_session_boundaries(timestamps_ns: &Float64Array) -> Float64Array { + let ts: Vec = to_vec(timestamps_ns).iter().map(|&v| v as i64).collect(); + let result = ferro_ta_core::crypto::mark_session_boundaries(&ts); + from_vec(result.iter().map(|&v| v as f64).collect()) +} + +// =========================================================================== +// Chunked (additional exports) +// =========================================================================== + +/// Stitch multiple chunks into a single array. +#[wasm_bindgen] +pub fn stitch_chunks(chunks: &Array) -> Float64Array { + let vecs = array_of_f64arr_to_vecs(chunks); + let slices: Vec<&[f64]> = vecs.iter().map(|v| v.as_slice()).collect(); + from_vec(ferro_ta_core::chunked::stitch_chunks(&slices)) +} + +// =========================================================================== +// Math Operators & Transforms +// =========================================================================== + +/// Element-wise addition. +#[wasm_bindgen] +pub fn math_add(a: &Float64Array, b: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::math::add(&to_vec(a), &to_vec(b))) +} + +/// Element-wise subtraction. +#[wasm_bindgen] +pub fn math_sub(a: &Float64Array, b: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::math::sub(&to_vec(a), &to_vec(b))) +} + +/// Element-wise multiplication. +#[wasm_bindgen] +pub fn math_mult(a: &Float64Array, b: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::math::mult(&to_vec(a), &to_vec(b))) +} + +/// Element-wise division. +#[wasm_bindgen] +pub fn math_div(a: &Float64Array, b: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::math::div(&to_vec(a), &to_vec(b))) +} + +macro_rules! math_transform_wrapper { + ($wasm_name:ident, $core_name:ident) => { + #[wasm_bindgen] + pub fn $wasm_name(real: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::math::$core_name(&to_vec(real))) + } + }; +} + +math_transform_wrapper!(transform_acos, math_acos); +math_transform_wrapper!(transform_asin, math_asin); +math_transform_wrapper!(transform_atan, math_atan); +math_transform_wrapper!(transform_ceil, math_ceil); +math_transform_wrapper!(transform_cos, math_cos); +math_transform_wrapper!(transform_cosh, math_cosh); +math_transform_wrapper!(transform_exp, math_exp); +math_transform_wrapper!(transform_floor, math_floor); +math_transform_wrapper!(transform_ln, math_ln); +math_transform_wrapper!(transform_log10, math_log10); +math_transform_wrapper!(transform_sin, math_sin); +math_transform_wrapper!(transform_sinh, math_sinh); +math_transform_wrapper!(transform_sqrt, math_sqrt); +math_transform_wrapper!(transform_tan, math_tan); +math_transform_wrapper!(transform_tanh, math_tanh); + +// =========================================================================== +// Candlestick Patterns (61 functions via macro) +// =========================================================================== + +/// Convert a `Vec` into a `js_sys::Int32Array`. +fn from_i32_vec(v: Vec) -> js_sys::Int32Array { + let arr = js_sys::Int32Array::new_with_length(v.len() as u32); + arr.copy_from(&v); + arr +} + +macro_rules! cdl_wrapper { + ($($name:ident),* $(,)?) => {$( + #[wasm_bindgen] + pub fn $name( + open: &Float64Array, + high: &Float64Array, + low: &Float64Array, + close: &Float64Array, + ) -> js_sys::Int32Array { + let o = to_vec(open); + let h = to_vec(high); + let l = to_vec(low); + let c = to_vec(close); + from_i32_vec(ferro_ta_core::pattern::$name(&o, &h, &l, &c)) + } + )*}; +} + +cdl_wrapper!( + cdl2crows, + cdl3blackcrows, + cdl3inside, + cdl3linestrike, + cdl3outside, + cdl3starsinsouth, + cdl3whitesoldiers, + cdlabandonedbaby, + cdladvanceblock, + cdlbelthold, + cdlbreakaway, + cdlclosingmarubozu, + cdlconcealbabyswall, + cdlcounterattack, + cdldarkcloudcover, + cdldoji, + cdldojistar, + cdldragonflydoji, + cdlengulfing, + cdleveningdojistar, + cdleveningstar, + cdlgapsidesidewhite, + cdlgravestonedoji, + cdlhammer, + cdlhangingman, + cdlharami, + cdlharamicross, + cdlhighwave, + cdlhikkake, + cdlhikkakemod, + cdlhomingpigeon, + cdlidentical3crows, + cdlinneck, + cdlinvertedhammer, + cdlkicking, + cdlkickingbylength, + cdlladderbottom, + cdllongleggeddoji, + cdllongline, + cdlmarubozu, + cdlmatchinglow, + cdlmathold, + cdlmorningdojistar, + cdlmorningstar, + cdlonneck, + cdlpiercing, + cdlrickshawman, + cdlrisefall3methods, + cdlseparatinglines, + cdlshootingstar, + cdlshortline, + cdlspinningtop, + cdlstalledpattern, + cdlsticksandwich, + cdltakuri, + cdltasukigap, + cdlthrusting, + cdltristar, + cdlunique3river, + cdlupsidegap2crows, + cdlxsidegap3methods, +); + +// =========================================================================== +// Signals (additional) +// =========================================================================== + +/// Rank values (percentile ranking [0, 100]). +#[wasm_bindgen] +pub fn rank_values(x: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::signals::rank_values(&to_vec(x))) +} + +/// Composite rank across multiple signal arrays. +#[wasm_bindgen] +pub fn compose_rank(signals: &Array) -> Float64Array { + let vecs = array_of_f64arr_to_vecs(signals); + let slices: Vec<&[f64]> = vecs.iter().map(|v| v.as_slice()).collect(); + from_vec(ferro_ta_core::signals::compose_rank(&slices)) +} + +// =========================================================================== +// Batch (additional) +// =========================================================================== + +/// Batch ATR across multiple HLC column sets. +#[wasm_bindgen] +pub fn batch_atr(high: &Array, low: &Array, close: &Array, timeperiod: usize) -> Array { + let h = array_of_f64arr_to_vecs(high); + let l = array_of_f64arr_to_vecs(low); + let c = array_of_f64arr_to_vecs(close); + match ferro_ta_core::batch::batch_atr(&h, &l, &c, timeperiod) { + Ok(r) => vecs_to_array_of_f64arr(r), + Err(_) => Array::new(), + } +} + +/// Batch Stochastic across multiple HLC column sets. Returns [Array[slowk_cols], Array[slowd_cols]]. +#[wasm_bindgen] +pub fn batch_stoch(high: &Array, low: &Array, close: &Array, fastk_period: usize, slowk_period: usize, slowd_period: usize) -> Array { + let h = array_of_f64arr_to_vecs(high); + let l = array_of_f64arr_to_vecs(low); + let c = array_of_f64arr_to_vecs(close); + match ferro_ta_core::batch::batch_stoch(&h, &l, &c, fastk_period, slowk_period, slowd_period) { + Ok((sk, sd)) => { + let out = Array::new(); + out.push(&vecs_to_array_of_f64arr(sk)); + out.push(&vecs_to_array_of_f64arr(sd)); + out + } + Err(_) => Array::new(), + } +} + +/// Batch ADX across multiple HLC column sets. +#[wasm_bindgen] +pub fn batch_adx(high: &Array, low: &Array, close: &Array, timeperiod: usize) -> Array { + let h = array_of_f64arr_to_vecs(high); + let l = array_of_f64arr_to_vecs(low); + let c = array_of_f64arr_to_vecs(close); + match ferro_ta_core::batch::batch_adx(&h, &l, &c, timeperiod) { + Ok(r) => vecs_to_array_of_f64arr(r), + Err(_) => Array::new(), + } +} + +// =========================================================================== +// Options Analytics +// =========================================================================== + +fn parse_option_kind(kind: &str) -> ferro_ta_core::options::OptionKind { + match kind.to_lowercase().as_str() { + "put" | "p" => ferro_ta_core::options::OptionKind::Put, + _ => ferro_ta_core::options::OptionKind::Call, + } +} + +fn parse_pricing_model(model: &str) -> ferro_ta_core::options::PricingModel { + match model.to_lowercase().as_str() { + "black76" | "b76" => ferro_ta_core::options::PricingModel::Black76, + _ => ferro_ta_core::options::PricingModel::BlackScholes, + } +} + +/// Black-Scholes-Merton option price. +#[wasm_bindgen] +pub fn black_scholes_price( + spot: f64, strike: f64, rate: f64, dividend_yield: f64, + time_to_expiry: f64, volatility: f64, kind: &str, +) -> f64 { + ferro_ta_core::options::pricing::black_scholes_price( + spot, strike, rate, dividend_yield, time_to_expiry, volatility, parse_option_kind(kind), + ) +} + +/// Black-76 option price (futures). +#[wasm_bindgen] +pub fn black_76_price( + forward: f64, strike: f64, rate: f64, + time_to_expiry: f64, volatility: f64, kind: &str, +) -> f64 { + ferro_ta_core::options::pricing::black_76_price( + forward, strike, rate, time_to_expiry, volatility, parse_option_kind(kind), + ) +} + +/// Black-Scholes Greeks. Returns [delta, gamma, vega, theta, rho]. +#[wasm_bindgen] +pub fn black_scholes_greeks( + spot: f64, strike: f64, rate: f64, dividend_yield: f64, + time_to_expiry: f64, volatility: f64, kind: &str, +) -> Array { + let g = ferro_ta_core::options::greeks::black_scholes_greeks( + spot, strike, rate, dividend_yield, time_to_expiry, volatility, parse_option_kind(kind), + ); + let out = Array::new(); + out.push(&JsValue::from_f64(g.delta)); + out.push(&JsValue::from_f64(g.gamma)); + out.push(&JsValue::from_f64(g.vega)); + out.push(&JsValue::from_f64(g.theta)); + out.push(&JsValue::from_f64(g.rho)); + out +} + +/// Black-76 Greeks. Returns [delta, gamma, vega, theta, rho]. +#[wasm_bindgen] +pub fn black_76_greeks( + forward: f64, strike: f64, rate: f64, + time_to_expiry: f64, volatility: f64, kind: &str, +) -> Array { + let g = ferro_ta_core::options::greeks::black_76_greeks( + forward, strike, rate, time_to_expiry, volatility, parse_option_kind(kind), + ); + let out = Array::new(); + out.push(&JsValue::from_f64(g.delta)); + out.push(&JsValue::from_f64(g.gamma)); + out.push(&JsValue::from_f64(g.vega)); + out.push(&JsValue::from_f64(g.theta)); + out.push(&JsValue::from_f64(g.rho)); + out +} + +/// Implied volatility via Newton-Raphson. +#[wasm_bindgen] +pub fn implied_volatility( + model: &str, underlying: f64, strike: f64, rate: f64, carry: f64, + time_to_expiry: f64, kind: &str, target_price: f64, + initial_guess: f64, tolerance: f64, max_iterations: usize, +) -> f64 { + use ferro_ta_core::options::*; + let contract = OptionContract { + model: parse_pricing_model(model), + underlying, strike, rate, carry, time_to_expiry, + kind: parse_option_kind(kind), + }; + let config = IvSolverConfig { initial_guess, tolerance, max_iterations }; + iv::implied_volatility(contract, target_price, config) +} + +/// IV Rank over a rolling window. +#[wasm_bindgen] +pub fn iv_rank(iv_series: &Float64Array, window: usize) -> Float64Array { + from_vec(ferro_ta_core::options::iv::iv_rank(&to_vec(iv_series), window)) +} + +/// IV Percentile over a rolling window. +#[wasm_bindgen] +pub fn iv_percentile(iv_series: &Float64Array, window: usize) -> Float64Array { + from_vec(ferro_ta_core::options::iv::iv_percentile(&to_vec(iv_series), window)) +} + +/// IV Z-Score over a rolling window. +#[wasm_bindgen] +pub fn iv_zscore(iv_series: &Float64Array, window: usize) -> Float64Array { + from_vec(ferro_ta_core::options::iv::iv_zscore(&to_vec(iv_series), window)) +} + +/// ATM index in a strikes array. +#[wasm_bindgen] +pub fn atm_index(strikes: &Float64Array, reference_price: f64) -> f64 { + match ferro_ta_core::options::chain::atm_index(&to_vec(strikes), reference_price) { + Some(idx) => idx as f64, + None => f64::NAN, + } +} + +/// Label moneyness of strikes. Returns Int8Array. +#[wasm_bindgen] +pub fn label_moneyness(strikes: &Float64Array, reference_price: f64, kind: &str) -> js_sys::Int8Array { + let result = ferro_ta_core::options::chain::label_moneyness( + &to_vec(strikes), reference_price, parse_option_kind(kind), + ); + let arr = js_sys::Int8Array::new_with_length(result.len() as u32); + arr.copy_from(&result); + arr +} + +/// Model-dispatched option price (model: "bs" or "b76"). +#[wasm_bindgen] +pub fn model_price( + model: &str, underlying: f64, strike: f64, rate: f64, carry: f64, + time_to_expiry: f64, volatility: f64, kind: &str, +) -> f64 { + use ferro_ta_core::options::*; + let input = OptionEvaluation { + contract: OptionContract { + model: parse_pricing_model(model), underlying, strike, rate, carry, time_to_expiry, + kind: parse_option_kind(kind), + }, + volatility, + }; + pricing::model_price(input) +} + +/// Model-dispatched Greeks. Returns [delta, gamma, vega, theta, rho]. +#[wasm_bindgen] +pub fn model_greeks( + model: &str, underlying: f64, strike: f64, rate: f64, carry: f64, + time_to_expiry: f64, volatility: f64, kind: &str, +) -> Array { + use ferro_ta_core::options::*; + let input = OptionEvaluation { + contract: OptionContract { + model: parse_pricing_model(model), underlying, strike, rate, carry, time_to_expiry, + kind: parse_option_kind(kind), + }, + volatility, + }; + let g = greeks::model_greeks(input); + let out = Array::new(); + out.push(&JsValue::from_f64(g.delta)); + out.push(&JsValue::from_f64(g.gamma)); + out.push(&JsValue::from_f64(g.vega)); + out.push(&JsValue::from_f64(g.theta)); + out.push(&JsValue::from_f64(g.rho)); + out +} + +/// Model theta (numerical). +#[wasm_bindgen] +pub fn model_theta( + model: &str, underlying: f64, strike: f64, rate: f64, carry: f64, + time_to_expiry: f64, volatility: f64, kind: &str, +) -> f64 { + use ferro_ta_core::options::*; + let input = OptionEvaluation { + contract: OptionContract { + model: parse_pricing_model(model), underlying, strike, rate, carry, time_to_expiry, + kind: parse_option_kind(kind), + }, + volatility, + }; + greeks::model_theta(input) +} + +/// Price lower bound. +#[wasm_bindgen] +pub fn price_lower_bound( + model: &str, underlying: f64, strike: f64, rate: f64, carry: f64, + time_to_expiry: f64, kind: &str, +) -> f64 { + use ferro_ta_core::options::*; + let contract = OptionContract { + model: parse_pricing_model(model), underlying, strike, rate, carry, time_to_expiry, + kind: parse_option_kind(kind), + }; + pricing::price_lower_bound(contract) +} + +/// Price upper bound. +#[wasm_bindgen] +pub fn price_upper_bound( + model: &str, underlying: f64, strike: f64, rate: f64, carry: f64, + time_to_expiry: f64, kind: &str, +) -> f64 { + use ferro_ta_core::options::*; + let contract = OptionContract { + model: parse_pricing_model(model), underlying, strike, rate, carry, time_to_expiry, + kind: parse_option_kind(kind), + }; + pricing::price_upper_bound(contract) +} + +/// Select strike by offset from ATM. +#[wasm_bindgen] +pub fn select_strike_by_offset(strikes: &Float64Array, reference_price: f64, offset: i32) -> f64 { + match ferro_ta_core::options::chain::select_strike_by_offset( + &to_vec(strikes), reference_price, offset as isize, + ) { + Some(v) => v, + None => f64::NAN, + } +} + +/// Smile metrics. Returns [atm_iv, risk_reversal_25d, butterfly_25d, skew_slope, convexity]. +#[wasm_bindgen] +#[allow(clippy::too_many_arguments)] +pub fn smile_metrics( + strikes: &Float64Array, vols: &Float64Array, reference_price: f64, + rate: f64, carry: f64, time_to_expiry: f64, model: &str, +) -> Array { + let m = ferro_ta_core::options::surface::smile_metrics( + &to_vec(strikes), &to_vec(vols), reference_price, + rate, carry, time_to_expiry, parse_pricing_model(model), + ); + let out = Array::new(); + out.push(&JsValue::from_f64(m.atm_iv)); + out.push(&JsValue::from_f64(m.risk_reversal_25d)); + out.push(&JsValue::from_f64(m.butterfly_25d)); + out.push(&JsValue::from_f64(m.skew_slope)); + out.push(&JsValue::from_f64(m.convexity)); + out +} + +/// Linear interpolation helper. +#[wasm_bindgen] +pub fn linear_interpolate(xs: &Float64Array, ys: &Float64Array, target: f64) -> f64 { + ferro_ta_core::options::surface::linear_interpolate(&to_vec(xs), &to_vec(ys), target) +} + +/// Select strike by delta target. +#[wasm_bindgen] +#[allow(clippy::too_many_arguments)] +pub fn select_strike_by_delta( + strikes: &Float64Array, vols: &Float64Array, + model: &str, reference_price: f64, rate: f64, carry: f64, + time_to_expiry: f64, kind: &str, target_delta: f64, +) -> f64 { + use ferro_ta_core::options::*; + let ctx = ChainGreeksContext { + model: parse_pricing_model(model), + reference_price, rate, carry, time_to_expiry, + kind: parse_option_kind(kind), + }; + match chain::select_strike_by_delta(&to_vec(strikes), &to_vec(vols), ctx, target_delta) { + Some(v) => v, + None => f64::NAN, + } +} + +/// ATM implied volatility interpolated from strikes/vols. +#[wasm_bindgen] +pub fn atm_iv(strikes: &Float64Array, vols: &Float64Array, reference_price: f64) -> f64 { + ferro_ta_core::options::surface::atm_iv(&to_vec(strikes), &to_vec(vols), reference_price) +} + +/// Term structure slope. +#[wasm_bindgen] +pub fn term_structure_slope(tenors: &Float64Array, atm_ivs: &Float64Array) -> f64 { + ferro_ta_core::options::surface::term_structure_slope(&to_vec(tenors), &to_vec(atm_ivs)) +} + +// =========================================================================== +// Futures Analytics +// =========================================================================== + +/// Futures basis: future - spot. +#[wasm_bindgen] +pub fn futures_basis(spot: f64, future: f64) -> f64 { + ferro_ta_core::futures::basis::basis(spot, future) +} + +/// Annualized basis. +#[wasm_bindgen] +pub fn annualized_basis(spot: f64, future: f64, time_to_expiry: f64) -> f64 { + ferro_ta_core::futures::basis::annualized_basis(spot, future, time_to_expiry) +} + +/// Implied carry rate. +#[wasm_bindgen] +pub fn implied_carry_rate(spot: f64, future: f64, time_to_expiry: f64) -> f64 { + ferro_ta_core::futures::basis::implied_carry_rate(spot, future, time_to_expiry) +} + +/// Carry spread. +#[wasm_bindgen] +pub fn carry_spread(spot: f64, future: f64, rate: f64, time_to_expiry: f64) -> f64 { + ferro_ta_core::futures::basis::carry_spread(spot, future, rate, time_to_expiry) +} + +/// Calendar spreads between consecutive futures prices. +#[wasm_bindgen] +pub fn calendar_spreads(futures_prices: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::futures::curve::calendar_spreads(&to_vec(futures_prices))) +} + +/// Curve slope (linear regression). +#[wasm_bindgen] +pub fn curve_slope(tenors: &Float64Array, futures_prices: &Float64Array) -> f64 { + ferro_ta_core::futures::curve::curve_slope(&to_vec(tenors), &to_vec(futures_prices)) +} + +/// Curve summary. Returns [front_basis, average_basis, slope, is_contango (1.0 or 0.0)]. +#[wasm_bindgen] +pub fn curve_summary(spot: f64, tenors: &Float64Array, futures_prices: &Float64Array) -> Array { + let s = ferro_ta_core::futures::curve::curve_summary(spot, &to_vec(tenors), &to_vec(futures_prices)); + let out = Array::new(); + out.push(&JsValue::from_f64(s.front_basis)); + out.push(&JsValue::from_f64(s.average_basis)); + out.push(&JsValue::from_f64(s.slope)); + out.push(&JsValue::from_f64(if s.is_contango { 1.0 } else { 0.0 })); + out +} + +/// Roll yield. +#[wasm_bindgen] +pub fn roll_yield(front_price: f64, next_price: f64, time_to_expiry: f64) -> f64 { + ferro_ta_core::futures::roll::roll_yield(front_price, next_price, time_to_expiry) +} + +/// Weighted continuous contract. +#[wasm_bindgen] +pub fn weighted_continuous(front: &Float64Array, next: &Float64Array, next_weights: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::futures::roll::weighted_continuous(&to_vec(front), &to_vec(next), &to_vec(next_weights))) +} + +/// Back-adjusted continuous contract. +#[wasm_bindgen] +pub fn back_adjusted_continuous(front: &Float64Array, next: &Float64Array, next_weights: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::futures::roll::back_adjusted_continuous(&to_vec(front), &to_vec(next), &to_vec(next_weights))) +} + +/// Ratio-adjusted continuous contract. +#[wasm_bindgen] +pub fn ratio_adjusted_continuous(front: &Float64Array, next: &Float64Array, next_weights: &Float64Array) -> Float64Array { + from_vec(ferro_ta_core::futures::roll::ratio_adjusted_continuous(&to_vec(front), &to_vec(next), &to_vec(next_weights))) +} + +/// Synthetic forward price from put-call parity. +#[wasm_bindgen] +pub fn synthetic_forward(call_price: f64, put_price: f64, strike: f64, rate: f64, time_to_expiry: f64) -> f64 { + ferro_ta_core::futures::synthetic::synthetic_forward(call_price, put_price, strike, rate, time_to_expiry) +} + +/// Synthetic spot implied by put-call parity. +#[wasm_bindgen] +pub fn synthetic_spot(call_price: f64, put_price: f64, strike: f64, rate: f64, carry: f64, time_to_expiry: f64) -> f64 { + ferro_ta_core::futures::synthetic::synthetic_spot(call_price, put_price, strike, rate, carry, time_to_expiry) +} + +/// Put-call parity residual. +#[wasm_bindgen] +pub fn parity_gap(call_price: f64, put_price: f64, spot: f64, strike: f64, rate: f64, carry: f64, time_to_expiry: f64) -> f64 { + ferro_ta_core::futures::synthetic::parity_gap(call_price, put_price, spot, strike, rate, carry, time_to_expiry) +} + +// =========================================================================== +// Backtesting (signal generators + utilities) +// =========================================================================== + +/// Backtest core: close-only vectorized backtest. Returns [positions, bar_returns, strategy_returns, equity]. +#[wasm_bindgen] +pub fn backtest_core( + close: &Float64Array, signals: &Float64Array, + slippage_bps: f64, initial_capital: f64, commission_per_trade: f64, +) -> Array { + match ferro_ta_core::backtest::backtest_core( + &to_vec(close), &to_vec(signals), None, slippage_bps, initial_capital, commission_per_trade, + ) { + Ok(result) => { + let out = Array::new(); + out.push(&from_vec(result.positions)); + out.push(&from_vec(result.bar_returns)); + out.push(&from_vec(result.strategy_returns)); + out.push(&from_vec(result.equity)); + out + } + Err(_) => Array::new(), + } +} + +/// Simple single-asset backtest. Returns [positions, strategy_returns, equity]. +#[wasm_bindgen] +pub fn single_asset_backtest( + close: &Float64Array, signals: &Float64Array, + commission_per_trade: f64, slippage_bps: f64, +) -> Array { + let (pos, strat_ret, eq) = ferro_ta_core::backtest::single_asset_backtest( + &to_vec(close), &to_vec(signals), commission_per_trade, slippage_bps, + ); + let out = Array::new(); + out.push(&from_vec(pos)); + out.push(&from_vec(strat_ret)); + out.push(&from_vec(eq)); + out +} + +/// Walk-forward train/test indices. Returns flat array [train_start, train_end, test_start, test_end, ...]. +#[wasm_bindgen] +pub fn walk_forward_indices( + n_bars: usize, train_bars: usize, test_bars: usize, anchored: bool, step_bars: usize, +) -> Float64Array { + match ferro_ta_core::backtest::walk_forward_indices(n_bars, train_bars, test_bars, anchored, step_bars) { + Ok(indices) => { + let flat: Vec = indices.iter() + .flat_map(|fold| vec![fold[0] as f64, fold[1] as f64, fold[2] as f64, fold[3] as f64]) + .collect(); + from_vec(flat) + } + Err(_) => from_vec(vec![]), + } +} + +/// Monte Carlo bootstrap of strategy returns. Returns Array of Float64Array (one per simulation). +#[wasm_bindgen] +pub fn monte_carlo_bootstrap( + strategy_returns: &Float64Array, n_sims: usize, seed: f64, block_size: usize, +) -> Array { + match ferro_ta_core::backtest::monte_carlo_bootstrap( + &to_vec(strategy_returns), n_sims, seed as u64, block_size, + ) { + Ok(sims) => vecs_to_array_of_f64arr(sims), + Err(_) => Array::new(), + } +} + +/// Kelly fraction. +#[wasm_bindgen] +pub fn kelly_fraction(win_rate: f64, avg_win: f64, avg_loss: f64) -> f64 { + ferro_ta_core::backtest::kelly_fraction(win_rate, avg_win, avg_loss).unwrap_or(f64::NAN) +} + +/// Half-Kelly fraction. +#[wasm_bindgen] +pub fn half_kelly_fraction(win_rate: f64, avg_win: f64, avg_loss: f64) -> f64 { + ferro_ta_core::backtest::half_kelly_fraction(win_rate, avg_win, avg_loss).unwrap_or(f64::NAN) +} + +/// Compute performance metrics from strategy returns and equity. +/// Returns Float64Array with 22 metrics in order: +/// [total_return, cagr, annualized_vol, sharpe, sortino, calmar, max_drawdown, +/// avg_drawdown, max_dd_duration, avg_dd_duration, ulcer_index, omega_ratio, +/// win_rate, profit_factor, r_expectancy, avg_win, avg_loss, tail_ratio, +/// skewness, kurtosis, best_bar, worst_bar] +#[wasm_bindgen] +pub fn compute_performance_metrics( + strategy_returns: &Float64Array, equity: &Float64Array, + periods_per_year: f64, risk_free_rate: f64, +) -> Float64Array { + match ferro_ta_core::backtest::compute_performance_metrics( + &to_vec(strategy_returns), &to_vec(equity), periods_per_year, risk_free_rate, None, + ) { + Ok(m) => from_vec(vec![ + m.total_return, m.cagr, m.annualized_vol, m.sharpe, m.sortino, m.calmar, + m.max_drawdown, m.avg_drawdown, m.max_drawdown_duration_bars as f64, + m.avg_drawdown_duration_bars, m.ulcer_index, m.omega_ratio, + m.win_rate, m.profit_factor, m.r_expectancy, m.avg_win, m.avg_loss, + m.tail_ratio, m.skewness, m.kurtosis, m.best_bar, m.worst_bar, + ]), + Err(_) => from_vec(vec![]), + } +} + +/// OHLCV-aware backtest. Returns [positions, fill_prices, bar_returns, strategy_returns, equity]. +#[wasm_bindgen] +#[allow(clippy::too_many_arguments)] +pub fn backtest_ohlcv( + open: &Float64Array, high: &Float64Array, low: &Float64Array, close: &Float64Array, + signals: &Float64Array, slippage_bps: f64, initial_capital: f64, commission_per_trade: f64, + stop_loss_pct: f64, take_profit_pct: f64, trailing_stop_pct: f64, max_hold_bars: usize, +) -> Array { + let mut config = ferro_ta_core::backtest::BacktestConfig::default(); + config.slippage_bps = slippage_bps; + config.initial_capital = initial_capital; + config.commission_per_trade = commission_per_trade; + config.stop_loss_pct = stop_loss_pct; + config.take_profit_pct = take_profit_pct; + config.trailing_stop_pct = trailing_stop_pct; + config.max_hold_bars = max_hold_bars; + match ferro_ta_core::backtest::backtest_ohlcv_core( + &to_vec(open), &to_vec(high), &to_vec(low), &to_vec(close), + &to_vec(signals), &config, None, + ) { + Ok(r) => { + let out = Array::new(); + out.push(&from_vec(r.positions)); + out.push(&from_vec(r.fill_prices)); + out.push(&from_vec(r.bar_returns)); + out.push(&from_vec(r.strategy_returns)); + out.push(&from_vec(r.equity)); + out + } + Err(_) => Array::new(), + } +} + +/// RSI threshold signals. +#[wasm_bindgen] +pub fn rsi_threshold_signals(close: &Float64Array, timeperiod: usize, oversold: f64, overbought: f64) -> Float64Array { + from_vec(ferro_ta_core::backtest::rsi_threshold_signals(&to_vec(close), timeperiod, oversold, overbought)) +} + +/// SMA crossover signals. +#[wasm_bindgen] +pub fn sma_crossover_signals(close: &Float64Array, fast: usize, slow: usize) -> Float64Array { + match ferro_ta_core::backtest::sma_crossover_signals(&to_vec(close), fast, slow) { + Ok(v) => from_vec(v), + Err(_) => from_vec(vec![f64::NAN; close.length() as usize]), + } +} + +/// MACD crossover signals. +#[wasm_bindgen] +pub fn macd_crossover_signals(close: &Float64Array, fastperiod: usize, slowperiod: usize, signalperiod: usize) -> Float64Array { + match ferro_ta_core::backtest::macd_crossover_signals(&to_vec(close), fastperiod, slowperiod, signalperiod) { + Ok(v) => from_vec(v), + Err(_) => from_vec(vec![f64::NAN; close.length() as usize]), + } +} + // --------------------------------------------------------------------------- // WASM tests (run with `wasm-pack test --node`) // --------------------------------------------------------------------------- From 6e45da2636a64ba8776a1d031e8937cbf42e3cbc Mon Sep 17 00:00:00 2001 From: Pratik Bhadane Date: Wed, 1 Apr 2026 23:04:07 +0530 Subject: [PATCH 2/2] chore: update ferro-ta version to 1.1.1 in uv.lock --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 2c5a5cf..9842b81 100644 --- a/uv.lock +++ b/uv.lock @@ -950,7 +950,7 @@ wheels = [ [[package]] name = "ferro-ta" -version = "1.1.0" +version = "1.1.1" source = { editable = "." } dependencies = [ { name = "numpy" },