Hikyuu
IndicatorImp.h
浏览该文件的文档.
1 /*
2  * ';.kmuhbvcdxIndicatorImp.h
3  *
4  * Created on: 2013-2-9
5  * Author: fasiondog
6  */
7 
8 #ifndef INDICATORIMP_H_
9 #define INDICATORIMP_H_
10 
11 #include "../KData.h"
12 #include "../utilities/Parameter.h"
13 #include "../utilities/util.h"
14 
15 #if HKU_SUPPORT_SERIALIZATION
16 #include <boost/serialization/string.hpp>
17 #include <boost/serialization/vector.hpp>
18 #include <boost/serialization/shared_ptr.hpp>
19 #include <boost/serialization/assume_abstract.hpp>
20 #include <boost/serialization/base_object.hpp>
21 #endif
22 
23 namespace hku {
24 
25 #define MAX_RESULT_NUM 6
26 
28 
35 
36 public:
38  IndicatorImp();
39  IndicatorImp(const string& name);
40  IndicatorImp(const string& name, size_t result_num);
41 
42  virtual ~IndicatorImp();
43 
44  size_t getResultNumber() const {
45  return m_result_num;
46  }
47 
48  size_t discard() const {
49  return m_discard;
50  }
51 
52  void setDiscard(size_t discard);
53 
54  size_t size() const {
55  return m_pBuffer[0] ? m_pBuffer[0]->size() : 0;
56  }
57 
58  price_t get(size_t pos, size_t num = 0) {
59  return (*m_pBuffer[num])[pos];
60  }
61 
63  PriceList getResultAsPriceList(size_t result_num);
64 
66  Indicator getResult(size_t result_num);
67 
72  void _set(price_t val, size_t pos, size_t num = 0) {
73 #if CHECK_ACCESS_BOUND
74  if ((m_pBuffer[num] == NULL) || pos>= m_pBuffer[num]->size()) {
75  throw(std::out_of_range("Try to access value out of bounds! "
76  + name() + " [IndicatorImp::_set]"));
77  }
78  (*m_pBuffer[num])[pos] = val;
79 #else
80  (*m_pBuffer[num])[pos] = val;
81 #endif
82  }
83 
90  void _readyBuffer(size_t len, size_t result_num);
91 
92  string name() const { return m_name; }
93  void name(const string& name) { m_name = name; }
94 
96  string long_name() const;
97 
98  void calculate(const Indicator& data);
99 
100  // ===================
101  // 子类接口
102  // ===================
103  virtual bool check() { return false;}
104 
105  virtual void _calculate(const Indicator& data) {}
106 
107  typedef shared_ptr<IndicatorImp> IndicatorImpPtr;
108  virtual IndicatorImpPtr operator()(const Indicator& ind);
109 
110 protected:
111  string m_name;
112  size_t m_discard;
113  size_t m_result_num;
115 
116 #if HKU_SUPPORT_SERIALIZATION
117 private:
118  friend class boost::serialization::access;
119  template<class Archive>
120  void save(Archive & ar, const unsigned int version) const {
121  namespace bs = boost::serialization;
122  string name_str(GBToUTF8(m_name));
123  ar & bs::make_nvp<string>("m_name", name_str);
124  ar & BOOST_SERIALIZATION_NVP(m_params);
125  ar & BOOST_SERIALIZATION_NVP(m_discard);
126  ar & BOOST_SERIALIZATION_NVP(m_result_num);
127  size_t act_result_num = 0;
128  size_t i = 0;
129  while (i < m_result_num) {
130  if (m_pBuffer[i++])
131  act_result_num++;
132  }
133  ar & BOOST_SERIALIZATION_NVP(act_result_num);
134 
135  for (size_t i = 0; i < act_result_num; ++i) {
136  std::stringstream buf;
137  buf << "result_" << i;
138  ar & bs::make_nvp<PriceList>(buf.str().c_str(), *m_pBuffer[i]);
139  }
140  }
141 
142  template<class Archive>
143  void load(Archive & ar, const unsigned int version) {
144  namespace bs = boost::serialization;
145  ar & BOOST_SERIALIZATION_NVP(m_name);
146  ar & BOOST_SERIALIZATION_NVP(m_params);
147  ar & BOOST_SERIALIZATION_NVP(m_discard);
148  ar & BOOST_SERIALIZATION_NVP(m_result_num);
149  size_t act_result_num = 0;
150  ar & BOOST_SERIALIZATION_NVP(act_result_num);
151  for (size_t i = 0; i < act_result_num; ++i) {
152  m_pBuffer[i] = new PriceList();
153  std::stringstream buf;
154  buf << "result_" << i;
155  ar & bs::make_nvp<PriceList>(buf.str().c_str(), *m_pBuffer[i]);
156  }
157  }
158 
159  BOOST_SERIALIZATION_SPLIT_MEMBER()
160 #endif
161 };
162 
163 #if HKU_SUPPORT_SERIALIZATION
164 BOOST_SERIALIZATION_ASSUME_ABSTRACT(IndicatorImp)
165 #endif
166 
167 #if HKU_SUPPORT_SERIALIZATION
168 #define INDICATOR_IMP_NO_PRIVATE_MEMBER_SERIALIZATION private:\
169  friend class boost::serialization::access; \
170  template<class Archive> \
171  void serialize(Archive & ar, const unsigned int version) { \
172  ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(IndicatorImp); \
173  }
174 #else
175 #define INDICATOR_IMP_NO_PRIVATE_MEMBER_SERIALIZATION
176 #endif
177 
178 #define INDICATOR_IMP(classname) public: \
179  virtual bool check(); \
180  virtual void _calculate(const Indicator& data); \
181  virtual IndicatorImpPtr operator()(const Indicator& ind) { \
182  IndicatorImpPtr p = make_shared<classname>(); \
183  p->setParameter(m_params); \
184  p->calculate(ind); \
185  return p; \
186  }
187 
188 
189 typedef shared_ptr<IndicatorImp> IndicatorImpPtr;
190 
191 HKU_API std::ostream & operator<<(std::ostream&, const IndicatorImp&);
192 HKU_API std::ostream & operator<<(std::ostream&, const IndicatorImpPtr&);
193 
194 } /* namespace hku */
195 #endif /* INDICATORIMP_H_ */
size_t size() const
Definition: IndicatorImp.h:54
shared_ptr< IndicatorImp > IndicatorImpPtr
Definition: IndicatorImp.h:189
virtual void _calculate(const Indicator &data)
Definition: IndicatorImp.h:105
指标实现类,定义新指标时,应从此类继承
Definition: IndicatorImp.h:33
vector< price_t > PriceList
Definition: DataType.h:66
string m_name
Definition: IndicatorImp.h:111
size_t getResultNumber() const
Definition: IndicatorImp.h:44
#define GBToUTF8(s)
Definition: util.h:55
指标类,具体由IndicatorImp实现,实现新指标时应继承IndicatorImp
Definition: Indicator.h:38
void load(Archive &ar, hku::Block &blk, unsigned int version)
Definition: Block_serialization.h:34
Definition: Block_serialization.h:18
size_t m_discard
Definition: IndicatorImp.h:112
shared_ptr< IndicatorImp > IndicatorImpPtr
Definition: IndicatorImp.h:107
size_t m_result_num
Definition: IndicatorImp.h:113
#define HKU_API
Definition: DataType.h:12
void save(Archive &ar, const hku::Block &blk, unsigned int version)
Definition: Block_serialization.h:20
HKU_API std::ostream & operator<<(std::ostream &os, const Block &blk)
Definition: Block.cpp:13
string name() const
Definition: IndicatorImp.h:92
double price_t
Definition: DataType.h:53
#define MAX_RESULT_NUM
Definition: IndicatorImp.h:25
void name(const string &name)
Definition: IndicatorImp.h:93
virtual bool check()
Definition: IndicatorImp.h:103
#define PARAMETER_SUPPORT
Definition: Parameter.h:233
Hikyuu核心命名空间,包含股票数据的管理、指标实现、交易系统框架等
Definition: Block.cpp:11
void _set(price_t val, size_t pos, size_t num=0)
使用IndicatorImp(const Indicator&...)构造函数后,计算结果使用该函数, 未做越界保护 ...
Definition: IndicatorImp.h:72
size_t discard() const
Definition: IndicatorImp.h:48