nautilus_indicators/python/average/
wma.rs1use nautilus_core::python::to_pyvalue_err;
17use nautilus_model::{
18 data::{Bar, QuoteTick, TradeTick},
19 enums::PriceType,
20};
21use pyo3::prelude::*;
22
23use crate::{
24 average::wma::WeightedMovingAverage,
25 indicator::{Indicator, MovingAverage},
26};
27
28#[pymethods]
29#[pyo3_stub_gen::derive::gen_stub_pymethods]
30impl WeightedMovingAverage {
31 #[new]
33 #[pyo3(signature = (period, weights, price_type=None))]
34 pub fn py_new(
35 period: usize,
36 weights: Vec<f64>,
37 price_type: Option<PriceType>,
38 ) -> PyResult<Self> {
39 Self::new_checked(period, weights, price_type).map_err(to_pyvalue_err)
40 }
41
42 fn __repr__(&self) -> String {
43 format!("WeightedMovingAverage({},{:?})", self.period, self.weights)
44 }
45
46 #[getter]
47 #[pyo3(name = "name")]
48 fn py_name(&self) -> String {
49 self.name()
50 }
51
52 #[getter]
53 #[pyo3(name = "period")]
54 const fn py_period(&self) -> usize {
55 self.period
56 }
57
58 #[getter]
59 #[pyo3(name = "count")]
60 fn py_count(&self) -> usize {
61 self.count()
62 }
63
64 #[getter]
65 #[pyo3(name = "has_inputs")]
66 fn py_has_inputs(&self) -> bool {
67 self.has_inputs()
68 }
69
70 #[getter]
71 #[pyo3(name = "initialized")]
72 const fn py_initialized(&self) -> bool {
73 self.initialized
74 }
75
76 #[pyo3(name = "handle_quote_tick")]
77 fn py_handle_quote_tick(&mut self, quote: &QuoteTick) {
78 self.py_update_raw(quote.extract_price(self.price_type).into());
79 }
80
81 #[pyo3(name = "handle_trade_tick")]
82 fn py_handle_trade_tick(&mut self, trade: &TradeTick) {
83 self.update_raw((&trade.price).into());
84 }
85
86 #[pyo3(name = "handle_bar")]
87 fn py_handle_bar(&mut self, bar: &Bar) {
88 self.update_raw((&bar.close).into());
89 }
90
91 #[pyo3(name = "reset")]
92 fn py_reset(&mut self) {
93 self.reset();
94 }
95
96 #[pyo3(name = "update_raw")]
97 fn py_update_raw(&mut self, value: f64) {
98 self.update_raw(value);
99 }
100}