test_doc
test_Simple_SYS_for_cn.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_cn) {
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 
69  CNPtr cn1 = make_shared<TestCN1>();
70  CNPtr cn2 = make_shared<TestCN2>();
71  CNPtr cn3 = make_shared<TestCN3>();
72 
74  sys = SYS_Simple();
75  sys->setParam<bool>("delay", false);
76  sys->setParam<bool>("ev_open_position", true);
77  sys->setTM(tm->clone());
78  sys->setSG(sg->clone());
79  sys->setMM(mm->clone());
80  sys->setST(st->clone());
81  sys->setTP(tp->clone());
82  sys->setEV(ev1);
83  sys->setCN(cn1);
84 
85  BOOST_CHECK(sys->readyForRun() == true);
86  sys->run(stk, query);
87  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
88  tr_list = sys->getTM()->getTradeList();
89  BOOST_CHECK(tr_list.size() == 4);
90  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
91 
92  BOOST_CHECK(tr_list[1].stock == stk);
93  BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
94  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
95  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
96  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
97  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
98  BOOST_CHECK(tr_list[1].number == 100);
99  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
100  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 25.31) < 0.00001);
101  current_cash = init_cash - 2557;
102  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
103  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
104 
105  BOOST_CHECK(tr_list[2].stock == stk);
106  BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
107  BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
108  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
109  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
110  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
111  BOOST_CHECK(tr_list[2].number == 100);
112  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
113  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.03) < 0.00001);
114  current_cash -= 2528;
115  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
116  BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
117 
118  BOOST_CHECK(tr_list[3].stock == stk);
119  BOOST_CHECK(tr_list[3].datetime == Datetime(200001100000LL));
120  BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
121  BOOST_CHECK(std::fabs(tr_list[3].planPrice - 27.25) < 0.00001);
122  BOOST_CHECK(std::fabs(tr_list[3].realPrice - 27.25) < 0.00001);
123  BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
124  BOOST_CHECK(tr_list[3].number == 200);
125  BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
126  BOOST_CHECK(std::fabs(tr_list[3].stoploss - 26.98) < 0.00001);
127  current_cash += 2725*2;
128  BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
129  BOOST_CHECK(tr_list[3].from == PART_ENVIRONMENT);
130 
132  sys = SYS_Simple();
133  sys->setParam<bool>("delay", false);
134  sys->setParam<bool>("ev_open_position", true);
135  sys->setTM(tm->clone());
136  sys->setSG(sg->clone());
137  sys->setMM(mm->clone());
138  sys->setST(st->clone());
139  sys->setTP(tp->clone());
140  sys->setEV(ev1);
141  sys->setCN(cn2);
142 
143  BOOST_CHECK(sys->readyForRun() == true);
144  sys->run(stk, query);
145  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
146  tr_list = sys->getTM()->getTradeList();
147  BOOST_CHECK(tr_list.size() == 4);
148  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
149 
150  BOOST_CHECK(tr_list[1].stock == stk);
151  BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
152  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
153  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
154  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
155  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
156  BOOST_CHECK(tr_list[1].number == 100);
157  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
158  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 25.31) < 0.00001);
159  current_cash = init_cash - 2557;
160  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
161  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
162 
163  BOOST_CHECK(tr_list[2].stock == stk);
164  BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
165  BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
166  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
167  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
168  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
169  BOOST_CHECK(tr_list[2].number == 100);
170  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
171  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.03) < 0.00001);
172  current_cash -= 2528;
173  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
174  BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
175 
176  BOOST_CHECK(tr_list[3].stock == stk);
177  BOOST_CHECK(tr_list[3].datetime == Datetime(200001100000LL));
178  BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
179  BOOST_CHECK(std::fabs(tr_list[3].planPrice - 27.25) < 0.00001);
180  BOOST_CHECK(std::fabs(tr_list[3].realPrice - 27.25) < 0.00001);
181  BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
182  BOOST_CHECK(tr_list[3].number == 200);
183  BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
184  BOOST_CHECK(std::fabs(tr_list[3].stoploss - 26.98) < 0.00001);
185  current_cash += 2725*2;
186  BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
187  BOOST_CHECK(tr_list[3].from == PART_ENVIRONMENT);
188 
190  sys = SYS_Simple();
191  sys->setParam<bool>("delay", false);
192  sys->setParam<bool>("ev_open_position", true);
193  sys->setParam<bool>("cn_open_position", false);
194  sys->setTM(tm->clone());
195  sys->setSG(sg->clone());
196  sys->setMM(mm->clone());
197  sys->setEV(ev1);
198  sys->setCN(cn3);
199 
200  BOOST_CHECK(sys->readyForRun() == true);
201  sys->run(stk, query);
202  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
203  tr_list = sys->getTM()->getTradeList();
204  BOOST_CHECK(tr_list.size() == 4);
205  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
206 
207  BOOST_CHECK(tr_list[1].stock == stk);
208  BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
209  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
210  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
211  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
212  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
213  BOOST_CHECK(tr_list[1].number == 100);
214  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
215  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 0.0) < 0.00001);
216  current_cash = init_cash - 2557;
217  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
218  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
219 
220  BOOST_CHECK(tr_list[2].stock == stk);
221  BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
222  BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
223  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
224  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
225  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
226  BOOST_CHECK(tr_list[2].number == 100);
227  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
228  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 0) < 0.00001);
229  current_cash -= 2528;
230  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
231  BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
232 
233  BOOST_CHECK(tr_list[3].stock == stk);
234  BOOST_CHECK(tr_list[3].datetime == Datetime(200001070000LL));
235  BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
236  BOOST_CHECK(std::fabs(tr_list[3].planPrice - 26.90) < 0.00001);
237  BOOST_CHECK(std::fabs(tr_list[3].realPrice - 26.90) < 0.00001);
238  BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
239  BOOST_CHECK(tr_list[3].number == 200);
240  BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
241  BOOST_CHECK(std::fabs(tr_list[3].stoploss - 0) < 0.00001);
242  current_cash += 2690*2;
243  BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
244  BOOST_CHECK(tr_list[3].from == PART_CONDITION);
245 
247  sys = SYS_Simple();
248  sys->setParam<bool>("delay", false);
249  sys->setParam<bool>("ev_open_position", true);
250  sys->setParam<bool>("cn_open_position", true);
251  sys->setTM(tm->clone());
252  sys->setSG(sg->clone());
253  sys->setMM(mm->clone());
254  sys->setEV(ev1);
255  sys->setCN(cn3);
256 
257  BOOST_CHECK(sys->readyForRun() == true);
258  sys->run(stk, query);
259  BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
260  tr_list = sys->getTM()->getTradeList();
261  BOOST_CHECK(tr_list.size() == 4);
262  BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
263 
264  BOOST_CHECK(tr_list[1].stock == stk);
265  BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
266  BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
267  BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
268  BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
269  BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
270  BOOST_CHECK(tr_list[1].number == 100);
271  BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
272  BOOST_CHECK(std::fabs(tr_list[1].stoploss - 0) < 0.00001);
273  current_cash = init_cash - 2557;
274  BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
275  BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
276 
277  BOOST_CHECK(tr_list[2].stock == stk);
278  BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
279  BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
280  BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
281  BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
282  BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
283  BOOST_CHECK(tr_list[2].number == 100);
284  BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
285  BOOST_CHECK(std::fabs(tr_list[2].stoploss - 0) < 0.00001);
286  current_cash -= 2528;
287  BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
288  BOOST_CHECK(tr_list[2].from == PART_CONDITION);
289 
290  BOOST_CHECK(tr_list[3].stock == stk);
291  BOOST_CHECK(tr_list[3].datetime == Datetime(200001070000LL));
292  BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
293  BOOST_CHECK(std::fabs(tr_list[3].planPrice - 26.90) < 0.00001);
294  BOOST_CHECK(std::fabs(tr_list[3].realPrice - 26.90) < 0.00001);
295  BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
296  BOOST_CHECK(tr_list[3].number == 200);
297  BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
298  BOOST_CHECK(std::fabs(tr_list[3].stoploss - 0) < 0.00001);
299  current_cash += 2690*2;
300  BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
301  BOOST_CHECK(tr_list[3].from == PART_CONDITION);
302 
303  /*for (auto iter = tr_list.begin(); iter != tr_list.end(); ++iter) {
304  std::cout << *iter << std::endl;
305  }*/
306 }
307 
BOOST_AUTO_TEST_CASE(test_SYS_Simple_for_cn)