10 #include <boost/test/unit_test.hpp> 12 #define BOOST_TEST_MODULE test_hikyuu_trade_sys_suite 13 #include <boost/test/unit_test.hpp> 16 #include <hikyuu/StockManager.h> 17 #include <hikyuu/trade_manage/crt/crtTM.h> 18 #include <hikyuu/trade_sys/system/crt/SYS_Simple.h> 19 #include <hikyuu/trade_sys/selector/crt/SE_Fixed.h> 20 #include <hikyuu/trade_sys/allocatefunds/crt/AF_EqualWeight.h> 32 StockManager& sm = StockManager::instance();
34 SEPtr se = SE_Fixed();
35 AFPtr af = AF_EqualWeight();
36 TMPtr tm = crtTM(Datetime(200101010000L), 100000);
37 TMPtr subtm = crtTM(Datetime(200101010000L), 0);
38 SYSPtr sys = SYS_Simple(subtm->clone());
43 SystemWeightList sw_list;
46 af->setParam<
bool>(
"adjust_hold_sys",
false);
49 af->setParam<
bool>(
"adjust_hold_sys",
false);
50 af->setParam<
int>(
"max_sys_num", 1);
53 sys->setTM(subtm->clone());
54 se->addStock(sm[
"sh600000"], sys);
55 se_list = se->getSelectedSystemList(Datetime(201802100000L));
56 BOOST_CHECK(se_list.size() == 1);
57 BOOST_CHECK(hold_list.size() == 0);
58 BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
60 sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
61 ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
62 BOOST_CHECK(sw_list.size() == 1);
63 BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm[
"sh600000"]);
64 BOOST_CHECK(sw_list[0].getWeight() == 1);
65 BOOST_CHECK(se_list[0]->getTM()->currentCash() == 100000);
66 BOOST_CHECK(tm->currentCash() == 0);
67 BOOST_CHECK(ac_list.size() == 1);
68 BOOST_CHECK(ac_list[0] == sw_list[0].getSYS());
71 af->setParam<
int>(
"max_sys_num", 1);
74 sys->setTM(subtm->clone());
75 se->addStock(sm[
"sh600000"], sys);
76 se->addStock(sm[
"sh600004"], sys);
77 se_list = se->getSelectedSystemList(Datetime(201802100000L));
78 BOOST_CHECK(se_list.size() > af->getParam<
int>(
"max_sys_num"));
79 BOOST_CHECK(hold_list.size() == 0);
80 BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
81 BOOST_CHECK(se_list[1]->getTM()->currentCash() == 0);
82 BOOST_CHECK(tm->currentCash() == 100000);
84 sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
85 ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
86 BOOST_CHECK(sw_list.size() == 2);
87 BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm[
"sh600000"]);
88 BOOST_CHECK(sw_list[0].getWeight() == 1);
89 BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
90 BOOST_CHECK(tm->currentCash() == 0);
91 BOOST_CHECK(ac_list.size() == 1);
92 BOOST_CHECK(ac_list[0] == sw_list[1].getSYS());
93 BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 100000);
96 af->setParam<
int>(
"max_sys_num", 2);
99 sys->setTM(subtm->clone());
100 se->addStock(sm[
"sh600000"], sys);
101 se_list = se->getSelectedSystemList(Datetime(201802100000L));
103 se->addStock(sm[
"sh600004"], sys);
104 se->addStock(sm[
"sz000001"], sys);
105 hold_list = se->getSelectedSystemList(Datetime(201802100000L));
106 BOOST_CHECK(se_list.size() != 0);
107 BOOST_CHECK(hold_list.size() == af->getParam<
int>(
"max_sys_num"));
108 BOOST_CHECK(tm->currentCash() == 100000);
110 sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
111 ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
112 BOOST_CHECK(sw_list.size() == 1);
113 BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm[
"sh600000"]);
114 BOOST_CHECK(sw_list[0].getWeight() == 1);
115 BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
116 BOOST_CHECK(tm->currentCash() == 100000);
117 BOOST_CHECK(ac_list.size() == 2);
118 BOOST_CHECK(ac_list[0]->getStock() == sm[
"sh600004"]);
119 BOOST_CHECK(ac_list[1]->getStock() == sm[
"sz000001"]);
120 BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 0);
121 BOOST_CHECK(ac_list[1]->getTM()->currentCash() == 0);
124 af->setParam<
int>(
"max_sys_num", 1);
127 sys->setTM(subtm->clone());
128 se->addStock(sm[
"sh600000"], sys);
129 se_list = se->getSelectedSystemList(Datetime(201802100000L));
131 se->addStock(sm[
"sh600004"], sys);
132 se->addStock(sm[
"sz000001"], sys);
133 hold_list = se->getSelectedSystemList(Datetime(201802100000L));
134 BOOST_CHECK(se_list.size() != 0);
135 BOOST_CHECK(hold_list.size() > af->getParam<
int>(
"max_sys_num"));
136 BOOST_CHECK(tm->currentCash() == 100000);
137 BOOST_CHECK(hold_list[0]->getTM()->currentCash() == 0);
138 BOOST_CHECK(hold_list[1]->getTM()->currentCash() == 0);
140 sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
141 ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
142 BOOST_CHECK(sw_list.size() == 1);
143 BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm[
"sh600000"]);
144 BOOST_CHECK(sw_list[0].getWeight() == 1);
145 BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
146 BOOST_CHECK(tm->currentCash() == 100000);
147 BOOST_CHECK(ac_list.size() == 2);
148 BOOST_CHECK(ac_list[0]->getStock() == sm[
"sh600004"]);
149 BOOST_CHECK(ac_list[1]->getStock() == sm[
"sz000001"]);
150 BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 0);
151 BOOST_CHECK(ac_list[1]->getTM()->currentCash() == 0);
154 af->setParam<
int>(
"max_sys_num", 4);
157 sys->setTM(subtm->clone());
158 se->addStock(sm[
"sh600000"], sys);
159 se->addStock(sm[
"sh600005"], sys);
160 se->addStock(sm[
"sz000002"], sys);
161 se->addStock(sm[
"sz000004"], sys);
162 se->addStock(sm[
"sz000005"], sys);
163 se_list = se->getSelectedSystemList(Datetime(201802100000L));
165 se->addStock(sm[
"sh600004"], sys);
166 se->addStock(sm[
"sz000001"], sys);
167 hold_list = se->getSelectedSystemList(Datetime(201802100000L));
168 BOOST_CHECK(se_list.size() != 0);
169 BOOST_CHECK(hold_list.size() < af->getParam<
int>(
"max_sys_num"));
170 BOOST_CHECK(tm->currentCash() == 100000);
171 BOOST_CHECK(hold_list[0]->getTM()->currentCash() == 0);
172 BOOST_CHECK(hold_list[1]->getTM()->currentCash() == 0);
174 sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
175 ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
176 BOOST_CHECK(sw_list.size() == 5);
177 BOOST_CHECK(tm->currentCash() == 0);
178 BOOST_CHECK(ac_list.size() == 4);
179 std::set<Stock> stk_set;
181 for (
auto iter = ac_list.begin(); iter != ac_list.end(); ++iter) {
182 stk_set.insert((*iter)->getStock());
184 BOOST_CHECK(stk_set.find(sm[
"sh600004"]) != stk_set.end());
185 BOOST_CHECK(stk_set.find(sm[
"sz000001"]) != stk_set.end());
186 BOOST_CHECK(ac_list[0] == hold_list[0]);
187 BOOST_CHECK(ac_list[1] == hold_list[1]);
188 BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 0);
189 BOOST_CHECK(ac_list[1]->getTM()->currentCash() == 0);
BOOST_AUTO_TEST_CASE(test_AF_EqualWeight_not_adjust_hold)