10 #include <boost/test/unit_test.hpp> 12 #define BOOST_TEST_MODULE test_hikyuu_trade_sys_suite 13 #include <boost/test/unit_test.hpp> 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> 37 TradeRecordList tr_list;
40 StockManager& sm = StockManager::instance();
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);
50 KQuery query = KQueryByDate(start_date, end_date, KQuery::DAY);
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");
60 EVPtr ev1 = make_shared<TestEV1>();
63 EVPtr ev2 = make_shared<TestEV2>();
66 EVPtr ev3 = make_shared<TestEV3>();
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());
80 BOOST_CHECK(sys->readyForRun() ==
true);
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);
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);
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);
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());
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);
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);
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);
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);
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());
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);
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);
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);
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());
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);
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);
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);
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);
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());
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);
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);
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);
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());
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);
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);
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);
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());
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);
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);
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);
BOOST_AUTO_TEST_CASE(test_SYS_Simple_for_ev)