Skip to main content

quantwave_plugins/
custom_10.rs

1use 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}