10 #include <boost/test/unit_test.hpp> 12 #define BOOST_TEST_MODULE test_hikyuu_trade_sys_suite 13 #include <boost/test/unit_test.hpp> 17 #include <hikyuu/StockManager.h> 18 #include <hikyuu/indicator/crt/MA.h> 19 #include <hikyuu/trade_manage/crt/crtTM.h> 20 #include <hikyuu/trade_sys/system/crt/SYS_Simple.h> 21 #include <hikyuu/trade_sys/signal/crt/SG_Cross.h> 22 #include <hikyuu/trade_sys/moneymanager/crt/MM_FixedCount.h> 23 #include <hikyuu/trade_sys/stoploss/crt/ST_FixedPercent.h> 24 #include <hikyuu/trade_sys/stoploss/crt/ST_Indicator.h> 37 TradeRecordList tr_list;
40 StockManager& sm = StockManager::instance();
43 Datetime init_date(199001010000LL);
44 price_t init_cash = 100000;
45 TradeCostPtr costfunc = TC_Zero();
46 Stock stk = sm[
"sh600000"];
47 Datetime start_date(199911100000LL);
48 Datetime end_date(200002250000LL);
50 KQuery query = KQueryByDate(start_date, end_date, KQuery::DAY);
53 TMPtr tm = crtTM(init_date, init_cash, costfunc,
"TEST_TM");
54 SGPtr sg = SG_Cross(OP(MA(5)), OP(MA(10)),
"CLOSE");
55 MMPtr mm = MM_FixedCount(100);
56 STPtr st = ST_FixedPercent(0.01);
61 sys->setParam(
"delay",
false);
62 sys->setTM(tm->clone());
63 sys->setSG(sg->clone());
64 sys->setMM(mm->clone());
65 sys->setST(st->clone());
66 BOOST_CHECK(sys->readyForRun() ==
true);
68 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
69 tr_list = sys->getTM()->getTradeList();
70 BOOST_CHECK(tr_list.size() != 1);
71 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
73 BOOST_CHECK(tr_list[1].stock == stk);
74 BOOST_CHECK(tr_list[1].datetime == Datetime(199912150000LL));
75 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
76 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 26.45) < 0.00001);
77 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 26.45) < 0.00001);
78 BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
79 BOOST_CHECK(tr_list[1].number == 100);
80 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
81 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 26.19) < 0.00001);
82 current_cash = init_cash - 2645;
83 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
84 BOOST_CHECK(tr_list[1].from == PART_SIGNAL);
86 BOOST_CHECK(tr_list[2].stock == stk);
87 BOOST_CHECK(tr_list[2].datetime == Datetime(199912160000LL));
88 BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
89 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 26.00) < 0.00001);
90 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 26.00) < 0.00001);
91 BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
92 BOOST_CHECK(tr_list[2].number == 100);
93 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
94 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.74) < 0.00001);
96 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
97 BOOST_CHECK(tr_list[2].from == PART_STOPLOSS);
99 BOOST_CHECK(tr_list[3].stock == stk);
100 BOOST_CHECK(tr_list[3].datetime == Datetime(200001050000LL));
101 BOOST_CHECK(tr_list[3].business == BUSINESS_BUY);
102 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 25.28) < 0.00001);
103 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 25.28) < 0.00001);
104 BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
105 BOOST_CHECK(tr_list[3].number == 100);
106 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
107 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 25.03) < 0.00001);
108 current_cash -= 2528;
109 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
110 BOOST_CHECK(tr_list[3].from == PART_SIGNAL);
114 sys->setParam(
"delay",
true);
115 sys->setTM(tm->clone());
116 sys->setSG(sg->clone());
117 sys->setMM(mm->clone());
118 sys->setST(st->clone());
119 BOOST_CHECK(sys->readyForRun() ==
true);
120 sys->run(stk, query);
121 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
122 tr_list = sys->getTM()->getTradeList();
123 BOOST_CHECK(tr_list.size() != 1);
124 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
126 BOOST_CHECK(tr_list[1].stock == stk);
127 BOOST_CHECK(tr_list[1].datetime == Datetime(199912160000LL));
128 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
129 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 26.50) < 0.00001);
130 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 26.50) < 0.00001);
131 BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
132 BOOST_CHECK(tr_list[1].number == 100);
133 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
134 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 26.24) < 0.00001);
135 current_cash = init_cash - 2650;
136 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
137 BOOST_CHECK(tr_list[1].from == PART_SIGNAL);
139 BOOST_CHECK(tr_list[2].stock == stk);
140 BOOST_CHECK(tr_list[2].datetime == Datetime(199912170000LL));
141 BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
142 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 26.00) < 0.00001);
143 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 26.00) < 0.00001);
144 BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
145 BOOST_CHECK(tr_list[2].number == 100);
146 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
147 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.74) < 0.00001);
148 current_cash += 2600;
149 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
150 BOOST_CHECK(tr_list[2].from == PART_STOPLOSS);
152 BOOST_CHECK(tr_list[3].stock == stk);
153 BOOST_CHECK(tr_list[3].datetime == Datetime(200001060000LL));
154 BOOST_CHECK(tr_list[3].business == BUSINESS_BUY);
155 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 25.18) < 0.00001);
156 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 25.18) < 0.00001);
157 BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
158 BOOST_CHECK(tr_list[3].number == 100);
159 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
160 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 24.93) < 0.00001);
161 current_cash -= 2518;
162 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
163 BOOST_CHECK(tr_list[3].from == PART_SIGNAL);
BOOST_AUTO_TEST_CASE(test_SYS_Simple_for_st)