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> 25 #include <hikyuu/trade_sys/profitgoal/crt/PG_FixedPercent.h> 38 TradeRecordList tr_list;
41 StockManager& sm = StockManager::instance();
44 Datetime init_date(199001010000LL);
45 price_t init_cash = 100000;
46 TradeCostPtr costfunc = TC_Zero();
47 Stock stk = sm[
"sh600000"];
48 Datetime start_date(199911100000LL);
49 Datetime end_date(200002250000LL);
51 KQuery query = KQueryByDate(start_date, end_date, KQuery::DAY);
54 TMPtr tm = crtTM(init_date, init_cash, costfunc,
"TEST_TM");
55 SGPtr sg = SG_Cross(OP(MA(5)), OP(MA(10)),
"CLOSE");
56 MMPtr mm = MM_FixedCount(100);
57 STPtr st = ST_FixedPercent(0.01);
58 TPPtr tp = ST_Indicator(OP(MA(5)),
"CLOSE");
59 PGPtr pg = PG_FixedPercent(0.01);
64 sys->setParam(
"delay",
false);
65 sys->setTM(tm->clone());
66 sys->setSG(sg->clone());
67 sys->setMM(mm->clone());
68 sys->setST(st->clone());
69 sys->setTP(tp->clone());
70 sys->setPG(pg->clone());
71 BOOST_CHECK(sys->readyForRun() ==
true);
73 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
74 tr_list = sys->getTM()->getTradeList();
75 BOOST_CHECK(tr_list.size() != 1);
76 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
78 BOOST_CHECK(tr_list[1].stock == stk);
79 BOOST_CHECK(tr_list[1].datetime == Datetime(199912150000LL));
80 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
81 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 26.45) < 0.00001);
82 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 26.45) < 0.00001);
83 BOOST_CHECK(std::fabs(tr_list[1].goalPrice - 26.45*1.01) < 0.00001);
84 BOOST_CHECK(tr_list[1].number == 100);
85 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
86 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 26.19) < 0.00001);
87 current_cash = init_cash - 2645;
88 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
89 BOOST_CHECK(tr_list[1].from == PART_SIGNAL);
91 BOOST_CHECK(tr_list[2].stock == stk);
92 BOOST_CHECK(tr_list[2].datetime == Datetime(199912160000LL));
93 BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
94 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 26.00) < 0.00001);
95 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 26.00) < 0.00001);
97 BOOST_CHECK(tr_list[2].number == 100);
98 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
99 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.74) < 0.00001);
100 current_cash += 2600;
101 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
102 BOOST_CHECK(tr_list[2].from == PART_STOPLOSS);
104 BOOST_CHECK(tr_list[3].stock == stk);
105 BOOST_CHECK(tr_list[3].datetime == Datetime(200001050000LL));
106 BOOST_CHECK(tr_list[3].business == BUSINESS_BUY);
107 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 25.28) < 0.00001);
108 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 25.28) < 0.00001);
109 BOOST_CHECK(std::fabs(tr_list[3].goalPrice - 25.28*1.01) < 0.00001);
110 BOOST_CHECK(tr_list[3].number == 100);
111 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
112 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 25.03) < 0.00001);
113 current_cash -= 2528;
114 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
115 BOOST_CHECK(tr_list[3].from == PART_SIGNAL);
117 BOOST_CHECK(tr_list[4].stock == stk);
118 BOOST_CHECK(tr_list[4].datetime == Datetime(200001060000LL));
119 BOOST_CHECK(tr_list[4].business == BUSINESS_SELL);
120 BOOST_CHECK(std::fabs(tr_list[4].planPrice - 25.99) < 0.00001);
121 BOOST_CHECK(std::fabs(tr_list[4].realPrice - 25.99) < 0.00001);
123 BOOST_CHECK(tr_list[4].number == 100);
124 BOOST_CHECK(std::fabs(tr_list[4].cost.total - 0) < 0.00001);
125 BOOST_CHECK(std::fabs(tr_list[4].stoploss - 25.73) < 0.00001);
126 current_cash += 2599;
127 BOOST_CHECK(std::fabs(tr_list[4].cash - current_cash) < 0.00001);
128 BOOST_CHECK(tr_list[4].from == PART_PROFITGOAL);
132 sys->setParam(
"delay",
true);
133 sys->setTM(tm->clone());
134 sys->setSG(sg->clone());
135 sys->setMM(mm->clone());
136 sys->setST(st->clone());
137 sys->setTP(tp->clone());
138 sys->setPG(pg->clone());
139 BOOST_CHECK(sys->readyForRun() ==
true);
140 sys->run(stk, query);
141 BOOST_CHECK(sys->getTM()->currentCash() != init_cash);
142 tr_list = sys->getTM()->getTradeList();
143 BOOST_CHECK(tr_list.size() != 1);
144 BOOST_CHECK(tr_list[0].business == BUSINESS_INIT);
146 BOOST_CHECK(tr_list[1].stock == stk);
147 BOOST_CHECK(tr_list[1].datetime == Datetime(199912160000LL));
148 BOOST_CHECK(tr_list[1].business == BUSINESS_BUY);
149 BOOST_CHECK(std::fabs(tr_list[1].planPrice - 26.50) < 0.00001);
150 BOOST_CHECK(std::fabs(tr_list[1].realPrice - 26.50) < 0.00001);
151 BOOST_CHECK(std::fabs(tr_list[1].goalPrice - 26.50*1.01) < 0.00001);
152 BOOST_CHECK(tr_list[1].number == 100);
153 BOOST_CHECK(std::fabs(tr_list[1].cost.total - 0) < 0.00001);
154 BOOST_CHECK(std::fabs(tr_list[1].stoploss - 26.24) < 0.00001);
155 current_cash = init_cash - 2650;
156 BOOST_CHECK(std::fabs(tr_list[1].cash - current_cash) < 0.00001);
157 BOOST_CHECK(tr_list[1].from == PART_SIGNAL);
159 BOOST_CHECK(tr_list[2].stock == stk);
160 BOOST_CHECK(tr_list[2].datetime == Datetime(199912170000LL));
161 BOOST_CHECK(tr_list[2].business == BUSINESS_SELL);
162 BOOST_CHECK(std::fabs(tr_list[2].planPrice - 26.00) < 0.00001);
163 BOOST_CHECK(std::fabs(tr_list[2].realPrice - 26.00) < 0.00001);
165 BOOST_CHECK(tr_list[2].number == 100);
166 BOOST_CHECK(std::fabs(tr_list[2].cost.total - 0) < 0.00001);
167 BOOST_CHECK(std::fabs(tr_list[2].stoploss - 25.74) < 0.00001);
168 current_cash += 2600;
169 BOOST_CHECK(std::fabs(tr_list[2].cash - current_cash) < 0.00001);
170 BOOST_CHECK(tr_list[2].from == PART_STOPLOSS);
172 BOOST_CHECK(tr_list[3].stock == stk);
173 BOOST_CHECK(tr_list[3].datetime == Datetime(200001060000LL));
174 BOOST_CHECK(tr_list[3].business == BUSINESS_BUY);
175 BOOST_CHECK(std::fabs(tr_list[3].planPrice - 25.18) < 0.00001);
176 BOOST_CHECK(std::fabs(tr_list[3].realPrice - 25.18) < 0.00001);
177 BOOST_CHECK(std::fabs(tr_list[3].goalPrice - 25.18*1.01) < 0.00001);
178 BOOST_CHECK(tr_list[3].number == 100);
179 BOOST_CHECK(std::fabs(tr_list[3].cost.total - 0) < 0.00001);
180 BOOST_CHECK(std::fabs(tr_list[3].stoploss - 24.93) < 0.00001);
181 current_cash -= 2518;
182 BOOST_CHECK(std::fabs(tr_list[3].cash - current_cash) < 0.00001);
183 BOOST_CHECK(tr_list[3].from == PART_SIGNAL);
185 BOOST_CHECK(tr_list[4].stock == stk);
186 BOOST_CHECK(tr_list[4].datetime == Datetime(200001070000LL));
187 BOOST_CHECK(tr_list[4].business == BUSINESS_SELL);
188 BOOST_CHECK(std::fabs(tr_list[4].planPrice - 26.30) < 0.00001);
189 BOOST_CHECK(std::fabs(tr_list[4].realPrice - 26.30) < 0.00001);
191 BOOST_CHECK(tr_list[4].number == 100);
192 BOOST_CHECK(std::fabs(tr_list[4].cost.total - 0) < 0.00001);
193 BOOST_CHECK(std::fabs(tr_list[4].stoploss - 26.04) < 0.00001);
194 current_cash += 2630;
195 BOOST_CHECK(std::fabs(tr_list[4].cash - current_cash) < 0.00001);
196 BOOST_CHECK(tr_list[4].from == PART_PROFITGOAL);
BOOST_AUTO_TEST_CASE(test_SYS_Simple_for_pg)