10 #include <boost/test/unit_test.hpp> 12 #define BOOST_TEST_MODULE test_hikyuu_trade_sys_suite 13 #include <boost/test/unit_test.hpp> 17 #include <hikyuu/StockManager.h> 18 #include <hikyuu/indicator/crt/MA.h> 19 #include <hikyuu/trade_manage/crt/crtTM.h> 20 #include <hikyuu/trade_sys/system/crt/SYS_Simple.h> 21 #include <hikyuu/trade_sys/signal/crt/SG_Cross.h> 22 #include <hikyuu/trade_sys/moneymanager/crt/MM_FixedCount.h> 23 #include <hikyuu/trade_sys/stoploss/crt/ST_FixedPercent.h> 24 #include <hikyuu/trade_sys/stoploss/crt/ST_Indicator.h> 37 TradeRecordList tr_list;
40 StockManager& sm = StockManager::instance();
43 Datetime init_date(199001010000LL);
44 price_t init_cash = 100000;
45 TradeCostPtr costfunc = TC_Zero();
46 Stock stk = sm[
"sh600000"];
47 Datetime start_date(199911100000LL);
48 Datetime end_date(200002250000LL);
50 KQuery query = KQueryByDate(start_date, end_date, KQuery::DAY);
53 TMPtr tm = crtTM(init_date, init_cash, costfunc,
"TEST_TM");
54 SGPtr sg = SG_Cross(OP(MA(5)), OP(MA(10)),
"CLOSE");
55 MMPtr mm = MM_FixedCount(100);
56 STPtr st = ST_FixedPercent(0.01);
57 TPPtr tp = ST_Indicator(OP(MA(5)),
"CLOSE");
60 EVPtr ev1 = make_shared<TestEV1>();
63 EVPtr ev2 = make_shared<TestEV2>();
66 EVPtr ev3 = make_shared<TestEV3>();
69 CNPtr cn1 = make_shared<TestCN1>();
70 CNPtr cn2 = make_shared<TestCN2>();
71 CNPtr cn3 = make_shared<TestCN3>();
75 sys->setParam<
bool>(
"delay",
false);
76 sys->setParam<
bool>(
"ev_open_position",
true);
77 sys->setTM(tm->clone());
78 sys->setSG(sg->clone());
79 sys->setMM(mm->clone());
80 sys->setST(st->clone());
81 sys->setTP(tp->clone());
85 BOOST_CHECK(sys->readyForRun() ==
true);
87 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
88 tr_list = sys->getTM()->getTradeList();
89 BOOST_CHECK(tr_list.size() == 4);
90 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
92 BOOST_CHECK(tr_list[1].stock == stk);
93 BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
94 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
95 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
96 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
97 BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
98 BOOST_CHECK(tr_list[1].number == 100);
99 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
100 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 25.31) < 0.00001);
101 current_cash = init_cash - 2557;
102 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
103 BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
105 BOOST_CHECK(tr_list[2].stock == stk);
106 BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
107 BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
108 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
109 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
110 BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
111 BOOST_CHECK(tr_list[2].number == 100);
112 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
113 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.03) < 0.00001);
114 current_cash -= 2528;
115 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
116 BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
118 BOOST_CHECK(tr_list[3].stock == stk);
119 BOOST_CHECK(tr_list[3].datetime == Datetime(200001100000LL));
120 BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
121 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 27.25) < 0.00001);
122 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 27.25) < 0.00001);
123 BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
124 BOOST_CHECK(tr_list[3].number == 200);
125 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
126 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 26.98) < 0.00001);
127 current_cash += 2725*2;
128 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
129 BOOST_CHECK(tr_list[3].from == PART_ENVIRONMENT);
133 sys->setParam<
bool>(
"delay",
false);
134 sys->setParam<
bool>(
"ev_open_position",
true);
135 sys->setTM(tm->clone());
136 sys->setSG(sg->clone());
137 sys->setMM(mm->clone());
138 sys->setST(st->clone());
139 sys->setTP(tp->clone());
143 BOOST_CHECK(sys->readyForRun() ==
true);
144 sys->run(stk, query);
145 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
146 tr_list = sys->getTM()->getTradeList();
147 BOOST_CHECK(tr_list.size() == 4);
148 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
150 BOOST_CHECK(tr_list[1].stock == stk);
151 BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
152 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
153 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
154 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
155 BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
156 BOOST_CHECK(tr_list[1].number == 100);
157 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
158 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 25.31) < 0.00001);
159 current_cash = init_cash - 2557;
160 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
161 BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
163 BOOST_CHECK(tr_list[2].stock == stk);
164 BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
165 BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
166 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
167 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
168 BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
169 BOOST_CHECK(tr_list[2].number == 100);
170 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
171 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.03) < 0.00001);
172 current_cash -= 2528;
173 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
174 BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
176 BOOST_CHECK(tr_list[3].stock == stk);
177 BOOST_CHECK(tr_list[3].datetime == Datetime(200001100000LL));
178 BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
179 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 27.25) < 0.00001);
180 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 27.25) < 0.00001);
181 BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
182 BOOST_CHECK(tr_list[3].number == 200);
183 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
184 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 26.98) < 0.00001);
185 current_cash += 2725*2;
186 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
187 BOOST_CHECK(tr_list[3].from == PART_ENVIRONMENT);
191 sys->setParam<
bool>(
"delay",
false);
192 sys->setParam<
bool>(
"ev_open_position",
true);
193 sys->setParam<
bool>(
"cn_open_position",
false);
194 sys->setTM(tm->clone());
195 sys->setSG(sg->clone());
196 sys->setMM(mm->clone());
200 BOOST_CHECK(sys->readyForRun() ==
true);
201 sys->run(stk, query);
202 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
203 tr_list = sys->getTM()->getTradeList();
204 BOOST_CHECK(tr_list.size() == 4);
205 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
207 BOOST_CHECK(tr_list[1].stock == stk);
208 BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
209 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
210 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
211 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
212 BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
213 BOOST_CHECK(tr_list[1].number == 100);
214 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
215 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 0.0) < 0.00001);
216 current_cash = init_cash - 2557;
217 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
218 BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
220 BOOST_CHECK(tr_list[2].stock == stk);
221 BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
222 BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
223 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
224 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
225 BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
226 BOOST_CHECK(tr_list[2].number == 100);
227 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
228 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 0) < 0.00001);
229 current_cash -= 2528;
230 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
231 BOOST_CHECK(tr_list[2].from == PART_SIGNAL);
233 BOOST_CHECK(tr_list[3].stock == stk);
234 BOOST_CHECK(tr_list[3].datetime == Datetime(200001070000LL));
235 BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
236 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 26.90) < 0.00001);
237 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 26.90) < 0.00001);
238 BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
239 BOOST_CHECK(tr_list[3].number == 200);
240 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
241 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 0) < 0.00001);
242 current_cash += 2690*2;
243 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
244 BOOST_CHECK(tr_list[3].from == PART_CONDITION);
248 sys->setParam<
bool>(
"delay",
false);
249 sys->setParam<
bool>(
"ev_open_position",
true);
250 sys->setParam<
bool>(
"cn_open_position",
true);
251 sys->setTM(tm->clone());
252 sys->setSG(sg->clone());
253 sys->setMM(mm->clone());
257 BOOST_CHECK(sys->readyForRun() ==
true);
258 sys->run(stk, query);
259 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
260 tr_list = sys->getTM()->getTradeList();
261 BOOST_CHECK(tr_list.size() == 4);
262 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
264 BOOST_CHECK(tr_list[1].stock == stk);
265 BOOST_CHECK(tr_list[1].datetime == Datetime(200001040000LL));
266 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
267 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 25.57) < 0.00001);
268 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 25.57) < 0.00001);
269 BOOST_CHECK(tr_list[1].goalPrice == Null<price_t>());
270 BOOST_CHECK(tr_list[1].number == 100);
271 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
272 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 0) < 0.00001);
273 current_cash = init_cash - 2557;
274 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
275 BOOST_CHECK(tr_list[1].from == PART_ENVIRONMENT);
277 BOOST_CHECK(tr_list[2].stock == stk);
278 BOOST_CHECK(tr_list[2].datetime == Datetime(200001050000LL));
279 BOOST_CHECK(tr_list[2].business == BUSINESS_BUY);
280 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 25.28) < 0.00001);
281 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 25.28) < 0.00001);
282 BOOST_CHECK(tr_list[2].goalPrice == Null<price_t>());
283 BOOST_CHECK(tr_list[2].number == 100);
284 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
285 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 0) < 0.00001);
286 current_cash -= 2528;
287 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
288 BOOST_CHECK(tr_list[2].from == PART_CONDITION);
290 BOOST_CHECK(tr_list[3].stock == stk);
291 BOOST_CHECK(tr_list[3].datetime == Datetime(200001070000LL));
292 BOOST_CHECK(tr_list[3].business == BUSINESS_SELL);
293 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 26.90) < 0.00001);
294 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 26.90) < 0.00001);
295 BOOST_CHECK(tr_list[3].goalPrice == Null<price_t>());
296 BOOST_CHECK(tr_list[3].number == 200);
297 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
298 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 0) < 0.00001);
299 current_cash += 2690*2;
300 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
301 BOOST_CHECK(tr_list[3].from == PART_CONDITION);
BOOST_AUTO_TEST_CASE(test_SYS_Simple_for_cn)