test_doc
test_Indicator.cpp
浏览该文件的文档.
1 /*
2  * test_Indicator.cpp
3  *
4  * Created on: 2013-4-11
5  * Author: fasiondog
6  */
7 
8 #ifdef TEST_ALL_IN_ONE
9  #include <boost/test/unit_test.hpp>
10 #else
11  #define BOOST_TEST_MODULE test_hikyuu_indicator_suite
12  #include <boost/test/unit_test.hpp>
13 #endif
14 
15 #include <hikyuu/indicator/Indicator.h>
16 #include <hikyuu/indicator/crt/PRICELIST.h>
17 #include <hikyuu/indicator/crt/KDATA.h>
18 #include <hikyuu/StockManager.h>
19 
20 using namespace hku;
21 
29 BOOST_AUTO_TEST_CASE( test_operator_add ) {
31  PriceList d1, d2;
32  for (size_t i = 0; i < 10; ++i) {
33  d1.push_back(i);
34  d2.push_back(i+1);
35  }
36 
37  Indicator data1 = PRICELIST(d1);
38  Indicator data2 = PRICELIST(d2);
39  Indicator result = data1 + data2;
40  BOOST_CHECK(result.size() == 10);
41  BOOST_CHECK(result.getResultNumber() == 1);
42  BOOST_CHECK(result.discard() == 0);
43  for (size_t i = 0; i < 10; ++i) {
44  BOOST_CHECK(result[i] == i + i + 1);
45  }
46 
48  Indicator data3;
49  result = data1 + data3;
50  BOOST_CHECK(result.empty());
51  BOOST_CHECK(result.size() == 0);
52 
54  StockManager& sm = StockManager::instance();
55  Stock stock = sm.getStock("sh600000");
56  KQuery query(0, 10);
57  KData kdata = stock.getKData(query);
58  Indicator k = KDATA(kdata);
59  BOOST_CHECK(k.size() == data1.size());
60  result = k + data1;
61  BOOST_CHECK(result.size() == k.size());
62  BOOST_CHECK(result.getResultNumber() == 1);
63  for (size_t i = 0; i < result.size(); ++i) {
64  BOOST_CHECK(result[i] == (k[i] + data1[i]));
65  }
66 }
67 
69 BOOST_AUTO_TEST_CASE( test_operator_reduce ) {
71  PriceList d1, d2;
72  for (size_t i = 0; i < 10; ++i) {
73  d1.push_back(i);
74  d2.push_back(i+1);
75  }
76 
77  Indicator data1 = PRICELIST(d1);
78  Indicator data2 = PRICELIST(d2);
79  Indicator result = data1 - data2;
80  BOOST_CHECK(result.size() == 10);
81  BOOST_CHECK(result.getResultNumber() == 1);
82  BOOST_CHECK(result.discard() == 0);
83  for (size_t i = 0; i < 10; ++i) {
84  BOOST_CHECK(result[i] == data1[i] - data2[i]);
85  }
86 
88  Indicator data3;
89  result = data1 - data3;
90  BOOST_CHECK(result.empty());
91  BOOST_CHECK(result.size() == 0);
92 
94  StockManager& sm = StockManager::instance();
95  Stock stock = sm.getStock("sh600000");
96  KQuery query(0, 10);
97  KData kdata = stock.getKData(query);
98  Indicator k = KDATA(kdata);
99  BOOST_CHECK(k.size() == data1.size());
100  result = k - data1;
101  BOOST_CHECK(result.size() == k.size());
102  for (size_t i = 0; i < result.size(); ++i) {
103  BOOST_CHECK(result[i] == (k[i] - data1[i]));
104  }
105 }
106 
107 
109 BOOST_AUTO_TEST_CASE( test_operator_multi ) {
111  PriceList d1, d2;
112  for (size_t i = 0; i < 10; ++i) {
113  d1.push_back(i);
114  d2.push_back(i+1);
115  }
116 
117  Indicator data1 = PRICELIST(d1);
118  Indicator data2 = PRICELIST(d2);
119  Indicator result = data1 * data2;
120  BOOST_CHECK(result.size() == 10);
121  BOOST_CHECK(result.getResultNumber() == 1);
122  BOOST_CHECK(result.discard() == 0);
123  for (size_t i = 0; i < 10; ++i) {
124  BOOST_CHECK(result[i] == data1[i] * data2[i]);
125  }
126 
128  Indicator data3;
129  result = data1 * data3;
130  BOOST_CHECK(result.empty());
131  BOOST_CHECK(result.size() == 0);
132 
134  StockManager& sm = StockManager::instance();
135  Stock stock = sm.getStock("sh600000");
136  KQuery query(0, 10);
137  KData kdata = stock.getKData(query);
138  Indicator k = KDATA(kdata);
139  BOOST_CHECK(k.size() == data1.size());
140  result = k * data1;
141  BOOST_CHECK(result.size() == k.size());
142  for (size_t i = 0; i < result.size(); ++i) {
143  BOOST_CHECK(result[i] == (k[i] * data1[i]));
144  }
145 }
146 
147 
149 BOOST_AUTO_TEST_CASE( test_operator_division ) {
151  PriceList d1, d2;
152  for (size_t i = 0; i < 10; ++i) {
153  d1.push_back(i);
154  d2.push_back(i+1);
155  }
156 
157  Indicator data1 = PRICELIST(d1);
158  Indicator data2 = PRICELIST(d2);
159  Indicator result = data2 / data1;
160  BOOST_CHECK(result.size() == 10);
161  BOOST_CHECK(result.getResultNumber() == 1);
162  BOOST_CHECK(result.discard() == 0);
163  for (size_t i = 0; i < 10; ++i) {
164  if (data1[i] == 0.0) {
165  BOOST_CHECK(result[i] == Null<price_t>());
166  } else {
167  BOOST_CHECK(result[i] == data2[i] / data1[i]);
168  }
169  }
170 
172  Indicator data3;
173  result = data1 / data3;
174  BOOST_CHECK(result.empty());
175  BOOST_CHECK(result.size() == 0);
176 
178  StockManager& sm = StockManager::instance();
179  Stock stock = sm.getStock("sh600000");
180  KQuery query(0, 10);
181  KData kdata = stock.getKData(query);
182  Indicator k = KDATA(kdata);
183  BOOST_CHECK(k.size() == data1.size());
184  result = k / data1;
185  BOOST_CHECK(result.size() == k.size());
186  for (size_t i = 0; i < result.size(); ++i) {
187  if (data1[i] == 0.0) {
188  BOOST_CHECK(result[i] == Null<price_t>());
189  } else {
190  BOOST_CHECK(result[i] == (k[i] / data1[i]));
191  }
192  }
193 }
194 
196 BOOST_AUTO_TEST_CASE( test_operator_eq ) {
198  PriceList d1, d2;
199  for (size_t i = 0; i < 10; ++i) {
200  d1.push_back(i);
201  d2.push_back(i);
202  }
203 
204  Indicator data1 = PRICELIST(d1);
205  Indicator data2 = PRICELIST(d2);
206  Indicator result = (data2 == data1);
207  BOOST_CHECK(result.size() == 10);
208  BOOST_CHECK(result.getResultNumber() == 1);
209  BOOST_CHECK(result.discard() == 0);
210  for (size_t i = 0; i < 10; ++i) {
211  BOOST_CHECK(result[i] == true);
212  }
213 
215  Indicator data3;
216  result = (data1 == data3);
217  BOOST_CHECK(result.empty());
218  BOOST_CHECK(result.size() == 0);
219 
221  StockManager& sm = StockManager::instance();
222  Stock stock = sm.getStock("sh600000");
223  KQuery query(0, 10);
224  KData kdata = stock.getKData(query);
225  Indicator k = KDATA(kdata);
226  BOOST_CHECK(k.size() == data1.size());
227  result = (k == data1);
228  BOOST_CHECK(result.size() == k.size());
229  for (size_t i = 0; i < result.size(); ++i) {
230  BOOST_CHECK(result[i] == false);
231  }
232 }
233 
235 BOOST_AUTO_TEST_CASE( test_operator_ne ) {
237  PriceList d1, d2;
238  for (size_t i = 0; i < 10; ++i) {
239  d1.push_back(i);
240  d2.push_back(i);
241  }
242 
243  Indicator data1 = PRICELIST(d1);
244  Indicator data2 = PRICELIST(d2);
245  Indicator result = (data2 != data1);
246  BOOST_CHECK(result.size() == 10);
247  BOOST_CHECK(result.getResultNumber() == 1);
248  BOOST_CHECK(result.discard() == 0);
249  for (size_t i = 0; i < 10; ++i) {
250  BOOST_CHECK(result[i] == false);
251  }
252 
254  Indicator data3;
255  result = (data1 != data3);
256  BOOST_CHECK(result.empty());
257  BOOST_CHECK(result.size() == 0);
258 
260  StockManager& sm = StockManager::instance();
261  Stock stock = sm.getStock("sh600000");
262  KQuery query(0, 10);
263  KData kdata = stock.getKData(query);
264  Indicator k = KDATA(kdata);
265  BOOST_CHECK(k.size() == data1.size());
266  result = (k != data1);
267  BOOST_CHECK(result.size() == k.size());
268  for (size_t i = 0; i < result.size(); ++i) {
269  BOOST_CHECK(result[i] == true);
270  }
271 }
272 
274 BOOST_AUTO_TEST_CASE( test_operator_gt ) {
275  PriceList d1, d2, d3;
276  for (size_t i = 0; i < 10; ++i) {
277  d1.push_back(i);
278  d2.push_back(i);
279  d3.push_back(i+1);
280  }
281 
282  Indicator data1 = PRICELIST(d1);
283  Indicator data2 = PRICELIST(d2);
284  Indicator data3 = PRICELIST(d3);
285 
287  Indicator result = (data3 > data1);
288  BOOST_CHECK(result.size() == 10);
289  BOOST_CHECK(result.getResultNumber() == 1);
290  BOOST_CHECK(result.discard() == 0);
291  for (size_t i = 0; i < 10; ++i) {
292  BOOST_CHECK(result[i] == 1.0);
293  }
294 
296  result = (data1 > data3);
297  for (size_t i = 0; i < 10; ++i) {
298  BOOST_CHECK(result[i] == 0.0);
299  }
300 
302  result = (data1 > data2);
303  for (size_t i = 0; i < 10; ++i) {
304  BOOST_CHECK(result[i] == 0.0);
305  }
306 
308  Indicator data4;
309  result = data1 > data4;
310  BOOST_CHECK(result.empty());
311  BOOST_CHECK(result.size() == 0);
312 
314  StockManager& sm = StockManager::instance();
315  Stock stock = sm.getStock("sh600000");
316  KQuery query(0, 10);
317  KData kdata = stock.getKData(query);
318  Indicator k = KDATA(kdata);
319  BOOST_CHECK(k.size() == data1.size());
320  result = (k > data1);
321  BOOST_CHECK(result.size() == k.size());
322  for (size_t i = 0; i < result.size(); ++i) {
323  BOOST_CHECK(result[i] == 1.0);
324  }
325 }
326 
328 BOOST_AUTO_TEST_CASE( test_operator_ge ) {
329  PriceList d1, d2, d3;
330  for (size_t i = 0; i < 10; ++i) {
331  d1.push_back(i);
332  d2.push_back(i);
333  d3.push_back(i+1);
334  }
335 
336  Indicator data1 = PRICELIST(d1);
337  Indicator data2 = PRICELIST(d2);
338  Indicator data3 = PRICELIST(d3);
339 
341  Indicator result = (data3 >= data1);
342  BOOST_CHECK(result.size() == 10);
343  BOOST_CHECK(result.getResultNumber() == 1);
344  BOOST_CHECK(result.discard() == 0);
345  for (size_t i = 0; i < 10; ++i) {
346  BOOST_CHECK(result[i] == 1.0);
347  }
348 
350  result = (data1 >= data3);
351  for (size_t i = 0; i < 10; ++i) {
352  BOOST_CHECK(result[i] == 0.0);
353  }
354 
356  result = (data1 >= data2);
357  for (size_t i = 0; i < 10; ++i) {
358  BOOST_CHECK(result[i] == 1.0);
359  }
360 
362  Indicator data4;
363  result = data1 >= data4;
364  BOOST_CHECK(result.empty());
365  BOOST_CHECK(result.size() == 0);
366 
368  StockManager& sm = StockManager::instance();
369  Stock stock = sm.getStock("sh600000");
370  KQuery query(0, 10);
371  KData kdata = stock.getKData(query);
372  Indicator k = KDATA(kdata);
373  BOOST_CHECK(k.size() == data1.size());
374  result = (k >= data1);
375  BOOST_CHECK(result.size() == k.size());
376  for (size_t i = 0; i < result.size(); ++i) {
377  BOOST_CHECK(result[i] == 1.0);
378  }
379 }
380 
382 BOOST_AUTO_TEST_CASE( test_operator_lt ) {
383  PriceList d1, d2, d3;
384  for (size_t i = 0; i < 10; ++i) {
385  d1.push_back(i);
386  d2.push_back(i);
387  d3.push_back(i+1);
388  }
389 
390  Indicator data1 = PRICELIST(d1);
391  Indicator data2 = PRICELIST(d2);
392  Indicator data3 = PRICELIST(d3);
393 
395  Indicator result = (data3 < data1);
396  BOOST_CHECK(result.size() == 10);
397  BOOST_CHECK(result.getResultNumber() == 1);
398  BOOST_CHECK(result.discard() == 0);
399  for (size_t i = 0; i < 10; ++i) {
400  BOOST_CHECK(result[i] == 0.0);
401  }
402 
404  result = (data1 < data3);
405  for (size_t i = 0; i < 10; ++i) {
406  BOOST_CHECK(result[i] == 1.0);
407  }
408 
410  result = (data1 < data2);
411  for (size_t i = 0; i < 10; ++i) {
412  BOOST_CHECK(result[i] == 0.0);
413  }
414 
416  Indicator data4;
417  result = data1 < data4;
418  BOOST_CHECK(result.empty());
419  BOOST_CHECK(result.size() == 0);
420 
422  StockManager& sm = StockManager::instance();
423  Stock stock = sm.getStock("sh600000");
424  KQuery query(0, 10);
425  KData kdata = stock.getKData(query);
426  Indicator k = KDATA(kdata);
427  BOOST_CHECK(k.size() == data1.size());
428  result = (k < data1);
429  BOOST_CHECK(result.size() == k.size());
430  for (size_t i = 0; i < result.size(); ++i) {
431  BOOST_CHECK(result[i] == 0.0);
432  }
433 }
434 
436 BOOST_AUTO_TEST_CASE( test_operator_le ) {
437  PriceList d1, d2, d3;
438  for (size_t i = 0; i < 10; ++i) {
439  d1.push_back(i);
440  d2.push_back(i);
441  d3.push_back(i+1);
442  }
443 
444  Indicator data1 = PRICELIST(d1);
445  Indicator data2 = PRICELIST(d2);
446  Indicator data3 = PRICELIST(d3);
447 
449  Indicator result = (data3 <= data1);
450  BOOST_CHECK(result.size() == 10);
451  BOOST_CHECK(result.getResultNumber() == 1);
452  BOOST_CHECK(result.discard() == 0);
453  for (size_t i = 0; i < 10; ++i) {
454  BOOST_CHECK(result[i] == 0.0);
455  }
456 
458  result = (data1 <= data3);
459  for (size_t i = 0; i < 10; ++i) {
460  BOOST_CHECK(result[i] == 1.0);
461  }
462 
464  result = (data1 <= data2);
465  for (size_t i = 0; i < 10; ++i) {
466  BOOST_CHECK(result[i] == 1.0);
467  }
468 
470  Indicator data4;
471  result = data1 <= data4;
472  BOOST_CHECK(result.empty());
473  BOOST_CHECK(result.size() == 0);
474 
476  StockManager& sm = StockManager::instance();
477  Stock stock = sm.getStock("sh600000");
478  KQuery query(0, 10);
479  KData kdata = stock.getKData(query);
480  Indicator k = KDATA(kdata);
481  BOOST_CHECK(k.size() == data1.size());
482  result = (k <= data1);
483  BOOST_CHECK(result.size() == k.size());
484  for (size_t i = 0; i < result.size(); ++i) {
485  BOOST_CHECK(result[i] == 0.0);
486  }
487 }
488 
489 
491 BOOST_AUTO_TEST_CASE( test_getResult_getResultAsPriceList ) {
492  StockManager& sm = StockManager::instance();
493  Stock stock = sm.getStock("sh600000");
494  KQuery query;
495  KData kdata;
496  Indicator ikdata, result1;
497  PriceList result2;
498 
500  ikdata = KDATA(kdata);
501  result1 = ikdata.getResult(0);
502  result2 = ikdata.getResultAsPriceList(0);
503  BOOST_CHECK(result1.size() == 0);
504  BOOST_CHECK(result2.size() == 0);
505 
507  query = KQuery(0, 10);
508  kdata = stock.getKData(query);
509  ikdata = KDATA(kdata);
510  BOOST_CHECK(ikdata.size() == 10);
511  result1 = ikdata.getResult(6);
512  result2 = ikdata.getResultAsPriceList(6);
513  BOOST_CHECK(result1.size() == 0);
514  BOOST_CHECK(result2.size() == 0);
515 
517  result1 = ikdata.getResult(0);
518  result2 = ikdata.getResultAsPriceList(1);
519  BOOST_CHECK(result1.size() == 10);
520  BOOST_CHECK(result2.size() == 10);
521  BOOST_CHECK(result1[0] == 29.5);
522  BOOST_CHECK(std::fabs(result1[1] - 27.58) < 0.0001);
523  BOOST_CHECK(result1[9] == 26.45);
524 
525  BOOST_CHECK(result2[0] == 29.8);
526  BOOST_CHECK(result2[1] == 28.38);
527  BOOST_CHECK(result2[9] == 26.55);
528 }
529 
BOOST_AUTO_TEST_CASE(test_operator_add)