9 #include <boost/test/unit_test.hpp> 11 #define BOOST_TEST_MODULE test_hikyuu_trade_manage_suite 12 #include <boost/test/unit_test.hpp> 15 #include <hikyuu/StockManager.h> 16 #include <hikyuu/trade_manage/crt/TC_TestStub.h> 17 #include <hikyuu/trade_manage/crt/TC_FixedA.h> 18 #include <hikyuu/trade_manage/crt/crtTM.h> 21 #include <boost/archive/xml_oarchive.hpp> 22 #include <boost/archive/xml_iarchive.hpp> 34 StockManager& sm = StockManager::instance();
35 Stock stock = sm.getStock(
"sh600000");
36 CostRecord result, expect;
37 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000,
38 TC_FixedA(0.0018, 5, 0.001, 0.001, 1.0),
"TEST");
40 BOOST_CHECK(tm->name() ==
"TEST");
41 BOOST_CHECK(tm->initCash() == 100000.0);
43 BOOST_CHECK(tm->initDatetime() == Datetime(199901010000));
44 BOOST_CHECK(tm->firstDatetime() == Null<Datetime>());
45 BOOST_CHECK(tm->lastDatetime() == Datetime(199901010000));
46 BOOST_CHECK(tm->have(stock) ==
false);
47 BOOST_CHECK(tm->getStockNumber() == 0);
48 BOOST_CHECK(tm->getHoldNumber(Datetime(199901010000), stock) == 0);
49 const TradeRecordList& tradeList = tm->getTradeList();
50 BOOST_CHECK(tradeList.size() == 1);
51 BOOST_CHECK(tradeList[0] == TradeRecord(Null<Stock>(),
52 Datetime(199901010000), BUSINESS_INIT, 100000.0, 100000.0, 0.0, 0,
53 Null<CostRecord>(), 0.0, 100000.0, PART_INVALID));
54 BOOST_CHECK(tm->getPositionList().empty() ==
true);
55 BOOST_CHECK(tm->getPosition(stock) == Null<PositionRecord>());
57 BOOST_CHECK(tm->getShortPositionList().empty() ==
true);
58 BOOST_CHECK(tm->getShortPosition(stock) == Null<PositionRecord>());
65 StockManager& sm = StockManager::instance();
66 Stock stock = sm.getStock(
"sh600000");
67 CostRecord result, expect;
68 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000,
69 TC_FixedA(0.0018, 5, 0.001, 0.001, 1.0),
"TEST");
72 result = tm->getBuyCost(Datetime(200101010000), stock, 10.0, 1000);
73 expect.commission = 18.0;
74 expect.stamptax = 0.0;
75 expect.transferfee = 1.0;
77 BOOST_CHECK(result == expect);
83 StockManager& sm = StockManager::instance();
84 Stock stock = sm.getStock(
"sh600004");
85 CostRecord result, expect;
86 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000,
87 TC_FixedA(0.0018, 5, 0.001, 0.001, 1.0));
90 result = tm->getSellCost(Datetime(200101010000), stock, 10.0, 100);
91 expect.commission = 5.0;
92 expect.stamptax = 1.0;
93 expect.transferfee = 1.0;
95 BOOST_CHECK(result == expect);
101 StockManager& sm = StockManager::instance();
102 Stock stock = sm.getStock(
"sh600000");
103 TradeCostPtr costfunc = TC_FixedA(0.0018, 5, 0.001, 0.001, 1.0);
108 TradeRecordList trade_list;
111 tm = crtTM(Datetime(199901010000), 0, costfunc,
"SYS");
112 result = tm->buy(Datetime(199911180000), stock, 27.2, 100, 0, 27.2, 27.2);
113 BOOST_CHECK(result == Null<TradeRecord>());
116 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
117 result = tm->buy(Datetime(199911180000), Null<Stock>(), 27.2, 100, 0, 27.2, 27.2);
118 BOOST_CHECK(result == Null<TradeRecord>());
119 BOOST_CHECK(tm->cash(Datetime(199911180000)) == 100000);
122 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
123 result = tm->buy(Datetime(199001010000), stock, 26.36, 100, 0, 26.36, 26.36);
124 BOOST_CHECK(result == Null<TradeRecord>());
128 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
129 result = tm->buy(Datetime(199911130000), stock, 27.2, 100, 0, 27.2, 27.2);
130 BOOST_CHECK(result == Null<TradeRecord>());
133 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
134 result = tm->buy(Datetime(199911170000), stock, 27.2, 100, 0, 27.2, 27.2);
135 BOOST_CHECK(result == Null<TradeRecord>());
139 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
140 result = tm->buy(Datetime(199911170000), stock, 27.18, 100, 0, 27.18, 27.18);
141 cost = tm->getBuyCost(Datetime(199911170000), stock, 27.18, 100);
142 trade = TradeRecord(stock, Datetime(199911170000),
143 BUSINESS_BUY, 27.18, 27.18, 27.18, 100, cost, 0.0,
144 100000 - cost.total - 27.18 * 100, PART_INVALID);
145 BOOST_CHECK(result == trade);
146 BOOST_CHECK(tm->cash(Datetime(199911170000)) == trade.cash);
147 trade_list = tm->getTradeList();
148 BOOST_CHECK(trade_list.size() == 2);
149 BOOST_CHECK(trade_list[1] == trade);
153 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
154 result = tm->buy(Datetime(199911170000), stock, 26.36, 100, 0, 26.36, 26.36);
155 BOOST_CHECK(result == Null<TradeRecord>());
159 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
160 result = tm->buy(Datetime(199911160000), stock, 26.48, 100, 0, 26.48, 26.48);
161 cost = tm->getBuyCost(Datetime(199911160000), stock, 26.48, 100);
162 BOOST_CHECK(result == TradeRecord(stock, Datetime(199911160000),
163 BUSINESS_BUY, 26.48, 26.48, 26.48, 100, cost, 0.0,
164 100000 - cost.total - 26.48 * 100, PART_INVALID));
167 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
168 result = tm->buy(Datetime(199911170000), stock, 26.48, 100, 0, 26.48, 26.48);
169 BOOST_CHECK(!(result == Null<TradeRecord>()));
170 result = tm->buy(Datetime(199911160000), stock, 26.48, 100, 0, 26.48, 26.48);
171 BOOST_CHECK(result == Null<TradeRecord>());
174 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
175 result = tm->buy(Datetime(199911170000), stock, 26.48, 0, 0, 26.48, 26.48);
176 BOOST_CHECK(result == Null<TradeRecord>());
179 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
180 result = tm->buy(Datetime(199911170000), stock, 26.48, stock.minTradeNumber() - 1, 0, 26.48, 26.48);
181 BOOST_CHECK(result == Null<TradeRecord>());
184 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
185 result = tm->buy(Datetime(199911170000), stock, 26.48, stock.maxTradeNumber() - 1, 0, 26.48, 26.48);
186 BOOST_CHECK(result == Null<TradeRecord>());
191 StockManager& sm = StockManager::instance();
192 Stock stock = sm.getStock(
"sh600000");
193 TradeCostPtr costfunc = TC_FixedA(0.0018, 5, 0.001, 0.001, 1.0);
198 TradeRecordList trade_list;
201 tm = crtTM(Datetime(199901010000), 0, costfunc,
"SYS");
202 result = tm->sell(Datetime(199911180000), stock, 27.2, 100);
203 BOOST_CHECK(result == Null<TradeRecord>());
206 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
207 result = tm->sell(Datetime(199911180000), Null<Stock>(), 27.2, 100);
208 BOOST_CHECK(result == Null<TradeRecord>());
209 BOOST_CHECK(tm->cash(Datetime(199911180000)) == 100000);
212 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
213 result = tm->buy(Datetime(199911170000), stock, 27.18, 100, 0);
214 BOOST_CHECK(tm->getHoldNumber(Datetime(199911170000), stock) == 100);
215 result = tm->sell(Datetime(199801010000), stock, 26.36, 100);
216 BOOST_CHECK(result == Null<TradeRecord>());
219 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
220 result = tm->buy(Datetime(199911170000), stock, 27.18, 100, 0);
221 BOOST_CHECK(tm->getHoldNumber(Datetime(199911170000), stock) == 100);
222 result = tm->sell(Datetime(199911180000), stock, 26.36, 0);
223 BOOST_CHECK(result == Null<TradeRecord>());
226 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
227 result = tm->buy(Datetime(199911170000), stock, 27.18, 100, 0);
228 BOOST_CHECK(tm->getHoldNumber(Datetime(199911170000), stock) == 100);
229 result = tm->sell(Datetime(199911180000), stock, 26.36, stock.minTradeNumber() - 1);
230 BOOST_CHECK(result == Null<TradeRecord>());
233 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
234 result = tm->buy(Datetime(199911170000), stock, 27.18, 100, 0);
235 BOOST_CHECK(tm->getHoldNumber(Datetime(199911170000), stock) == 100);
236 result = tm->sell(Datetime(199911180000), stock, 26.36, stock.maxTradeNumber() + 1);
237 BOOST_CHECK(result == Null<TradeRecord>());
240 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
241 result = tm->sell(Datetime(199901020000), stock, 26.36, 100);
242 BOOST_CHECK(result == Null<TradeRecord>());
245 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
246 result = tm->buy(Datetime(199911170000), stock, 27.18, 100, 0);
247 BOOST_CHECK(tm->getHoldNumber(Datetime(199911170000), stock) == 100);
248 result = tm->sell(Datetime(199911180000), stock, 26.36, 101);
249 BOOST_CHECK(result == Null<TradeRecord>());
252 tm = crtTM(Datetime(199901010000), 100000, costfunc,
"SYS");
253 result = tm->buy(Datetime(199911170000), stock, 27.18, 100, 0, 27.18, 27.18);
254 cost = tm->getBuyCost(Datetime(199911170000), stock, 27.18, 100);
255 BOOST_CHECK(result == TradeRecord(stock, Datetime(199911170000),
256 BUSINESS_BUY, 27.18, 27.18, 27.18, 100, cost, 0.0,
257 100000 - cost.total - 27.18 * 100, PART_INVALID));
258 BOOST_CHECK(tm->getHoldNumber(Datetime(199911170000), stock) == 100);
259 BOOST_CHECK(tm->getStockNumber() == 1);
260 BOOST_CHECK(tm->cash(Datetime(199911170000)) == 97276.0);
261 result = tm->sell(Datetime(199911180000), stock, 26.36, Null<size_t>(), 0, 0, 26.36);
262 cost = tm->getSellCost(Datetime(199911180000), stock, 26.36, 100);
263 BOOST_CHECK(result == TradeRecord(stock, Datetime(199911180000),
264 BUSINESS_SELL, 26.36, 26.36, 0.0, 100, cost, 0.0, 99903.36, PART_INVALID));
265 BOOST_CHECK(tm->getHoldNumber(Datetime(199911180000), stock) == 0);
266 BOOST_CHECK(tm->getStockNumber() == 0);
267 BOOST_CHECK(tm->cash(Datetime(199911180000)) == 99903.36);
270 tm = crtTM(Datetime(199901010000), 1000000, TC_Zero(),
"SYS");
271 tm->setParam<
bool>(
"reinvest",
true);
272 tm->buy(Datetime(199911170000), stock, 27.18, 1000, 0);
273 BOOST_CHECK(tm->cash(Datetime(199911170000)) == 972820);
274 tm->sell(Datetime(200605150000), stock, 10.2, 100);
275 BOOST_CHECK(tm->cash(Datetime(200605150000)) == 974685);
276 BOOST_CHECK(tm->getHoldNumber(Datetime(200605160000), stock) == 1850);
277 tm->sell(Datetime(200612010000), stock, 16.87, Null<size_t>());
278 BOOST_CHECK(tm->cash(Datetime(200612010000)) == 1006135.0);
284 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
287 BOOST_CHECK(tm->checkin(Datetime(199901020000), 0) ==
false);
288 BOOST_CHECK(tm->checkin(Datetime(199901020000), -0.01) ==
false);
289 BOOST_CHECK(tm->checkin(Datetime(199901020000), 0.01) ==
true);
292 tm->checkin(Datetime(200001020000), 10000);
293 BOOST_CHECK(tm->checkin(Datetime(200001010000), 200) ==
false);
299 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
302 BOOST_CHECK(tm->checkout(Datetime(199901020000), 0) ==
false);
303 BOOST_CHECK(tm->checkout(Datetime(199901020000), -0.01) ==
false);
304 BOOST_CHECK(tm->checkout(Datetime(199901020000), 0.01) ==
true);
307 tm->checkin(Datetime(200001020000), 0.01);
308 BOOST_CHECK(tm->checkout(Datetime(200001010000), 200) ==
false);
311 BOOST_CHECK(tm->currentCash() == 100000);
312 BOOST_CHECK(tm->checkout(Datetime(200001030000), 100000.01) ==
false);
313 BOOST_CHECK(tm->checkout(Datetime(200001030000), 100000) ==
true);
319 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
322 BOOST_CHECK(tm->borrowCash(Datetime(199901020000), 0) ==
false);
323 BOOST_CHECK(tm->borrowCash(Datetime(199901020000), -0.01) ==
false);
324 BOOST_CHECK(tm->borrowCash(Datetime(199901020000), 0.01) ==
true);
327 tm->checkin(Datetime(200001020000), 10000);
328 BOOST_CHECK(tm->borrowCash(Datetime(200001010000), 200) ==
false);
334 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
337 tm->borrowCash(Datetime(200001020000), 50000);
338 BOOST_CHECK(tm->returnCash(Datetime(200001010000), 200) ==
false);
341 BOOST_CHECK(tm->returnCash(Datetime(200001020000), 0) ==
false);
342 BOOST_CHECK(tm->returnCash(Datetime(200001020000), -0.01) ==
false);
343 BOOST_CHECK(tm->returnCash(Datetime(200001020000), 0.01) ==
true);
344 BOOST_CHECK(tm->borrowCash(Datetime(200001020000), 0.01) ==
true);
347 BOOST_CHECK(tm->getDebtCash(Datetime(200001030000)) == 50000);
348 BOOST_CHECK(tm->returnCash(Datetime(200001030000), 50000.01) ==
false);
349 BOOST_CHECK(tm->returnCash(Datetime(200001030000), 50000) ==
true);
352 tm->borrowCash(Datetime(200001040000), 50000);
353 tm->checkout(Datetime(200001040000), 120000);
354 BOOST_CHECK(tm->currentCash() == 30000);
355 BOOST_CHECK(tm->getDebtCash(Datetime(200001040000)) == 50000);
356 BOOST_CHECK(tm->returnCash(Datetime(200001040000), 50000) ==
false);
362 StockManager& sm = StockManager::instance();
363 Stock stock = sm.getStock(
"sh600000");
364 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
367 BOOST_CHECK(tm->checkinStock(Datetime(199901020000), Stock(), 10, 100) ==
false);
370 BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, 10, 0) ==
false);
373 BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, 0, 100) ==
false);
374 BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, -0.01, 100) ==
false);
377 tm->checkin(Datetime(200001020000), 10000);
378 BOOST_CHECK(tm->checkinStock(Datetime(200001010000), stock, 10.0, 200) ==
false);
383 StockManager& sm = StockManager::instance();
384 Stock stock = sm.getStock(
"sh600000");
385 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
388 BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), Stock(), 10, 100) ==
false);
391 BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, 10, 100) ==
true);
392 BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), stock, 10, 0) ==
false);
395 BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), stock, 0, 100) ==
false);
396 BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), stock, -0.01, 100) ==
false);
399 BOOST_CHECK(tm->checkinStock(Datetime(199901010000), stock, 10.0, 200) ==
false);
405 StockManager& sm = StockManager::instance();
406 Stock stock = sm.getStock(
"sh600000");
407 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
410 BOOST_CHECK(tm->borrowStock(Datetime(199901020000), Stock(), 10, 100) ==
false);
413 BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, 10, 0) ==
false);
416 BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, 0, 100) ==
false);
417 BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, -0.01, 100) ==
false);
420 tm->checkin(Datetime(200001020000), 10000);
421 BOOST_CHECK(tm->borrowStock(Datetime(200001010000), stock, 10.0, 200) ==
false);
427 StockManager& sm = StockManager::instance();
428 Stock stock = sm.getStock(
"sh600000");
429 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
431 BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, 10, 100) ==
true);
434 BOOST_CHECK(tm->returnStock(Datetime(199901020000), Stock(), 10, 100) ==
false);
437 BOOST_CHECK(tm->returnStock(Datetime(199901020000), stock, 10, 0) ==
false);
440 BOOST_CHECK(tm->returnStock(Datetime(199901020000), stock, 0, 100) ==
false);
441 BOOST_CHECK(tm->returnStock(Datetime(199901020000), stock, -0.01, 100) ==
false);
444 BOOST_CHECK(tm->returnStock(Datetime(199901010000), stock, 10.0, 100) ==
false);
447 BOOST_CHECK(tm->returnStock(Datetime(199901030000), stock, 10.0, 101) ==
false);
448 BOOST_CHECK(tm->returnStock(Datetime(199901030000), stock, 10.0, 100) ==
true);
455 TradeCostPtr tc = TC_TestStub();
456 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000, tc);
457 tm->setParam<
bool>(
"reinvest",
false);
459 Datetime cur_date, pre_date, next_date;
462 cur_date = Datetime(199911170000);
463 pre_date = Datetime(199911160000);
464 next_date = Datetime(199911180000);
465 BOOST_CHECK(tm->borrowCash(cur_date, 5000) ==
true);
466 funds = tm->getFunds();
467 BOOST_CHECK(funds == FundsRecord(104970, 0, 0, 100000, 0, 5000, 0));
468 funds = tm->getFunds(pre_date);
469 BOOST_CHECK(funds == FundsRecord(100000, 0, 0, 100000, 0, 0, 0));
470 funds = tm->getFunds(cur_date);
471 BOOST_CHECK(funds == FundsRecord(104970, 0, 0, 100000, 0, 5000, 0));
472 funds = tm->getFunds(next_date);
473 BOOST_CHECK(funds == FundsRecord(104970, 0, 0, 100000, 0, 5000, 0));
475 cur_date = Datetime(199911180000);
476 pre_date = Datetime(199911170000);
477 next_date = Datetime(199911190000);
478 BOOST_CHECK(tm->returnCash(cur_date, 3000) ==
true);
479 funds = tm->getFunds();
480 BOOST_CHECK(funds == FundsRecord(101930, 0, 0, 100000, 0, 2000, 0));
481 funds = tm->getFunds(pre_date);
482 BOOST_CHECK(funds == FundsRecord(104970, 0, 0, 100000, 0, 5000, 0));
483 funds = tm->getFunds(cur_date);
484 BOOST_CHECK(funds == FundsRecord(101930, 0, 0, 100000, 0, 2000, 0));
485 funds = tm->getFunds(next_date);
486 BOOST_CHECK(funds == FundsRecord(101930, 0, 0, 100000, 0, 2000, 0));
488 BOOST_CHECK(tm->returnCash(cur_date, 2000.01) ==
false);
489 BOOST_CHECK(tm->returnCash(cur_date, 2000) ==
true);
490 funds = tm->getFunds();
491 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 0));
492 funds = tm->getFunds(pre_date);
493 BOOST_CHECK(funds == FundsRecord(104970, 0, 0, 100000, 0, 5000, 0));
494 funds = tm->getFunds(cur_date);
495 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 0));
496 funds = tm->getFunds(next_date);
497 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 0));
500 cur_date = Datetime(199911190000);
501 pre_date = Datetime(199911180000);
502 next_date = Datetime(199911200000);
503 BOOST_CHECK(tm->borrowCash(cur_date, 3000) ==
true);
504 BOOST_CHECK(tm->borrowCash(cur_date, 2000) ==
true);
505 funds = tm->getFunds();
506 BOOST_CHECK(funds == FundsRecord(104830, 0, 0, 100000, 0, 5000, 0));
507 funds = tm->getFunds(pre_date);
508 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 0));
509 funds = tm->getFunds(cur_date);
510 BOOST_CHECK(funds == FundsRecord(104830, 0, 0, 100000, 0, 5000, 0));
511 funds = tm->getFunds(next_date);
512 BOOST_CHECK(funds == FundsRecord(104830, 0, 0, 100000, 0, 5000, 0));
514 BOOST_CHECK(tm->returnCash(cur_date, 5000.01) ==
false);
515 BOOST_CHECK(tm->returnCash(cur_date, 5000) ==
true);
516 funds = tm->getFunds();
517 BOOST_CHECK(funds == FundsRecord(99750, 0, 0, 100000, 0, 0, 0));
518 funds = tm->getFunds(pre_date);
519 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 0));
520 funds = tm->getFunds(cur_date);
521 BOOST_CHECK(funds == FundsRecord(99750, 0, 0, 100000, 0, 0, 0));
522 funds = tm->getFunds(next_date);
523 BOOST_CHECK(funds == FundsRecord(99750, 0, 0, 100000, 0, 0, 0));
527 cur_date = Datetime(199911200000);
528 pre_date = Datetime(199911190000);
529 next_date = Datetime(199911210000);
530 BOOST_CHECK(tm->borrowCash(cur_date, 3000) ==
true);
531 BOOST_CHECK(tm->borrowCash(cur_date, 2000) ==
true);
532 funds = tm->getFunds();
533 BOOST_CHECK(funds == FundsRecord(104940, 0, 0, 100000, 0, 5000, 0));
534 funds = tm->getFunds(pre_date);
535 BOOST_CHECK(funds == FundsRecord(100000, 0, 0, 100000, 0, 0, 0));
536 funds = tm->getFunds(cur_date);
537 BOOST_CHECK(funds == FundsRecord(104940, 0, 0, 100000, 0, 5000, 0));
538 funds = tm->getFunds(next_date);
539 BOOST_CHECK(funds == FundsRecord(104940, 0, 0, 100000, 0, 5000, 0));
541 BOOST_CHECK(tm->returnCash(cur_date, 4000) ==
true);
542 funds = tm->getFunds();
543 BOOST_CHECK(funds == FundsRecord(100860, 0, 0, 100000, 0, 1000, 0));
544 funds = tm->getFunds(pre_date);
545 BOOST_CHECK(funds == FundsRecord(100000, 0, 0, 100000, 0, 0, 0));
546 funds = tm->getFunds(cur_date);
547 BOOST_CHECK(funds == FundsRecord(100860, 0, 0, 100000, 0, 1000, 0));
548 funds = tm->getFunds(next_date);
549 BOOST_CHECK(funds == FundsRecord(100860, 0, 0, 100000, 0, 1000, 0));
551 BOOST_CHECK(tm->returnCash(cur_date, 1000.01) ==
false);
552 BOOST_CHECK(tm->returnCash(cur_date, 1000) ==
true);
553 funds = tm->getFunds();
554 BOOST_CHECK(funds == FundsRecord(99820, 0, 0, 100000, 0, 0, 0));
555 funds = tm->getFunds(pre_date);
556 BOOST_CHECK(funds == FundsRecord(100000, 0, 0, 100000, 0, 0, 0));
557 funds = tm->getFunds(cur_date);
558 BOOST_CHECK(funds == FundsRecord(99820, 0, 0, 100000, 0, 0, 0));
559 funds = tm->getFunds(next_date);
560 BOOST_CHECK(funds == FundsRecord(99820, 0, 0, 100000, 0, 0, 0));
566 StockManager& sm = StockManager::instance();
567 Stock stock = sm.getStock(
"sh600000");
568 Stock stock2 = sm.getStock(
"sz000001");
573 TradeCostPtr tc = TC_TestStub();
574 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000, tc);
575 tm->setParam<
bool>(
"reinvest",
false);
576 tm->setParam<
bool>(
"support_borrow_cash",
false);
577 tm->setParam<
bool>(
"support_borrow_stock",
false);
579 Datetime cur_date, pre_date, next_date;
582 cur_date = Datetime(199911170000);
583 pre_date = Datetime(199911160000);
584 next_date = Datetime(199911180000);
585 BOOST_CHECK(tm->borrowStock(cur_date, stock, 27.18, 1000) ==
true);
586 funds = tm->getFunds();
587 BOOST_CHECK(funds == FundsRecord(99950, 0, 0, 100000, 0, 0, 27180));
588 funds = tm->getFunds(pre_date);
589 BOOST_CHECK(funds == FundsRecord(100000, 0, 0, 100000, 0, 0, 0));
590 funds = tm->getFunds(cur_date);
591 BOOST_CHECK(funds == FundsRecord(99950, 0, 0, 100000, 0, 0, 27180));
592 funds = tm->getFunds(next_date);
593 BOOST_CHECK(funds == FundsRecord(99950, 0, 0, 100000, 0, 0, 27180));
595 cur_date = Datetime(199911180000);
596 pre_date = Datetime(199911170000);
597 next_date = Datetime(199911190000);
598 BOOST_CHECK(tm->returnStock(cur_date, stock, 27.1, 800) ==
true);
599 funds = tm->getFunds();
600 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 5436));
601 funds = tm->getFunds(pre_date);
602 BOOST_CHECK(funds == FundsRecord(99950, 0, 0, 100000, 0, 0, 27180));
603 funds = tm->getFunds(cur_date);
604 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 5436));
605 funds = tm->getFunds(next_date);
606 BOOST_CHECK(funds == FundsRecord(99890, 0, 0, 100000, 0, 0, 5436));
608 BOOST_CHECK(tm->returnStock(cur_date, stock, 26.8, 200) ==
true);
609 funds = tm->getFunds();
610 BOOST_CHECK(funds == FundsRecord(99830, 0, 0, 100000, 0, 0, 0));
611 funds = tm->getFunds(pre_date);
612 BOOST_CHECK(funds == FundsRecord(99950, 0, 0, 100000, 0, 0, 27180));
613 funds = tm->getFunds(cur_date);
614 BOOST_CHECK(funds == FundsRecord(99830, 0, 0, 100000, 0, 0, 0));
615 funds = tm->getFunds(next_date);
616 BOOST_CHECK(funds == FundsRecord(99830, 0, 0, 100000, 0, 0, 0));
619 cur_date = Datetime(199911230000);
620 pre_date = Datetime(199911220000);
621 next_date = Datetime(199911240000);
622 BOOST_CHECK(tm->borrowStock(cur_date, stock, 26.21, 200) ==
true);
623 BOOST_CHECK(tm->borrowStock(cur_date, stock, 26.43, 800) ==
true);
624 funds = tm->getFunds();
625 BOOST_CHECK(funds == FundsRecord(99730, 0, 0, 100000, 0, 0, 26386));
626 funds = tm->getFunds(pre_date);
627 BOOST_CHECK(funds == FundsRecord(99830, 0, 0, 100000, 0, 0, 0));
628 funds = tm->getFunds(cur_date);
629 BOOST_CHECK(funds == FundsRecord(99730, 0, 0, 100000, 0, 0, 26386));
630 funds = tm->getFunds(next_date);
631 BOOST_CHECK(funds == FundsRecord(99730, 0, 0, 100000, 0, 0, 26386));
633 cur_date = Datetime(199911240000);
634 pre_date = Datetime(199911230000);
635 next_date = Datetime(199911250000);
636 BOOST_CHECK(tm->returnStock(cur_date, stock, 26.20, 1000) ==
true);
637 funds = tm->getFunds();
638 BOOST_CHECK(funds == FundsRecord(99610, 0, 0, 100000, 0, 0, 0));
639 funds = tm->getFunds(pre_date);
640 BOOST_CHECK(funds == FundsRecord(99730, 0, 0, 100000, 0, 0, 26386));
641 funds = tm->getFunds(cur_date);
642 BOOST_CHECK(funds == FundsRecord(99610, 0, 0, 100000, 0, 0, 0));
643 funds = tm->getFunds(next_date);
644 BOOST_CHECK(funds == FundsRecord(99610, 0, 0, 100000, 0, 0, 0));
647 cur_date = Datetime(199911300000);
648 pre_date = Datetime(199911290000);
649 next_date = Datetime(199912010000);
650 BOOST_CHECK(tm->borrowStock(cur_date, stock, 26.28, 200) ==
true);
651 BOOST_CHECK(tm->borrowStock(cur_date, stock, 26.42, 800) ==
true);
652 funds = tm->getFunds();
653 BOOST_CHECK(funds == FundsRecord(99510, 0, 0, 100000, 0, 0, 26392));
654 funds = tm->getFunds(pre_date);
655 BOOST_CHECK(funds == FundsRecord(99610, 0, 0, 100000, 0, 0, 0));
656 funds = tm->getFunds(cur_date);
657 BOOST_CHECK(funds == FundsRecord(99510, 0, 0, 100000, 0, 0, 26392));
658 funds = tm->getFunds(next_date);
659 BOOST_CHECK(funds == FundsRecord(99510, 0, 0, 100000, 0, 0, 26392));
661 cur_date = Datetime(199912010000);
662 pre_date = Datetime(199911300000);
663 next_date = Datetime(199912020000);
664 BOOST_CHECK(tm->returnStock(cur_date, stock, 26.30, 500) ==
true);
665 funds = tm->getFunds();
666 BOOST_CHECK(funds == FundsRecord(99390, 0, 0, 100000, 0, 0, 13210));
667 funds = tm->getFunds(pre_date);
668 BOOST_CHECK(funds == FundsRecord(99510, 0, 0, 100000, 0, 0, 26392));
669 funds = tm->getFunds(cur_date);
670 BOOST_CHECK(funds == FundsRecord(99390, 0, 0, 100000, 0, 0, 13210));
671 funds = tm->getFunds(next_date);
672 BOOST_CHECK(funds == FundsRecord(99390, 0, 0, 100000, 0, 0, 13210));
674 BOOST_CHECK(tm->returnStock(cur_date, stock, 26.30, 500) ==
true);
675 funds = tm->getFunds();
676 BOOST_CHECK(funds == FundsRecord(99330, 0, 0, 100000, 0, 0, 0));
677 funds = tm->getFunds(pre_date);
678 BOOST_CHECK(funds == FundsRecord(99510, 0, 0, 100000, 0, 0, 26392));
679 funds = tm->getFunds(cur_date);
680 BOOST_CHECK(funds == FundsRecord(99330, 0, 0, 100000, 0, 0, 0));
681 funds = tm->getFunds(next_date);
682 BOOST_CHECK(funds == FundsRecord(99330, 0, 0, 100000, 0, 0, 0));
685 cur_date = Datetime(199912070000);
686 pre_date = Datetime(199912060000);
687 next_date = Datetime(199912080000);
688 BOOST_CHECK(tm->borrowStock(cur_date, stock, 25.8, 600) ==
true);
689 BOOST_CHECK(tm->borrowStock(cur_date, stock, 25.83, 400) ==
true);
690 funds = tm->getFunds();
691 BOOST_CHECK(funds == FundsRecord(99230, 0, 0, 100000, 0, 0, 25812));
692 funds = tm->getFunds(pre_date);
693 BOOST_CHECK(funds == FundsRecord(99330, 0, 0, 100000, 0, 0, 0));
694 funds = tm->getFunds(cur_date);
695 BOOST_CHECK(funds == FundsRecord(99230, 0, 0, 100000, 0, 0, 25812));
696 funds = tm->getFunds(next_date);
697 BOOST_CHECK(funds == FundsRecord(99230, 0, 0, 100000, 0, 0, 25812));
699 cur_date = Datetime(199912080000);
700 pre_date = Datetime(199912070000);
701 next_date = Datetime(199912090000);
702 BOOST_CHECK(tm->returnStock(cur_date, stock, 25.50, 200) ==
true);
703 funds = tm->getFunds();
704 BOOST_CHECK(funds == FundsRecord(99170, 0, 0, 100000, 0, 0, 20652));
705 funds = tm->getFunds(pre_date);
706 BOOST_CHECK(funds == FundsRecord(99230, 0, 0, 100000, 0, 0, 25812));
707 funds = tm->getFunds(cur_date);
708 BOOST_CHECK(funds == FundsRecord(99170, 0, 0, 100000, 0, 0, 20652));
709 funds = tm->getFunds(next_date);
710 BOOST_CHECK(funds == FundsRecord(99170, 0, 0, 100000, 0, 0, 20652));
712 BOOST_CHECK(tm->returnStock(cur_date, stock, 25.50, 400) ==
true);
713 funds = tm->getFunds();
714 BOOST_CHECK(funds == FundsRecord(99110, 0, 0, 100000, 0, 0, 10332));
715 funds = tm->getFunds(pre_date);
716 BOOST_CHECK(funds == FundsRecord(99230, 0, 0, 100000, 0, 0, 25812));
717 funds = tm->getFunds(cur_date);
718 BOOST_CHECK(funds == FundsRecord(99110, 0, 0, 100000, 0, 0, 10332));
719 funds = tm->getFunds(next_date);
720 BOOST_CHECK(funds == FundsRecord(99110, 0, 0, 100000, 0, 0, 10332));
722 BOOST_CHECK(tm->returnStock(cur_date, stock, 25.50, 400) ==
true);
723 funds = tm->getFunds();
724 BOOST_CHECK(funds == FundsRecord(99050, 0, 0, 100000, 0, 0, 0));
725 funds = tm->getFunds(pre_date);
726 BOOST_CHECK(funds == FundsRecord(99230, 0, 0, 100000, 0, 0, 25812));
727 funds = tm->getFunds(cur_date);
728 BOOST_CHECK(funds == FundsRecord(99050, 0, 0, 100000, 0, 0, 0));
729 funds = tm->getFunds(next_date);
730 BOOST_CHECK(funds == FundsRecord(99050, 0, 0, 100000, 0, 0, 0));
736 StockManager& sm = StockManager::instance();
737 Stock stock = sm.getStock(
"sh600000");
738 Stock stock2 = sm.getStock(
"sz000001");
743 TradeCostPtr tc = TC_TestStub();
744 TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000, tc);
745 tm->setParam<
bool>(
"reinvest",
false);
746 tm->setParam<
bool>(
"support_borrow_cash",
false);
747 tm->setParam<
bool>(
"support_borrow_stock",
false);
750 Datetime cur_date, pre_date, next_date;
751 cur_date = Datetime(199911170000);
752 pre_date = Datetime(199911160000);
753 next_date = Datetime(199911180000);
754 trade = tm->buy(cur_date, stock, 27.18, 1000, 27.0, 27.18, 27.18);
755 cost = tc->getBuyCost(cur_date, stock, 27.18, 1000);
756 BOOST_CHECK(trade == TradeRecord(stock, cur_date, BUSINESS_BUY,
757 27.18, 27.18, 27.18, 1000, cost, 27.0, 72810, PART_INVALID));
758 BOOST_CHECK(tm->firstDatetime() == cur_date);
759 BOOST_CHECK(tm->lastDatetime() == cur_date);
760 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 72810) < 0.001);
761 BOOST_CHECK(tm->have(stock) ==
true);
762 BOOST_CHECK(tm->getStockNumber() == 1);
763 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 0);
764 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 1000);
765 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 1000);
766 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 0);
767 funds = tm->getFunds();
768 BOOST_CHECK(funds == FundsRecord(72810, 27180, 0, 100000, 0, 0, 0));
769 funds = tm->getFunds(pre_date);
770 BOOST_CHECK(funds == FundsRecord(100000, 0, 0, 100000, 0, 0, 0));
771 funds = tm->getFunds(cur_date);
772 BOOST_CHECK(funds == FundsRecord(72810, 27180, 0, 100000, 0, 0, 0));
773 funds = tm->getFunds(next_date);
774 BOOST_CHECK(funds == FundsRecord(72810, 27020, 0, 100000, 0, 0, 0));
777 cur_date = Datetime(200007050000);
778 pre_date = Datetime(200007040000);
779 next_date = Datetime(200007060000);
780 trade = tm->buy(cur_date, stock, 23.24, 1000, 23.11, 23.25, 23.23);
781 cost = tc->getBuyCost(cur_date, stock, 23.24, 1000);
782 BOOST_CHECK(trade == TradeRecord(stock, cur_date, BUSINESS_BUY,
783 23.23, 23.24, 23.25, 1000, cost, 23.11, 49560, PART_INVALID));
784 BOOST_CHECK(tm->lastDatetime() == cur_date);
785 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 49560) < 0.001);
786 BOOST_CHECK(tm->have(stock) ==
true);
787 BOOST_CHECK(tm->getStockNumber() == 1);
788 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 1000);
789 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
790 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
791 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 0);
792 funds = tm->getFunds();
793 BOOST_CHECK(funds == FundsRecord(49560, 46440, 0, 100000, 0, 0, 0));
794 funds = tm->getFunds(pre_date);
795 BOOST_CHECK(funds == FundsRecord(72810, 23250, 0, 100000, 0, 0, 0));
796 funds = tm->getFunds(cur_date);
797 BOOST_CHECK(funds == FundsRecord(49560, 46440, 0, 100000, 0, 0, 0));
798 funds = tm->getFunds(next_date);
799 BOOST_CHECK(funds == FundsRecord(49560, 46160, 0, 100000, 0, 0, 0));
802 cur_date = Datetime(200007050000);
803 pre_date = Datetime(200007040000);
804 next_date = Datetime(200007060000);
805 trade = tm->buy(cur_date, stock2, 17.73, 500, 17.56, 18.0, 17.70);
806 cost = tc->getBuyCost(cur_date, stock2, 17.73, 500);
807 BOOST_CHECK(trade == TradeRecord(stock2, cur_date, BUSINESS_BUY,
808 17.70, 17.73, 18.0, 500, cost, 17.56, 40685, PART_INVALID));
809 BOOST_CHECK(tm->lastDatetime() == cur_date);
810 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 40685) < 0.001);
811 BOOST_CHECK(tm->have(stock2) ==
true);
812 BOOST_CHECK(tm->getStockNumber() == 2);
813 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 1000);
814 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
815 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
816 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 0);
817 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 500);
818 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 500);
819 funds = tm->getFunds(pre_date);
820 BOOST_CHECK(funds == FundsRecord(72810, 23250, 0, 100000, 0, 0, 0));
821 funds = tm->getFunds(cur_date);
822 BOOST_CHECK(funds == FundsRecord(40685, 55275.0, 0, 100000, 0, 0, 0));
823 funds = tm->getFunds();
824 BOOST_CHECK(funds == FundsRecord(40685, 55275.0, 0, 100000, 0, 0, 0));
825 funds = tm->getFunds(next_date);
826 BOOST_CHECK(funds == FundsRecord(40685, 55020.0, 0, 100000, 0, 0, 0));
829 cur_date = Datetime(200007050000);
830 pre_date = Datetime(200007040000);
831 next_date = Datetime(200007060000);
832 trade = tm->buy(cur_date, stock2, 17.61, 300, 17.50, 17.62, 17.60);
833 cost = tc->getBuyCost(cur_date, stock2, 17.61, 300);
834 BOOST_CHECK(trade == TradeRecord(stock2, cur_date, BUSINESS_BUY,
835 17.60, 17.61, 17.62, 300, cost, 17.50, 35392, PART_INVALID));
836 BOOST_CHECK(tm->lastDatetime() == cur_date);
837 BOOST_CHECK(std::fabs(tm->cash(cur_date) -35392) < 0.001);
838 BOOST_CHECK(tm->have(stock2) ==
true);
839 BOOST_CHECK(tm->getStockNumber() == 2);
840 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 1000);
841 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
842 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
843 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 0);
844 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 800);
845 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 800);
846 funds = tm->getFunds(pre_date);
847 BOOST_CHECK(funds == FundsRecord(72810, 23250, 0, 100000, 0, 0, 0));
848 funds = tm->getFunds(cur_date);
849 BOOST_CHECK(funds == FundsRecord(35392, 60576.0, 0, 100000, 0, 0, 0));
850 funds = tm->getFunds();
851 BOOST_CHECK(funds == FundsRecord(35392, 60576.0, 0, 100000, 0, 0, 0));
852 funds = tm->getFunds(next_date);
853 BOOST_CHECK(funds == FundsRecord(35392, 60336.0, 0, 100000, 0, 0, 0));
856 cur_date = Datetime(200007060000);
857 pre_date = Datetime(200007050000);
858 next_date = Datetime(200007070000);
859 BOOST_CHECK(tm->checkin(cur_date, 50000) ==
true);
860 BOOST_CHECK(tm->lastDatetime() == cur_date);
861 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 85392) < 0.001);
862 BOOST_CHECK(tm->have(stock) ==
true);
863 BOOST_CHECK(tm->have(stock2) ==
true);
864 BOOST_CHECK(tm->getStockNumber() == 2);
865 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
866 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
867 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
868 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 800);
869 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 800);
870 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 800);
871 funds = tm->getFunds(pre_date);
872 BOOST_CHECK(funds == FundsRecord(35392, 60576.0, 0, 100000, 0, 0, 0));
873 funds = tm->getFunds(cur_date);
874 BOOST_CHECK(funds == FundsRecord(85392, 60336.0, 0, 150000, 0, 0, 0));
875 funds = tm->getFunds();
876 BOOST_CHECK(funds == FundsRecord(85392, 60336.0, 0, 150000, 0, 0, 0));
877 funds = tm->getFunds(next_date);
878 BOOST_CHECK(funds == FundsRecord(85392, 60852.0, 0, 150000, 0, 0, 0));
881 cur_date = Datetime(200007070000);
882 pre_date = Datetime(200007060000);
883 next_date = Datetime(200007080000);
884 BOOST_CHECK(tm->checkout(cur_date, 20000) ==
true);
885 BOOST_CHECK(tm->lastDatetime() == cur_date);
886 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 65392) < 0.001);
887 BOOST_CHECK(tm->have(stock) ==
true);
888 BOOST_CHECK(tm->have(stock2) ==
true);
889 BOOST_CHECK(tm->getStockNumber() == 2);
890 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
891 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
892 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
893 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 800);
894 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 800);
895 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 800);
896 funds = tm->getFunds(pre_date);
897 BOOST_CHECK(funds == FundsRecord(85392, 60336.0, 0, 150000, 0, 0, 0));
898 funds = tm->getFunds(cur_date);
899 BOOST_CHECK(funds == FundsRecord(65392, 60852.0, 0, 130000, 0, 0, 0));
900 funds = tm->getFunds();
901 BOOST_CHECK(funds == FundsRecord(65392, 60852.0, 0, 130000, 0, 0, 0));
902 funds = tm->getFunds(next_date);
903 BOOST_CHECK(funds == FundsRecord(65392, 60852.0, 0, 130000, 0, 0, 0));
906 cur_date = Datetime(200007100000);
907 pre_date = Datetime(200007090000);
908 next_date = Datetime(200007110000);
909 BOOST_CHECK(tm->borrowCash(cur_date, 10000) ==
true);
910 BOOST_CHECK(tm->lastDatetime() == cur_date);
911 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 75362) < 0.001);
912 BOOST_CHECK(tm->have(stock) ==
true);
913 BOOST_CHECK(tm->have(stock2) ==
true);
914 BOOST_CHECK(tm->getStockNumber() == 2);
915 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
916 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
917 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
918 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 800);
919 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 800);
920 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 800);
921 funds = tm->getFunds(pre_date);
922 BOOST_CHECK(funds == FundsRecord(65392, 60852.0, 0, 130000, 0, 0, 0));
923 funds = tm->getFunds(cur_date);
924 BOOST_CHECK(funds == FundsRecord(75362, 60388.0, 0, 130000, 0, 10000, 0));
925 funds = tm->getFunds();
926 BOOST_CHECK(funds == FundsRecord(75362, 60388.0, 0, 130000, 0, 10000, 0));
927 funds = tm->getFunds(next_date);
928 BOOST_CHECK(funds == FundsRecord(75362, 61344.0, 0, 130000, 0, 10000, 0));
929 BOOST_CHECK(tm->getDebtCash(pre_date) == 0.0);
930 BOOST_CHECK(tm->getDebtCash(cur_date) == 10000.0);
931 BOOST_CHECK(tm->getDebtCash(next_date) == 10000.0);
934 cur_date = Datetime(200007110000);
935 pre_date = Datetime(200007100000);
936 next_date = Datetime(200007120000);
937 BOOST_CHECK(tm->returnCash(cur_date, 5000) ==
true);
938 BOOST_CHECK(tm->lastDatetime() == cur_date);
939 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 70322) < 0.001);
940 BOOST_CHECK(tm->have(stock) ==
true);
941 BOOST_CHECK(tm->have(stock2) ==
true);
942 BOOST_CHECK(tm->getStockNumber() == 2);
943 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
944 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
945 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
946 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 800);
947 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 800);
948 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 800);
949 funds = tm->getFunds(pre_date);
950 BOOST_CHECK(funds == FundsRecord(75362, 60388.0, 0, 130000, 0, 10000, 0));
951 funds = tm->getFunds(cur_date);
952 BOOST_CHECK(funds == FundsRecord(70322, 61344.0, 0, 130000, 0, 5000, 0));
953 funds = tm->getFunds();
954 BOOST_CHECK(funds == FundsRecord(70322, 61344.0, 0, 130000, 0, 5000, 0));
955 funds = tm->getFunds(next_date);
956 BOOST_CHECK(funds == FundsRecord(70322, 61768.0, 0, 130000, 0, 5000, 0));
957 BOOST_CHECK(tm->getDebtCash(pre_date) == 10000.0);
958 BOOST_CHECK(tm->getDebtCash(cur_date) == 5000.0);
959 BOOST_CHECK(tm->getDebtCash(next_date) == 5000.0);
962 cur_date = Datetime(200007120000);
963 pre_date = Datetime(200007110000);
964 next_date = Datetime(200007130000);
965 BOOST_CHECK(tm->checkinStock(cur_date, stock2, 18.0, 200) ==
true);
966 BOOST_CHECK(tm->lastDatetime() == cur_date);
967 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 70322) < 0.001);
968 BOOST_CHECK(tm->have(stock) ==
true);
969 BOOST_CHECK(tm->have(stock2) ==
true);
970 BOOST_CHECK(tm->getStockNumber() == 2);
971 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
972 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
973 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
974 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 800);
975 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 1000);
976 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 1000);
977 funds = tm->getFunds(pre_date);
978 BOOST_CHECK(funds == FundsRecord(70322, 61344.0, 0, 130000, 0, 5000, 0));
979 funds = tm->getFunds(cur_date);
980 BOOST_CHECK(funds == FundsRecord(70322, 65410.0, 0, 130000, 3600, 5000, 0));
981 funds = tm->getFunds();
982 BOOST_CHECK(funds == FundsRecord(70322, 65410.0, 0, 130000, 3600, 5000, 0));
983 funds = tm->getFunds(next_date);
984 BOOST_CHECK(funds == FundsRecord(70322, 64880.0, 0, 130000, 3600, 5000, 0));
985 BOOST_CHECK(tm->getDebtCash(pre_date) == 5000.0);
986 BOOST_CHECK(tm->getDebtCash(cur_date) == 5000.0);
987 BOOST_CHECK(tm->getDebtCash(next_date) == 5000.0);
990 Stock stock3 = sm.getStock(
"sz000005");
991 cur_date = Datetime(200007120000);
992 pre_date = Datetime(200007110000);
993 next_date = Datetime(200007130000);
994 BOOST_CHECK(tm->checkinStock(cur_date, stock3, 10.01, 1000) ==
true);
995 BOOST_CHECK(tm->lastDatetime() == cur_date);
996 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 70322) < 0.001);
997 BOOST_CHECK(tm->have(stock) ==
true);
998 BOOST_CHECK(tm->have(stock2) ==
true);
999 BOOST_CHECK(tm->have(stock3) ==
true);
1000 BOOST_CHECK(tm->getStockNumber() == 3);
1001 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
1002 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 2000);
1003 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 2000);
1004 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 800);
1005 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 1000);
1006 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 1000);
1007 BOOST_CHECK(tm->getHoldNumber(pre_date, stock3) == 0);
1008 BOOST_CHECK(tm->getHoldNumber(cur_date, stock3) == 1000);
1009 BOOST_CHECK(tm->getHoldNumber(next_date, stock3) == 1000);
1010 funds = tm->getFunds(pre_date);
1011 BOOST_CHECK(funds == FundsRecord(70322, 61344.0, 0, 130000, 0, 5000, 0));
1012 funds = tm->getFunds(cur_date);
1013 BOOST_CHECK(funds == FundsRecord(70322, 75450.0, 0, 130000, 13610, 5000, 0));
1014 funds = tm->getFunds();
1015 BOOST_CHECK(funds == FundsRecord(70322, 75450.0, 0, 130000, 13610, 5000, 0));
1016 funds = tm->getFunds(next_date);
1017 BOOST_CHECK(funds == FundsRecord(70322, 74830.0, 0, 130000, 13610, 5000, 0));
1018 BOOST_CHECK(tm->getDebtCash(pre_date) == 5000.0);
1019 BOOST_CHECK(tm->getDebtCash(cur_date) == 5000.0);
1020 BOOST_CHECK(tm->getDebtCash(next_date) == 5000.0);
1024 cur_date = Datetime(200007130000);
1025 pre_date = Datetime(200007120000);
1026 next_date = Datetime(200007140000);
1027 tm->sell(cur_date, stock, 23.44);
1028 tm->sell(cur_date, stock2, 18);
1029 tm->sell(cur_date, stock3, 9.95);
1030 BOOST_CHECK(tm->lastDatetime() == cur_date);
1031 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 145092) < 0.001);
1032 BOOST_CHECK(tm->have(stock) ==
false);
1033 BOOST_CHECK(tm->have(stock2) ==
false);
1034 BOOST_CHECK(tm->have(stock3) ==
false);
1035 BOOST_CHECK(tm->getStockNumber() == 0);
1036 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
1037 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 0);
1038 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 0);
1039 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 1000);
1040 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 0);
1041 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 0);
1042 BOOST_CHECK(tm->getHoldNumber(pre_date, stock3) == 1000);
1043 BOOST_CHECK(tm->getHoldNumber(cur_date, stock3) == 0);
1044 BOOST_CHECK(tm->getHoldNumber(next_date, stock3) == 0);
1045 funds = tm->getFunds(pre_date);
1046 BOOST_CHECK(funds == FundsRecord(70322, 75450.0, 0, 130000, 13610, 5000, 0));
1047 funds = tm->getFunds(cur_date);
1048 BOOST_CHECK(funds == FundsRecord(145092, 0, 0, 130000, 13610, 5000, 0));
1049 funds = tm->getFunds(Null<Datetime>());
1050 BOOST_CHECK(funds == FundsRecord(145092, 0, 0, 130000, 13610, 5000, 0));
1051 funds = tm->getFunds(next_date);
1052 BOOST_CHECK(funds == FundsRecord(145092, 0, 0, 130000, 13610, 5000, 0));
1053 BOOST_CHECK(tm->getDebtCash(pre_date) == 5000.0);
1054 BOOST_CHECK(tm->getDebtCash(cur_date) == 5000.0);
1055 BOOST_CHECK(tm->getDebtCash(next_date) == 5000.0);
1058 cur_date = Datetime(200007130000);
1059 pre_date = Datetime(200007120000);
1060 next_date = Datetime(200007140000);
1061 trade = tm->buy(cur_date, stock2, 18.2, 300, 17.50, 19.62, 18.20);
1062 cost = tc->getBuyCost(cur_date, stock2, 18.2, 300);
1063 BOOST_CHECK(trade == TradeRecord(stock2, cur_date, BUSINESS_BUY,
1064 18.2, 18.2, 19.62, 300, cost, 17.50, 139622, PART_INVALID));
1065 BOOST_CHECK(tm->lastDatetime() == cur_date);
1066 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 139622) < 0.001);
1067 BOOST_CHECK(tm->have(stock) ==
false);
1068 BOOST_CHECK(tm->have(stock2) ==
true);
1069 BOOST_CHECK(tm->have(stock3) ==
false);
1070 BOOST_CHECK(tm->getStockNumber() == 1);
1071 BOOST_CHECK(tm->getHoldNumber(pre_date, stock) == 2000);
1072 BOOST_CHECK(tm->getHoldNumber(cur_date, stock) == 0);
1073 BOOST_CHECK(tm->getHoldNumber(next_date, stock) == 0);
1074 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 1000);
1075 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 300);
1076 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 300);
1077 BOOST_CHECK(tm->getHoldNumber(pre_date, stock3) == 1000);
1078 BOOST_CHECK(tm->getHoldNumber(cur_date, stock3) == 0);
1079 BOOST_CHECK(tm->getHoldNumber(next_date, stock3) == 0);
1080 funds = tm->getFunds(pre_date);
1081 BOOST_CHECK(funds == FundsRecord(70322, 75450, 0, 130000, 13610, 5000, 0));
1082 funds = tm->getFunds(cur_date);
1083 BOOST_CHECK(funds == FundsRecord(139622, 5400, 0, 130000, 13610, 5000, 0));
1084 funds = tm->getFunds();
1085 BOOST_CHECK(funds == FundsRecord(139622, 5400, 0, 130000, 13610, 5000, 0));
1086 funds = tm->getFunds(next_date);
1087 BOOST_CHECK(funds == FundsRecord(139622, 5388.0, 0, 130000, 13610, 5000, 0));
1089 #if 0 //occur random memory error? 1091 cur_date = Datetime(200007140000);
1092 pre_date = Datetime(200007130000);
1093 next_date = Datetime(200007150000);
1094 BOOST_CHECK(tm->borrowStock(cur_date, stock2, 18.08, 1000) ==
true);
1095 BOOST_CHECK(tm->lastDatetime() == cur_date);
1096 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 139572) < 0.001);
1097 BOOST_CHECK(tm->have(stock2) ==
true);
1098 BOOST_CHECK(tm->getStockNumber() == 1);
1099 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 300);
1100 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 300);
1101 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 300);
1102 funds = tm->getFunds(pre_date);
1103 BOOST_CHECK(funds == FundsRecord(139622, 5400, 0, 130000, 13610, 5000, 0));
1104 funds = tm->getFunds(cur_date);
1105 BOOST_CHECK(funds == FundsRecord(139572, 5388, 0, 130000, 13610, 5000, 18080));
1106 funds = tm->getFunds();
1107 BOOST_CHECK(funds == FundsRecord(139572, 5388, 0, 130000, 13610, 5000, 18080));
1108 funds = tm->getFunds(next_date);
1109 BOOST_CHECK(funds == FundsRecord(139572, 5388, 0, 130000, 13610, 5000, 18080));
1110 BOOST_CHECK(tm->getDebtNumber(pre_date, stock2) == 0);
1111 BOOST_CHECK(tm->getDebtNumber(cur_date, stock2) == 1000);
1112 BOOST_CHECK(tm->getDebtNumber(next_date, stock2) == 1000);
1116 cur_date = Datetime(200007140000);
1117 pre_date = Datetime(200007130000);
1118 next_date = Datetime(200007150000);
1119 trade = tm->sellShort(cur_date, stock2, 18.06, 1000, 18.5, 17.00, 18.08);
1120 cost = tm->getSellCost(cur_date, stock2, 18.06, 1000);
1121 BOOST_CHECK(trade == TradeRecord(stock2, cur_date, BUSINESS_SELL_SHORT,
1122 18.08, 18.06, 17, 1000, cost, 18.5, 157612, PART_INVALID));
1123 BOOST_CHECK(tm->lastDatetime() == cur_date);
1124 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 157612) < 0.001);
1125 BOOST_CHECK(tm->have(stock2) ==
true);
1126 BOOST_CHECK(tm->haveShort(stock2) ==
true);
1127 BOOST_CHECK(tm->getStockNumber() == 1);
1128 BOOST_CHECK(tm->getShortStockNumber() == 1);
1129 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 300);
1130 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 300);
1131 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 300);
1132 BOOST_CHECK(tm->getShortHoldNumber(pre_date, stock2) == 0);
1133 BOOST_CHECK(tm->getShortHoldNumber(cur_date, stock2) == 1000);
1134 BOOST_CHECK(tm->getShortHoldNumber(next_date, stock2) == 1000);
1136 funds = tm->getFunds(pre_date);
1137 BOOST_CHECK(funds == FundsRecord(139622, 5400, 0, 130000, 13610, 5000, 0));
1138 funds = tm->getFunds(cur_date);
1139 BOOST_CHECK(funds == FundsRecord(157612, 5388, 17960, 130000, 13610, 5000, 18080));
1140 funds = tm->getFunds();
1141 BOOST_CHECK(funds == FundsRecord(157612, 5388, 17960, 130000, 13610, 5000, 18080));
1142 funds = tm->getFunds(next_date);
1143 BOOST_CHECK(funds == FundsRecord(157612, 5388, 17960, 130000, 13610, 5000, 18080));
1144 BOOST_CHECK(tm->getDebtNumber(pre_date, stock2) == 0);
1145 BOOST_CHECK(tm->getDebtNumber(cur_date, stock2) == 1000);
1146 BOOST_CHECK(tm->getDebtNumber(next_date, stock2) == 1000);
1150 cur_date = Datetime(200007170000);
1151 pre_date = Datetime(200007160000);
1152 next_date = Datetime(200007180000);
1153 trade = tm->buyShort(cur_date, stock2, 17.8, 1000);
1154 cost = tm->getBuyCost(cur_date, stock2, 18.06, 1000);
1155 BOOST_CHECK(trade == TradeRecord(stock2, cur_date, BUSINESS_BUY_SHORT,
1156 0, 17.8, 0, 1000, cost, 0, 139802, PART_INVALID));
1157 BOOST_CHECK(tm->lastDatetime() == cur_date);
1158 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 139802) < 0.001);
1159 BOOST_CHECK(tm->have(stock2) ==
true);
1160 BOOST_CHECK(tm->haveShort(stock2) ==
false);
1161 BOOST_CHECK(tm->getStockNumber() == 1);
1162 BOOST_CHECK(tm->getShortStockNumber() == 0);
1163 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 300);
1164 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 300);
1165 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 300);
1166 BOOST_CHECK(tm->getShortHoldNumber(pre_date, stock2) == 1000);
1167 BOOST_CHECK(tm->getShortHoldNumber(cur_date, stock2) == 0);
1168 BOOST_CHECK(tm->getShortHoldNumber(next_date, stock2) == 0);
1170 funds = tm->getFunds(pre_date);
1171 BOOST_CHECK(funds == FundsRecord(157612, 5388, 17960, 130000, 13610, 5000, 18080));
1172 funds = tm->getFunds(cur_date);
1173 BOOST_CHECK(funds == FundsRecord(139802, 5343, 0, 130000, 13610, 5000, 18080));
1174 funds = tm->getFunds();
1175 BOOST_CHECK(funds == FundsRecord(139802, 5343, 0, 130000, 13610, 5000, 18080));
1176 funds = tm->getFunds(next_date);
1177 BOOST_CHECK(funds == FundsRecord(139802, 5352, 0, 130000, 13610, 5000, 18080));
1178 BOOST_CHECK(tm->getDebtNumber(pre_date, stock2) == 1000);
1179 BOOST_CHECK(tm->getDebtNumber(cur_date, stock2) == 1000);
1180 BOOST_CHECK(tm->getDebtNumber(next_date, stock2) == 1000);
1183 cur_date = Datetime(200007170000);
1184 pre_date = Datetime(200007160000);
1185 next_date = Datetime(200007180000);
1186 BOOST_CHECK(tm->returnStock(cur_date, stock2, 18.08, 1000) ==
true);
1187 BOOST_CHECK(tm->lastDatetime() == cur_date);
1188 BOOST_CHECK(std::fabs(tm->cash(cur_date) - 139742) < 0.001);
1189 BOOST_CHECK(tm->have(stock2) ==
true);
1190 BOOST_CHECK(tm->haveShort(stock2) ==
false);
1191 BOOST_CHECK(tm->getStockNumber() == 1);
1192 BOOST_CHECK(tm->getShortStockNumber() == 0);
1193 BOOST_CHECK(tm->getHoldNumber(pre_date, stock2) == 300);
1194 BOOST_CHECK(tm->getHoldNumber(cur_date, stock2) == 300);
1195 BOOST_CHECK(tm->getHoldNumber(next_date, stock2) == 300);
1196 BOOST_CHECK(tm->getShortHoldNumber(pre_date, stock2) == 1000);
1197 BOOST_CHECK(tm->getShortHoldNumber(cur_date, stock2) == 0);
1198 BOOST_CHECK(tm->getShortHoldNumber(next_date, stock2) == 0);
1200 funds = tm->getFunds(pre_date);
1201 BOOST_CHECK(funds == FundsRecord(157612, 5388, 17960, 130000, 13610, 5000, 18080));
1202 funds = tm->getFunds(cur_date);
1203 BOOST_CHECK(funds == FundsRecord(139742, 5343, 0, 130000, 13610, 5000, 0));
1204 funds = tm->getFunds();
1205 BOOST_CHECK(funds == FundsRecord(139742, 5343, 0, 130000, 13610, 5000, 0));
1206 funds = tm->getFunds(next_date);
1207 BOOST_CHECK(funds == FundsRecord(139742, 5352, 0, 130000, 13610, 5000, 0));
1208 BOOST_CHECK(tm->getDebtNumber(pre_date, stock2) == 1000);
1209 BOOST_CHECK(tm->getDebtNumber(cur_date, stock2) == 0);
1210 BOOST_CHECK(tm->getDebtNumber(next_date, stock2) == 0);
1217 StockManager& sm = StockManager::instance();
1218 Stock stock = sm.getStock(
"sh600000");
1219 Stock stock2 = sm.getStock(
"sz000001");
1224 TradeCostPtr tc = TC_TestStub();
1225 TradeManagerPtr tm = crtTM(Datetime(199901010000), 10000, tc);
1226 tm->setParam<
bool>(
"reinvest",
false);
1227 tm->setParam<
bool>(
"support_borrow_cash",
true);
1228 tm->setParam<
bool>(
"support_borrow_stock",
true);
1230 Datetime cur_date, pre_date, next_date;
1233 cur_date = Datetime(199911100000);
1234 pre_date = Datetime(199911090000);
1235 next_date = Datetime(199911110000);
1236 trade = tm->buy(cur_date, stock, 27.75, 1000, 27.70, 28.0, 27.75);
1237 cost = tm->getBuyCost(cur_date, stock, 27.75, 1000);
1244 StockManager& sm = StockManager::instance();
1245 Stock stk = sm.getStock(
"sz000001");
1249 TradeManagerPtr tm = crtTM(Datetime(199305010000), 100000);
1250 tm->setParam<
bool>(
"reinvest",
true);
1252 tm->buy(Datetime(199305200000L), stk, 55.7, 100);
1253 tm->buy(Datetime(199305250000L), stk, 27.5, 100);
1254 tm->buy(Datetime(199407110000L), stk, 8.55, 200);
1257 TradeRecordList tr_list = tm->getTradeList();
1258 BOOST_CHECK(tr_list.size() == 8);
1259 BOOST_CHECK(tr_list[0] == TradeRecord(Stock(), Datetime(199305010000L),
1260 BUSINESS_INIT, 100000, 100000, 0, 0,
1261 cost, 0, 100000, PART_INVALID));
1262 BOOST_CHECK(tr_list[7] == TradeRecord(stk, Datetime(199407110000L),
1263 BUSINESS_BUY, 0, 8.55, 0, 200,
1264 cost, 0, 90142.50, PART_INVALID));
1267 tr_list = tm->getTradeList(Datetime(199305010000), Null<Datetime>());
1269 BOOST_CHECK(tr_list.size() == 8);
1270 BOOST_CHECK(tr_list[0] == TradeRecord(Stock(), Datetime(199305010000L),
1271 BUSINESS_INIT, 100000, 100000, 0, 0,
1272 cost, 0, 100000, PART_INVALID));
1273 BOOST_CHECK(tr_list[7] == TradeRecord(stk, Datetime(199407110000L),
1274 BUSINESS_BUY, 0, 8.55, 0, 200,
1275 cost, 0, 90142.50, PART_INVALID));
1278 tr_list = tm->getTradeList(Datetime(199305200000L), Null<Datetime>());
1280 BOOST_CHECK(tr_list.size() == 7);
1281 BOOST_CHECK(tr_list[0] == TradeRecord(stk, Datetime(199305200000L),
1282 BUSINESS_BUY, 0, 55.70, 0, 100,
1283 cost, 0, 94430, PART_INVALID));
1284 BOOST_CHECK(tr_list[6] == TradeRecord(stk, Datetime(199407110000L),
1285 BUSINESS_BUY, 0, 8.55, 0, 200,
1286 cost, 0, 90142.50, PART_INVALID));
1289 tr_list = tm->getTradeList(Datetime(199305210000L), Null<Datetime>());
1291 BOOST_CHECK(tr_list.size() == 6);
1292 BOOST_CHECK(tr_list[0] == TradeRecord(stk, Datetime(199305240000L),
1293 BUSINESS_BONUS, 30, 30, 0, 0,
1294 cost, 0, 94490, PART_INVALID));
1295 BOOST_CHECK(tr_list[5] == TradeRecord(stk, Datetime(199407110000L),
1296 BUSINESS_BUY, 0, 8.55, 0, 200,
1297 cost, 0, 90142.50, PART_INVALID));
1300 tr_list = tm->getTradeList(Null<Datetime>(), Datetime(199305210000L));
1301 BOOST_CHECK(tr_list.size() == 0);
1304 tr_list = tm->getTradeList(Datetime(199305210000L), Datetime(199305210000L));
1305 BOOST_CHECK(tr_list.size() == 0);
1308 tr_list = tm->getTradeList(Datetime(199305200000L), Datetime(199407120000L));
1310 BOOST_CHECK(tr_list.size() == 7);
1311 BOOST_CHECK(tr_list[0] == TradeRecord(stk, Datetime(199305200000L),
1312 BUSINESS_BUY, 0, 55.70, 0, 100,
1313 cost, 0, 94430, PART_INVALID));
1314 BOOST_CHECK(tr_list[6] == TradeRecord(stk, Datetime(199407110000L),
1315 BUSINESS_BUY, 0, 8.55, 0, 200,
1316 cost, 0, 90142.50, PART_INVALID));
1319 tr_list = tm->getTradeList(Datetime(199305200000L), Datetime(199407110000L));
1321 BOOST_CHECK(tr_list.size() == 4);
1322 BOOST_CHECK(tr_list[0] == TradeRecord(stk, Datetime(199305200000L),
1323 BUSINESS_BUY, 0, 55.70, 0, 100,
1324 cost, 0, 94430, PART_INVALID));
1325 BOOST_CHECK(tr_list[3] == TradeRecord(stk, Datetime(199305250000L),
1326 BUSINESS_BUY, 0, 27.5, 0, 100,
1327 cost, 0, 91710, PART_INVALID));
1332 StockManager& sm = StockManager::instance();
1333 Stock stk = sm.getStock(
"sz000001");
1337 TradeManagerPtr tm = crtTM(Datetime(199305010000), 100000);
1338 tm->setParam<
bool>(
"reinvest",
true);
1340 tm->buy(Datetime(199305200000L), stk, 55.7, 100);
1341 tm->buy(Datetime(199305250000L), stk, 27.5, 100);
1342 tm->buy(Datetime(199407110000L), stk, 8.55, 200);
1345 TradeRecordList tr_list = tm->getTradeList();
1346 BOOST_CHECK(tr_list.size() == 8);
1347 BOOST_CHECK(tr_list[0] == TradeRecord(Stock(), Datetime(199305010000L),
1348 BUSINESS_INIT, 100000, 100000, 0, 0,
1349 cost, 0, 100000, PART_INVALID));
1351 TradeRecord tr(Stock(), Datetime(199201010000L),
1352 BUSINESS_INIT, 200000, 200000, 0, 0,
1353 cost, 0, 200000, PART_INVALID);
1354 tm->addTradeRecord(tr);
1356 tr_list = tm->getTradeList();
1357 BOOST_CHECK(tr_list.size() == 1);
1358 BOOST_CHECK(tr_list[0] == tr);
1361 tm = crtTM(Datetime(199305010000), 100000);
1362 tm->setParam<
bool>(
"reinvest",
true);
1363 tm->buy(Datetime(199305200000L), stk, 55.7, 100);
1364 tm->buy(Datetime(199305250000L), stk, 27.5, 100);
1365 tm->buy(Datetime(199407110000L), stk, 8.55, 200);
1366 tr_list = tm->getTradeList();
1368 TMPtr tm2 = crtTM(Datetime(199101010000), 100000, TC_Zero(),
"TM2");
1369 tm2->setParam<
bool>(
"reinvest",
false);
1370 BOOST_CHECK(tm->initDatetime() != tm2->initDatetime());
1371 for (
auto iter = tr_list.begin(); iter != tr_list.end(); ++iter) {
1372 tm2->addTradeRecord(*iter);
1375 BOOST_CHECK(tm2->name() != tm->name());
1376 BOOST_CHECK(tm2->getParam<
bool>(
"reinvest") != tm->getParam<
bool>(
"reinvest"));
1377 BOOST_CHECK(tm2->initDatetime() == tm->initDatetime());
1378 BOOST_CHECK(tm2->lastDatetime() == tm->lastDatetime());
1379 BOOST_CHECK(tm2->currentCash() == tm->currentCash());
1381 tr_list = tm2->getTradeList();
1382 BOOST_CHECK(tr_list.size() == 8);
1383 BOOST_CHECK(tr_list[0] == TradeRecord(Stock(), Datetime(199305010000L),
1384 BUSINESS_INIT, 100000, 100000, 0, 0,
1385 cost, 0, 100000, PART_INVALID));
1386 BOOST_CHECK(tr_list[7] == TradeRecord(stk, Datetime(199407110000L),
1387 BUSINESS_BUY, 0, 8.55, 0, 200,
1388 cost, 0, 90142.50, PART_INVALID));
BOOST_AUTO_TEST_CASE(test_TradeManager_init)