longbridge_candlesticks/
market.rs

1use time::{macros::time, Time};
2use time_tz::Tz;
3
4use crate::Type;
5
6bitflags::bitflags! {
7    #[derive(Debug, Copy, Clone)]
8    pub(crate) struct UpdateFields: u32 {
9        const PRICE = 0x1;
10        const VOLUME = 0x2;
11    }
12}
13
14#[derive(Debug, Clone, Copy, Eq, PartialEq)]
15pub enum Market {
16    HK,
17    US,
18    SH,
19    SZ,
20}
21
22impl Market {
23    #[inline]
24    pub fn timezone(&self) -> &Tz {
25        use time_tz::timezones::db;
26
27        match self {
28            Market::HK => db::asia::HONG_KONG,
29            Market::US => db::america::NEW_YORK,
30            Market::SH | Market::SZ => db::asia::SHANGHAI,
31        }
32    }
33
34    #[inline]
35    pub(crate) fn update_fields(&self, trade_type: &str) -> UpdateFields {
36        match self {
37            Market::HK => match trade_type {
38                "" => UpdateFields::all(),
39                "D" => UpdateFields::VOLUME,
40                "M" => UpdateFields::VOLUME,
41                "P" => UpdateFields::VOLUME,
42                "U" => UpdateFields::all(),
43                "X" => UpdateFields::VOLUME,
44                "Y" => UpdateFields::VOLUME,
45                _ => UpdateFields::empty(),
46            },
47            Market::US => match trade_type {
48                "" => UpdateFields::all(),
49                "A" => UpdateFields::all(),
50                "B" => UpdateFields::all(),
51                "C" => UpdateFields::VOLUME,
52                "D" => UpdateFields::all(),
53                "E" => UpdateFields::all(),
54                "F" => UpdateFields::all(),
55                "G" => UpdateFields::all(),
56                "H" => UpdateFields::VOLUME,
57                "I" => UpdateFields::VOLUME,
58                "K" => UpdateFields::all(),
59                "L" => UpdateFields::all(),
60                "P" => UpdateFields::all(),
61                "S" => UpdateFields::all(),
62                "V" => UpdateFields::VOLUME,
63                "W" => UpdateFields::VOLUME,
64                "X" => UpdateFields::all(),
65                "1" => UpdateFields::all(),
66                _ => UpdateFields::empty(),
67            },
68            Market::SH | Market::SZ => UpdateFields::all(),
69        }
70    }
71
72    #[inline]
73    pub(crate) fn trade_sessions(&self, ty: Type) -> &'static [(Time, Time)] {
74        match (self, ty) {
75            (Market::HK, _) => &[
76                (time!(9:30:00), time!(12:00:00)),
77                (time!(13:00:00), time!(16:00:00)),
78            ],
79            (Market::US, Type::USOQ) => &[(time!(9:30:00), time!(16:15:00))],
80            (Market::US, _) => &[(time!(9:30:00), time!(16:00:00))],
81            (Market::SH | Market::SZ, _) => &[
82                (time!(9:30:00), time!(11:30:00)),
83                (time!(13:00:00), time!(15:00:00)),
84            ],
85        }
86    }
87
88    #[inline]
89    pub(crate) fn half_trade_sessions(&self, ty: Type) -> &'static [(Time, Time)] {
90        match (self, ty) {
91            (Market::HK, _) => &[(time!(9:30:00), time!(12:00:00))],
92            (Market::US, Type::USOQ) => &[(time!(9:30:00), time!(13:00:00))],
93            (Market::US, _) => &[(time!(9:30:00), time!(13:00:00))],
94            (Market::SH | Market::SZ, _) => unreachable!("does not supported"),
95        }
96    }
97
98    #[inline]
99    pub(crate) fn num_shares(&self, volume: i64) -> i64 {
100        match self {
101            Market::HK => volume,
102            Market::US => volume,
103            Market::SH => volume * 100,
104            Market::SZ => volume * 100,
105        }
106    }
107}