5
5
* Author: fasiondog
6
6
*/
7
7
8
+ #include " hikyuu/indicator/crt/PRICELIST.h"
8
9
#include " EnvironmentBase.h"
9
10
10
11
namespace hku {
@@ -26,7 +27,11 @@ HKU_API std::ostream& operator<<(std::ostream& os, const EnvironmentPtr& en) {
26
27
EnvironmentBase::EnvironmentBase () : m_name(" EnvironmentBase" ) {}
27
28
28
29
EnvironmentBase::EnvironmentBase (const EnvironmentBase& base)
29
- : m_params(base.m_params), m_name(base.m_name), m_valid(base.m_valid) {}
30
+ : m_params(base.m_params),
31
+ m_name (base.m_name),
32
+ m_query(base.m_query),
33
+ m_date_index(base.m_date_index),
34
+ m_values(base.m_values) {}
30
35
31
36
EnvironmentBase::EnvironmentBase (const string& name) : m_name(name) {}
32
37
@@ -38,7 +43,8 @@ void EnvironmentBase::paramChanged() {}
38
43
void EnvironmentBase::reset () {
39
44
std::unique_lock<std::shared_mutex> lock (m_mutex);
40
45
m_query = Null<KQuery>();
41
- m_valid.clear ();
46
+ m_date_index.clear ();
47
+ m_values.clear ();
42
48
_reset ();
43
49
}
44
50
@@ -59,27 +65,60 @@ EnvironmentPtr EnvironmentBase::clone() {
59
65
p->m_params = m_params;
60
66
p->m_name = m_name;
61
67
p->m_query = m_query;
62
- p->m_valid = m_valid;
68
+ p->m_date_index = m_date_index;
69
+ p->m_values = m_values;
63
70
return p;
64
71
}
65
72
66
73
void EnvironmentBase::setQuery (const KQuery& query) {
67
74
std::unique_lock<std::shared_mutex> lock (m_mutex);
68
75
if (m_query != query) {
69
- m_valid.clear ();
76
+ m_query = Null<KQuery>();
77
+ m_date_index.clear ();
78
+ m_values.clear ();
70
79
_reset ();
71
80
m_query = query;
72
81
_calculate ();
73
82
}
74
83
}
75
84
76
- void EnvironmentBase::_addValid (const Datetime& datetime) {
77
- m_valid.insert (datetime);
85
+ void EnvironmentBase::_addValid (const Datetime& datetime, price_t value) {
86
+ auto iter = m_date_index.find (datetime);
87
+ if (iter == m_date_index.end ()) {
88
+ m_date_index[datetime] = m_values.size ();
89
+ m_values.push_back (value);
90
+ } else {
91
+ m_values[iter->second ] += value;
92
+ }
93
+ }
94
+
95
+ bool EnvironmentBase::isValid (const Datetime& datetime) const {
96
+ std::shared_lock<std::shared_mutex> lock (m_mutex);
97
+ auto iter = m_date_index.find (datetime);
98
+ HKU_IF_RETURN (iter == m_date_index.end (), false );
99
+ return m_values[iter->second ] > 0 .;
100
+ }
101
+
102
+ price_t EnvironmentBase::getValue (const Datetime& datetime) const {
103
+ std::shared_lock<std::shared_mutex> lock (m_mutex);
104
+ auto iter = m_date_index.find (datetime);
105
+ return iter == m_date_index.end () ? 0 . : m_values[iter->second ];
78
106
}
79
107
80
- bool EnvironmentBase::isValid ( const Datetime& datetime) {
108
+ Indicator EnvironmentBase::getValues () const {
81
109
std::shared_lock<std::shared_mutex> lock (m_mutex);
82
- return m_valid.count (datetime) != 0 ;
110
+ DatetimeList dates;
111
+ PriceList values;
112
+ for (const auto & d : m_date_index) {
113
+ dates.emplace_back (d.first );
114
+ }
115
+
116
+ values.reserve (dates.size ());
117
+ for (const auto & d : dates) {
118
+ values.emplace_back (m_values[m_date_index.at (d)]);
119
+ }
120
+
121
+ return PRICELIST (values, dates);
83
122
}
84
123
85
124
} /* namespace hku */
0 commit comments