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