longbridge_candlesticks/
market.rs1use 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}