tdx_rs/tdx_model/builder/
indicator_builder.rs

1use std::{fs::File, path::Path};
2
3use crate::{CombinedIndicatorDayLine, FullDailyData, SingleIndicatorDayLine};
4
5use super::{DayLineBuilder, DAY_SIZE};
6
7#[derive(Debug)]
8pub struct IndicatorBuilder {
9    day_line_builder: DayLineBuilder,
10}
11
12impl IndicatorBuilder {
13    pub fn from_path<P: AsRef<Path>>(path: P) -> anyhow::Result<Self> {
14        let file = File::open(path.as_ref())?;
15        let max_days = std::fs::metadata(path.as_ref())?.len() / (DAY_SIZE as u64);
16        let day_line_builder = DayLineBuilder {file, max_days};
17        Ok(Self {day_line_builder})
18    }
19
20    pub fn query_days(self, days: u64) -> Self {
21        let inner_builder = self.day_line_builder.query_days(days);
22        Self { day_line_builder: inner_builder }
23    }
24
25    pub fn build_short_indicator(self) -> SingleIndicatorDayLine {
26        let day_line = self.day_line_builder.build();
27        crate::short_macd(&day_line)
28    }
29
30    pub fn build_combined_indicator(self) -> CombinedIndicatorDayLine {
31        let day_line = self.day_line_builder.build();
32        crate::combined_macd(&day_line)
33    }
34
35    pub fn build_full_data(self) -> Vec<FullDailyData> {
36        let day_line = self.day_line_builder.build();
37        crate::full_data(day_line)
38    }
39}
40
41
42
43#[cfg(test)]
44mod indicator_tests {
45    use super::*;
46
47    #[test]
48    fn test_indicator_builder() -> anyhow::Result<()> {
49        let builder = IndicatorBuilder::from_path("../data/shlday/sh600000.day")?.query_days(400);
50
51        let short_indicator_line = builder.build_short_indicator();
52        dbg!(short_indicator_line.inner().len());
53        Ok(())
54    }
55
56    #[test]
57    fn test_combined_indicator() -> anyhow::Result<()> {
58        let builder = IndicatorBuilder::from_path("../data/shlday/sh600000.day")?.query_days(400);
59
60        let combined_indicator_line = builder.build_combined_indicator();
61        dbg!(combined_indicator_line.inner().len());
62        Ok(())
63    }
64
65    #[test]
66    fn test_full_data() -> anyhow::Result<()> {
67        let builder = IndicatorBuilder::from_path("../data/shlday/sh600000.day")?.query_days(400);
68
69        let full_data = builder.build_full_data();
70        dbg!(full_data.len());
71        Ok(())
72    }
73}