File size: 2,062 Bytes
61a815f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use crate::models::MarketData;

/// 数据验证器
pub struct DataValidator {
}

impl DataValidator {
    pub fn new() -> Self {
        DataValidator {}
    }
    
    /// 验证时间是否在交易时段
    pub fn validate_time(&self, time_sec: u32) -> bool {
        // 转换为时分秒
        let hour = time_sec / 10000;
        let minute = (time_sec / 100) % 100;
        let _second = time_sec % 100;
        
        // 早盘:09:15 - 11:30
        if hour == 9 && minute >= 15 {
            return true;
        }
        if hour == 10 {
            return true;
        }
        if hour == 11 && minute <= 30 {
            return true;
        }
        
        // 午盘:13:00 - 15:00
        if hour == 13 {
            return true;
        }
        if hour == 14 {
            return true;
        }
        if hour == 15 && minute == 0 {
            return true;
        }
        
        false
    }
    
    
    /// 验证MarketData
    pub fn validate(&self, data: &MarketData) -> bool {
        // 验证时间
        if !self.validate_time(data.time_sec) {
            return false;
        }
        true
    }
}

/// 过滤MarketData列表
pub fn filter_valid_data(data: Vec<MarketData>, validator: &DataValidator) -> Vec<MarketData> {
    data.into_iter()
        .filter(|d| validator.validate(d))
        .collect()
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[test]
    fn test_validate_time() {
        let validator = DataValidator::new();
        
        // 早盘
        assert!(validator.validate_time(91500));  // 09:15:00
        assert!(validator.validate_time(113000)); // 11:30:00
        assert!(!validator.validate_time(91400)); // 09:14:00
        assert!(!validator.validate_time(113100)); // 11:31:00
        
        // 午盘
        assert!(validator.validate_time(130000)); // 13:00:00
        assert!(validator.validate_time(150000)); // 15:00:00
        assert!(!validator.validate_time(125900)); // 12:59:00
        assert!(!validator.validate_time(150100)); // 15:01:00
    }
    
}