test_doc
test_Simple_SYS_for_ev.cpp
浏览该文件的文档.
1 /*
2  * test_SYS_Simple.cpp
3  *
4  * Created on: 2013-4-20
5  * Author: fasiondog
6  */
7 
8 
9 #ifdef TEST_ALL_IN_ONE
10  #include <boost/test/unit_test.hpp>
11 #else
12  #define BOOST_TEST_MODULE test_hikyuu_trade_sys_suite
13  #include <boost/test/unit_test.hpp>
14 #endif
15 
16 #include "test_sys.h"
17 #include <hikyuu/StockManager.h>
18 #include <hikyuu/indicator/crt/MA.h>
19 #include <hikyuu/trade_manage/crt/crtTM.h>
20 #include <hikyuu/trade_sys/system/crt/SYS_Simple.h>
21 #include <hikyuu/trade_sys/signal/crt/SG_Cross.h>
22 #include <hikyuu/trade_sys/moneymanager/crt/MM_FixedCount.h>
23 #include <hikyuu/trade_sys/stoploss/crt/ST_FixedPercent.h>
24 #include <hikyuu/trade_sys/stoploss/crt/ST_Indicator.h>
25 
26 
27 using namespace hku;
28 
36 BOOST_AUTO_TEST_CASE( test_SYS_Simple_for_ev) {
37  TradeRecordList tr_list;
38  price_t current_cash;
39 
40  StockManager& sm = StockManager::instance();
41 
42  //初始参数
43  Datetime init_date(199001010000LL); //账户初始日期
44  price_t init_cash = 100000; //账户初始金额
45  TradeCostPtr costfunc = TC_Zero(); //零成本函数
46  Stock stk = sm["sh600000"]; //选定标的
47  Datetime start_date(199911100000LL); //测试起始日期
48  Datetime end_date(200002250000LL); //测试结束日期
49 
50  KQuery query = KQueryByDate(start_date, end_date, KQuery::DAY);
51 
52  //构建系统部件
53  TMPtr tm = crtTM(init_date, init_cash, costfunc, "TEST_TM");
54  SGPtr sg = SG_Cross(OP(MA(5)), OP(MA(10)), "CLOSE");
55  MMPtr mm = MM_FixedCount(100);
56  STPtr st = ST_FixedPercent(0.01);
57  TPPtr tp = ST_Indicator(OP(MA(5)), "CLOSE");
58  SYSPtr sys;
59 
60  EVPtr ev1 = make_shared<TestEV1>();
61  ev1->setQuery(query);
62 
63  EVPtr ev2 = make_shared<TestEV2>();
64  ev2->setQuery(query);
65 
66  EVPtr ev3 = make_shared<TestEV3>();
67  ev3->setQuery(query);
68 
70  sys = SYS_Simple();
71  sys->setParam<bool>("delay", false);
72  sys->setParam<bool>("ev_open_position", false);
73  sys->setTM(tm->clone());
74  sys->setSG(sg->clone());
75  sys->setMM(mm->clone());
76  sys->setST(st->clone());
77  sys->setTP(tp->clone());
78  sys->setEV(ev1);
79 
80  BOOST_CHECK(sys->readyForRun() == true);
81  sys->run(stk, query);
82  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
83  tr_list = sys->getTM()->getTradeList();
84  BOOST_CHECK(tr_list.size() == 3);
85  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
86 
87  BOOST_CHECK(tr_list[1].stock == stk);
88  BOOST_CHECK(tr_list[1].datetime == Datetime(200001050000LL));
89  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
90  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.28) < 0.00001);
91  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.28) < 0.00001);
92  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
93  BOOST_CHECK(tr_list[1].number == 100);
94  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
95  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 25.03) < 0.00001);
96  current_cash = init_cash - 2528;
97  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
98  BOOST_CHECK(tr_list[1].from == PART_SIGNAL);
99 
100  BOOST_CHECK(tr_list[2].stock == stk);
101  BOOST_CHECK(tr_list[2].datetime == Datetime(200001100000LL));
102  BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
103  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 27.25) < 0.00001);
104  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 27.25) < 0.00001);
105  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
106  BOOST_CHECK(tr_list[2].number == 100);
107  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
108  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 26.98) < 0.00001);
109  current_cash += 2725;
110  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
111  BOOST_CHECK(tr_list[2].from == PART_ENVIRONMENT);
112 
114  sys = SYS_Simple();
115  sys->setParam<bool>("delay", false);
116  sys->setParam<bool>("ev_open_position", true);
117  sys->setTM(tm->clone());
118  sys->setSG(sg->clone());
119  sys->setMM(mm->clone());
120  sys->setST(st->clone());
121  sys->setTP(tp->clone());
122  sys->setEV(ev1);
123 
124  BOOST_CHECK(sys->readyForRun() == true);
125  sys->run(stk, query);
126  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
127  tr_list = sys->getTM()->getTradeList();
128  BOOST_CHECK(tr_list.size() == 4);
129  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
130 
131  BOOST_CHECK(tr_list[1].stock == stk);
132  BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
133  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
134  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
135  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
136  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
137  BOOST_CHECK(tr_list[1].number == 100);
138  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
139  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 25.31) < 0.00001);
140  current_cash = init_cash - 2557;
141  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
142  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
143 
144  BOOST_CHECK(tr_list[2].stock == stk);
145  BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
146  BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
147  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
148  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
149  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
150  BOOST_CHECK(tr_list[2].number == 100);
151  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
152  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.03) < 0.00001);
153  current_cash -= 2528;
154  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
155  BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
156 
157  BOOST_CHECK(tr_list[3].stock == stk);
158  BOOST_CHECK(tr_list[3].datetime == Datetime(200001100000LL));
159  BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
160  BOOST_CHECK(std::fabs(tr_list[3].planPrice - 27.25) < 0.00001);
161  BOOST_CHECK(std::fabs(tr_list[3].realPrice - 27.25) < 0.00001);
162  BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
163  BOOST_CHECK(tr_list[3].number == 200);
164  BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
165  BOOST_CHECK(std::fabs(tr_list[3].stoploss - 26.98) < 0.00001);
166  current_cash += 2725*2;
167  BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
168  BOOST_CHECK(tr_list[3].from == PART_ENVIRONMENT);
169 
171  sys = SYS_Simple();
172  sys->setParam<bool>("delay", true);
173  sys->setParam<bool>("ev_open_position", false);
174  sys->setTM(tm->clone());
175  sys->setSG(sg->clone());
176  sys->setMM(mm->clone());
177  sys->setST(st->clone());
178  sys->setTP(tp->clone());
179  sys->setEV(ev1);
180 
181  BOOST_CHECK(sys->readyForRun() == true);
182  sys->run(stk, query);
183  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
184  tr_list = sys->getTM()->getTradeList();
185  BOOST_CHECK(tr_list.size() == 3);
186  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
187 
188  BOOST_CHECK(tr_list[1].stock == stk);
189  BOOST_CHECK(tr_list[1].datetime == Datetime(200001060000LL));
190  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
191  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.18) < 0.00001);
192  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.18) < 0.00001);
193  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
194  BOOST_CHECK(tr_list[1].number == 100);
195  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
196  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 24.93) < 0.00001);
197  current_cash = init_cash - 2518;
198  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
199  BOOST_CHECK(tr_list[1].from == PART_SIGNAL);
200 
201  BOOST_CHECK(tr_list[2].stock == stk);
202  BOOST_CHECK(tr_list[2].datetime == Datetime(200001110000LL));
203  BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
204  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 27.25) < 0.00001);
205  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 27.25) < 0.00001);
206  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
207  BOOST_CHECK(tr_list[2].number == 100);
208  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
209  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 26.98) < 0.00001);
210  current_cash += 2725;
211  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
212  BOOST_CHECK(tr_list[2].from == PART_ENVIRONMENT);
213 
214 
216  sys = SYS_Simple();
217  sys->setParam<bool>("delay", true);
218  sys->setParam<bool>("ev_open_position", true);
219  sys->setTM(tm->clone());
220  sys->setSG(sg->clone());
221  sys->setMM(mm->clone());
222  sys->setST(st->clone());
223  sys->setTP(tp->clone());
224  sys->setEV(ev1);
225 
226  BOOST_CHECK(sys->readyForRun() == true);
227  sys->run(stk, query);
228  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
229  tr_list = sys->getTM()->getTradeList();
230  BOOST_CHECK(tr_list.size() == 4);
231  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
232 
233  BOOST_CHECK(tr_list[1].stock == stk);
234  BOOST_CHECK(tr_list[1].datetime == Datetime(200001050000LL));
235  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
236  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
237  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
238  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
239  BOOST_CHECK(tr_list[1].number == 100);
240  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
241  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 25.31) < 0.00001);
242  current_cash = init_cash - 2557;
243  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
244  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
245 
246  BOOST_CHECK(tr_list[2].stock == stk);
247  BOOST_CHECK(tr_list[2].datetime == Datetime(200001060000LL));
248  BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
249  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.18) < 0.00001);
250  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.18) < 0.00001);
251  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
252  BOOST_CHECK(tr_list[2].number == 100);
253  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
254  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 24.93) < 0.00001);
255  current_cash -= 2518;
256  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
257  BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
258 
259  BOOST_CHECK(tr_list[3].stock == stk);
260  BOOST_CHECK(tr_list[3].datetime == Datetime(200001110000LL));
261  BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
262  BOOST_CHECK(std::fabs(tr_list[3].planPrice - 27.25) < 0.00001);
263  BOOST_CHECK(std::fabs(tr_list[3].realPrice - 27.25) < 0.00001);
264  BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
265  BOOST_CHECK(tr_list[3].number == 200);
266  BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
267  BOOST_CHECK(std::fabs(tr_list[3].stoploss - 26.98) < 0.00001);
268  current_cash += 2725*2;
269  BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
270  BOOST_CHECK(tr_list[3].from == PART_ENVIRONMENT);
271 
273  sys = SYS_Simple();
274  sys->setParam<bool>("delay", false);
275  sys->setParam<bool>("ev_open_position", false);
276  sys->setTM(tm->clone());
277  sys->setSG(sg->clone());
278  sys->setMM(mm->clone());
279  sys->setEV(ev2);
280 
281  BOOST_CHECK(sys->readyForRun() == true);
282  sys->run(stk, query);
283  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
284  tr_list = sys->getTM()->getTradeList();
285  BOOST_CHECK(tr_list.size() == 3);
286  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
287 
288  BOOST_CHECK(tr_list[1].stock == stk);
289  BOOST_CHECK(tr_list[1].datetime == Datetime(200001050000LL));
290  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
291  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.28) < 0.00001);
292  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.28) < 0.00001);
293  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
294  BOOST_CHECK(tr_list[1].number == 100);
295  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
296  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 0) < 0.00001);
297  current_cash = init_cash - 2528;
298  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
299  BOOST_CHECK(tr_list[1].from == PART_SIGNAL);
300 
301  BOOST_CHECK(tr_list[2].stock == stk);
302  BOOST_CHECK(tr_list[2].datetime == Datetime(200001140000LL));
303  BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
304  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 24.20) < 0.00001);
305  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 24.20) < 0.00001);
306  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
307  BOOST_CHECK(tr_list[2].number == 100);
308  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
309  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 0) < 0.00001);
310  current_cash += 2420;
311  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
312  BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
313 
315  sys = SYS_Simple();
316  sys->setParam<bool>("delay", false);
317  sys->setParam<bool>("ev_open_position", true);
318  sys->setTM(tm->clone());
319  sys->setSG(sg->clone());
320  sys->setMM(mm->clone());
321  sys->setEV(ev2);
322 
323  BOOST_CHECK(sys->readyForRun() == true);
324  sys->run(stk, query);
325  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
326  tr_list = sys->getTM()->getTradeList();
327  BOOST_CHECK(tr_list.size() == 3);
328  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
329 
330  BOOST_CHECK(tr_list[1].stock == stk);
331  BOOST_CHECK(tr_list[1].datetime == Datetime(200001050000LL));
332  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
333  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.28) < 0.00001);
334  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.28) < 0.00001);
335  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
336  BOOST_CHECK(tr_list[1].number == 100);
337  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
338  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 0) < 0.00001);
339  current_cash = init_cash - 2528;
340  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
341  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
342 
343  BOOST_CHECK(tr_list[2].stock == stk);
344  BOOST_CHECK(tr_list[2].datetime == Datetime(200001140000LL));
345  BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
346  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 24.20) < 0.00001);
347  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 24.20) < 0.00001);
348  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
349  BOOST_CHECK(tr_list[2].number == 100);
350  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
351  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 0) < 0.00001);
352  current_cash += 2420;
353  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
354  BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
355 
357  sys = SYS_Simple();
358  sys->setParam<bool>("delay", false);
359  sys->setParam<bool>("ev_open_position", true);
360  sys->setTM(tm->clone());
361  sys->setSG(sg->clone());
362  sys->setMM(mm->clone());
363  sys->setEV(ev3);
364 
365  BOOST_CHECK(sys->readyForRun() == true);
366  sys->run(stk, query);
367  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
368  tr_list = sys->getTM()->getTradeList();
369  BOOST_CHECK(tr_list.size() == 3);
370  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
371 
372  BOOST_CHECK(tr_list[1].stock == stk);
373  BOOST_CHECK(tr_list[1].datetime == Datetime(200001050000LL));
374  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
375  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.28) < 0.00001);
376  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.28) < 0.00001);
377  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
378  BOOST_CHECK(tr_list[1].number == 100);
379  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
380  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 0) < 0.00001);
381  current_cash = init_cash - 2528;
382  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
383  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
384 
385  BOOST_CHECK(tr_list[2].stock == stk);
386  BOOST_CHECK(tr_list[2].datetime == Datetime(200001070000LL));
387  BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
388  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 26.90) < 0.00001);
389  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 26.90) < 0.00001);
390  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
391  BOOST_CHECK(tr_list[2].number == 100);
392  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
393  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 0) < 0.00001);
394  current_cash += 2690;
395  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
396  BOOST_CHECK(tr_list[2].from == PART_ENVIRONMENT);
397 
398  /*for (auto iter = tr_list.begin(); iter != tr_list.end(); ++iter) {
399  std::cout << *iter << std::endl;
400  }*/
401 }
402 
BOOST_AUTO_TEST_CASE(test_SYS_Simple_for_ev)