test_doc
test_TradeManager.cpp
浏览该文件的文档.
1 /*
2  * test_TradeManager.cpp
3  *
4  * Created on: 2013-2-21
5  * Author: fasiondog
6  */
7 
8 #ifdef TEST_ALL_IN_ONE
9  #include <boost/test/unit_test.hpp>
10 #else
11  #define BOOST_TEST_MODULE test_hikyuu_trade_manage_suite
12  #include <boost/test/unit_test.hpp>
13 #endif
14 
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>
19 
20 #include <fstream>
21 #include <boost/archive/xml_oarchive.hpp>
22 #include <boost/archive/xml_iarchive.hpp>
23 
24 using namespace hku;
25 
33 BOOST_AUTO_TEST_CASE( test_TradeManager_init ) {
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");
39 
40  BOOST_CHECK(tm->name() == "TEST");
41  BOOST_CHECK(tm->initCash() == 100000.0);
42  //BOOST_CHECK(tm->cash() == 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>());
56 
57  BOOST_CHECK(tm->getShortPositionList().empty() == true);
58  BOOST_CHECK(tm->getShortPosition(stock) == Null<PositionRecord>());
59 
60 }
61 
62 
64 BOOST_AUTO_TEST_CASE( test_TradeManager_getBuyCost ) {
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");
70 
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;
76  expect.total = 19.0;
77  BOOST_CHECK(result == expect);
78 }
79 
80 
82 BOOST_AUTO_TEST_CASE( test_TradeManager_getSellCost ) {
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));
88 
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;
94  expect.total = 7.0;
95  BOOST_CHECK(result == expect);
96 }
97 
98 
100 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_buy ) {
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);
104  TradeManagerPtr tm;
105  TradeRecord result;
106  CostRecord cost;
107  TradeRecord trade;
108  TradeRecordList trade_list;
109 
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>());
114 
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);
120 
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>());
125 
126 #if 0 //取消了该限制
127 
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>());
131 
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>());
136 #endif
137 
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);
150 
151 #if 0
152 
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>());
156 #endif
157 
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));
165 
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>());
172 
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>());
177 
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>());
182 
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>());
187 }
188 
190 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_sell ) {
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);
194  TradeManagerPtr tm;
195  TradeRecord result;
196  CostRecord cost;
197  TradeRecord trade;
198  TradeRecordList trade_list;
199 
201  tm = crtTM(Datetime(199901010000), 0, costfunc, "SYS");
202  result = tm->sell(Datetime(199911180000), stock, 27.2, 100);
203  BOOST_CHECK(result == Null<TradeRecord>());
204 
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);
210 
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>());
217 
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>());
224 
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>());
231 
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>());
238 
240  tm = crtTM(Datetime(199901010000), 100000, costfunc, "SYS");
241  result = tm->sell(Datetime(199901020000), stock, 26.36, 100);
242  BOOST_CHECK(result == Null<TradeRecord>());
243 
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>());
250 
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);
268 
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); //973840);
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); //1005049.5);
279 }
280 
281 
283 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_checkin ) {
284  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
285 
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);
290 
292  tm->checkin(Datetime(200001020000), 10000);
293  BOOST_CHECK(tm->checkin(Datetime(200001010000), 200) == false);
294 }
295 
296 
298 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_checkout ) {
299  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
300 
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);
305 
307  tm->checkin(Datetime(200001020000), 0.01);
308  BOOST_CHECK(tm->checkout(Datetime(200001010000), 200) == false);
309 
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);
314 }
315 
316 
318 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_borrowCash ) {
319  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
320 
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);
325 
327  tm->checkin(Datetime(200001020000), 10000);
328  BOOST_CHECK(tm->borrowCash(Datetime(200001010000), 200) == false);
329 }
330 
331 
333 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_returnCash ) {
334  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
335 
337  tm->borrowCash(Datetime(200001020000), 50000);
338  BOOST_CHECK(tm->returnCash(Datetime(200001010000), 200) == false);
339 
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);
345 
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);
350 
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);
357 }
358 
359 
361 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_checkinStock ) {
362  StockManager& sm = StockManager::instance();
363  Stock stock = sm.getStock("sh600000");
364  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
365 
367  BOOST_CHECK(tm->checkinStock(Datetime(199901020000), Stock(), 10, 100) == false);
368 
370  BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, 10, 0) == false);
371 
373  BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, 0, 100) == false);
374  BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, -0.01, 100) == false);
375 
377  tm->checkin(Datetime(200001020000), 10000);
378  BOOST_CHECK(tm->checkinStock(Datetime(200001010000), stock, 10.0, 200) == false);
379 }
380 
382 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_checkoutStock ) {
383  StockManager& sm = StockManager::instance();
384  Stock stock = sm.getStock("sh600000");
385  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
386 
388  BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), Stock(), 10, 100) == false);
389 
391  BOOST_CHECK(tm->checkinStock(Datetime(199901020000), stock, 10, 100) == true);
392  BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), stock, 10, 0) == false);
393 
395  BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), stock, 0, 100) == false);
396  BOOST_CHECK(tm->checkoutStock(Datetime(199901020000), stock, -0.01, 100) == false);
397 
399  BOOST_CHECK(tm->checkinStock(Datetime(199901010000), stock, 10.0, 200) == false);
400 }
401 
402 
404 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_borrowStock ) {
405  StockManager& sm = StockManager::instance();
406  Stock stock = sm.getStock("sh600000");
407  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
408 
410  BOOST_CHECK(tm->borrowStock(Datetime(199901020000), Stock(), 10, 100) == false);
411 
413  BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, 10, 0) == false);
414 
416  BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, 0, 100) == false);
417  BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, -0.01, 100) == false);
418 
420  tm->checkin(Datetime(200001020000), 10000);
421  BOOST_CHECK(tm->borrowStock(Datetime(200001010000), stock, 10.0, 200) == false);
422 }
423 
424 
426 BOOST_AUTO_TEST_CASE( test_TradeManager_can_not_returnStock ) {
427  StockManager& sm = StockManager::instance();
428  Stock stock = sm.getStock("sh600000");
429  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000);
430 
431  BOOST_CHECK(tm->borrowStock(Datetime(199901020000), stock, 10, 100) == true);
432 
434  BOOST_CHECK(tm->returnStock(Datetime(199901020000), Stock(), 10, 100) == false);
435 
437  BOOST_CHECK(tm->returnStock(Datetime(199901020000), stock, 10, 0) == false);
438 
440  BOOST_CHECK(tm->returnStock(Datetime(199901020000), stock, 0, 100) == false);
441  BOOST_CHECK(tm->returnStock(Datetime(199901020000), stock, -0.01, 100) == false);
442 
444  BOOST_CHECK(tm->returnStock(Datetime(199901010000), stock, 10.0, 100) == false);
445 
447  BOOST_CHECK(tm->returnStock(Datetime(199901030000), stock, 10.0, 101) == false);
448  BOOST_CHECK(tm->returnStock(Datetime(199901030000), stock, 10.0, 100) == true);
449 }
450 
451 
453 BOOST_AUTO_TEST_CASE( test_TradeManager_trade_multi_borrow_cash_by_day ) {
454  FundsRecord funds;
455  TradeCostPtr tc = TC_TestStub();
456  TradeManagerPtr tm = crtTM(Datetime(199901010000), 100000, tc);
457  tm->setParam<bool>("reinvest", false); //忽略权息
458 
459  Datetime cur_date, pre_date, next_date;
460 
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));
474 
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));
487 
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));
498 
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));
513 
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));
524 
526  tm->reset();
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));
540 
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));
550 
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));
561 }
562 
563 
565 BOOST_AUTO_TEST_CASE( test_TradeManager_trade_multi_borrow_stock_by_day ) {
566  StockManager& sm = StockManager::instance();
567  Stock stock = sm.getStock("sh600000");
568  Stock stock2 = sm.getStock("sz000001");
569 
570  CostRecord cost;
571  TradeRecord trade;
572  FundsRecord funds;
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);
578 
579  Datetime cur_date, pre_date, next_date;
580 
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));
594 
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));
607 
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));
617 
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));
632 
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));
645 
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));
660 
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));
673 
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));
683 
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));
698 
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));
711 
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));
721 
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));
731 }
732 
733 
735 BOOST_AUTO_TEST_CASE( test_TradeManager_trade_no_rights_by_day ) {
736  StockManager& sm = StockManager::instance();
737  Stock stock = sm.getStock("sh600000");
738  Stock stock2 = sm.getStock("sz000001");
739 
740  CostRecord cost;
741  TradeRecord trade;
742  FundsRecord funds;
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);
748 
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));
775 
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));
800 
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));
827 
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));
854 
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));
879 
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));
904 
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);
932 
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);
960 
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);
988 
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);
1021 
1022 
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);
1056 
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));
1088 
1089 #if 0 //occur random memory error?
1090 
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);
1113 
1114 
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);
1135 
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);
1147 
1148 
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);
1169 
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);
1181 
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);
1199 
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);
1211 #endif
1212 }
1213 
1214 
1216 BOOST_AUTO_TEST_CASE( test_TradeManager_trade_financing_securities_lending_no_rights_by_day ) {
1217  StockManager& sm = StockManager::instance();
1218  Stock stock = sm.getStock("sh600000");
1219  Stock stock2 = sm.getStock("sz000001");
1220 
1221  CostRecord cost;
1222  TradeRecord trade;
1223  FundsRecord funds;
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);
1229 
1230  Datetime cur_date, pre_date, next_date;
1231 
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);
1238 
1239 }
1240 
1241 
1243 BOOST_AUTO_TEST_CASE( test_getTradeList ) {
1244  StockManager& sm = StockManager::instance();
1245  Stock stk = sm.getStock("sz000001");
1246 
1247  CostRecord cost;
1248 
1249  TradeManagerPtr tm = crtTM(Datetime(199305010000), 100000);
1250  tm->setParam<bool>("reinvest", true);
1251 
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);
1255 
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));
1265 
1267  tr_list = tm->getTradeList(Datetime(199305010000), Null<Datetime>());
1268 
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));
1276 
1278  tr_list = tm->getTradeList(Datetime(199305200000L), Null<Datetime>());
1279 
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));
1287 
1289  tr_list = tm->getTradeList(Datetime(199305210000L), Null<Datetime>());
1290 
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));
1298 
1300  tr_list = tm->getTradeList(Null<Datetime>(), Datetime(199305210000L));
1301  BOOST_CHECK(tr_list.size() == 0);
1302 
1304  tr_list = tm->getTradeList(Datetime(199305210000L), Datetime(199305210000L));
1305  BOOST_CHECK(tr_list.size() == 0);
1306 
1308  tr_list = tm->getTradeList(Datetime(199305200000L), Datetime(199407120000L));
1309 
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));
1317 
1319  tr_list = tm->getTradeList(Datetime(199305200000L), Datetime(199407110000L));
1320 
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));
1328 }
1329 
1331 BOOST_AUTO_TEST_CASE( test_TradeManager_addTradeRecord ) {
1332  StockManager& sm = StockManager::instance();
1333  Stock stk = sm.getStock("sz000001");
1334 
1335  CostRecord cost;
1336 
1337  TradeManagerPtr tm = crtTM(Datetime(199305010000), 100000);
1338  tm->setParam<bool>("reinvest", true);
1339 
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);
1343 
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));
1350 
1351  TradeRecord tr(Stock(), Datetime(199201010000L),
1352  BUSINESS_INIT, 200000, 200000, 0, 0,
1353  cost, 0, 200000, PART_INVALID);
1354  tm->addTradeRecord(tr);
1355 
1356  tr_list = tm->getTradeList();
1357  BOOST_CHECK(tr_list.size() == 1);
1358  BOOST_CHECK(tr_list[0] == tr);
1359 
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();
1367 
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);
1373  }
1374 
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());
1380 
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));
1389 
1390 }
1391 
BOOST_AUTO_TEST_CASE(test_TradeManager_init)