tdx_rs/tdx_model/builder/
indicator_builder.rs1use 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}