nautilus_indicators/python/momentum/
kvo.rs1use nautilus_model::data::Bar;
17use pyo3::prelude::*;
18
19use crate::{
20 average::MovingAverageType, indicator::Indicator, momentum::kvo::KlingerVolumeOscillator,
21};
22
23#[pymethods]
24impl KlingerVolumeOscillator {
25 #[new]
26 #[pyo3(signature = (fast_period, slow_period, signal_period, ma_type=None))]
27 #[must_use]
28 pub fn py_new(
29 fast_period: usize,
30 slow_period: usize,
31 signal_period: usize,
32 ma_type: Option<MovingAverageType>,
33 ) -> Self {
34 Self::new(fast_period, slow_period, signal_period, ma_type)
35 }
36
37 fn __repr__(&self) -> String {
38 format!(
39 "KlingerVolumeOscillator({},{},{},{})",
40 self.fast_period, self.slow_period, self.signal_period, self.ma_type
41 )
42 }
43
44 #[getter]
45 #[pyo3(name = "name")]
46 fn py_name(&self) -> String {
47 self.name()
48 }
49
50 #[getter]
51 #[pyo3(name = "fast_period")]
52 const fn py_fast_period(&self) -> usize {
53 self.fast_period
54 }
55
56 #[getter]
57 #[pyo3(name = "slow_period")]
58 const fn py_slow_period(&self) -> usize {
59 self.slow_period
60 }
61
62 #[getter]
63 #[pyo3(name = "signal_period")]
64 const fn py_signal_period(&self) -> usize {
65 self.signal_period
66 }
67
68 #[getter]
69 #[pyo3(name = "has_inputs")]
70 fn py_has_inputs(&self) -> bool {
71 self.has_inputs()
72 }
73
74 #[getter]
75 #[pyo3(name = "value")]
76 const fn py_value(&self) -> f64 {
77 self.value
78 }
79
80 #[getter]
81 #[pyo3(name = "initialized")]
82 const fn py_initialized(&self) -> bool {
83 self.initialized
84 }
85
86 #[pyo3(name = "update_raw")]
87 fn py_update_raw(&mut self, high: f64, low: f64, close: f64, volume: f64) {
88 self.update_raw(high, low, close, volume);
89 }
90
91 #[pyo3(name = "handle_bar")]
92 fn py_handle_bar(&mut self, bar: &Bar) {
93 self.handle_bar(bar);
94 }
95
96 #[pyo3(name = "reset")]
97 fn py_reset(&mut self) {
98 self.reset();
99 }
100}