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