quantwave_plugins/
custom_10.rs1use polars::prelude::*;
2use pyo3_polars::derive::polars_expr;
3use serde::Deserialize;
4use quantwave_core::*;
5use quantwave_core::traits::Next;
6
7#[derive(Deserialize)]
8pub struct HarringtonAdxKwargs {
9 pub adx_length: usize,
10 pub adx_smooth_length: usize,
11}
12
13#[polars_expr(output_type=Float64)]
14fn harrington_adx(inputs: &[Series], kwargs: HarringtonAdxKwargs) -> PolarsResult<Series> {
15 let high = inputs[0].f64()?;
16 let low = inputs[1].f64()?;
17 let close = inputs[2].f64()?;
18
19 let mut indicator = quantwave_core::HarringtonADXOscillator::new(kwargs.adx_length, kwargs.adx_smooth_length);
20 let mut values = Vec::with_capacity(close.len());
21
22 for i in 0..close.len() {
23 let h = high.get(i).unwrap_or(f64::NAN);
24 let l = low.get(i).unwrap_or(f64::NAN);
25 let c = close.get(i).unwrap_or(f64::NAN);
26 values.push(indicator.next((h, l, c)));
27 }
28
29 Ok(Series::new(inputs[0].name().clone(), values))
30}
31
32#[derive(Deserialize)]
33pub struct KalmanKwargs {
34 pub q: f64,
35 pub r: f64,
36}
37
38#[polars_expr(output_type=Float64)]
39fn kalman(inputs: &[Series], kwargs: KalmanKwargs) -> PolarsResult<Series> {
40 let ca = inputs[0].f64()?;
41 let mut indicator = quantwave_core::indicators::kalman::KalmanFilter::new(kwargs.q, kwargs.r);
42 let mut values = Vec::with_capacity(ca.len());
43
44 for i in 0..ca.len() {
45 let val = ca.get(i).unwrap_or(f64::NAN);
46 values.push(indicator.next(val));
47 }
48
49 Ok(Series::new(inputs[0].name().clone(), values))
50}