Skip to content

Commit 6fb9e79

Browse files
committed
SG增强,支持逻辑及四则运算
1 parent 9206789 commit 6fb9e79

File tree

9 files changed

+755
-116
lines changed

9 files changed

+755
-116
lines changed

hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp

-66
Original file line numberDiff line numberDiff line change
@@ -195,72 +195,6 @@ void SignalBase::_addSignal(const Datetime& datetime, double value) {
195195
}
196196
}
197197

198-
// void SignalBase::_addBuySignal(const Datetime& datetime, double value) {
199-
// HKU_CHECK(value > 0.0, "value must > 0!");
200-
// HKU_WARN_IF_RETURN(m_sellSig.find(datetime) != m_sellSig.end(), void(),
201-
// "Ignore buy sigal! Conflict with sell signal at {}!", datetime);
202-
203-
// double nvalue = getBuyValue(datetime) + getSellValue(datetime);
204-
// HKU_IF_RETURN(iszero(nvalue), void());
205-
206-
// auto iter = m_buySig.find(datetime);
207-
// if (!getParam<bool>("alternate")) {
208-
// if (iter != m_buySig.end()) {
209-
// iter->second += value;
210-
// } else {
211-
// m_buySig.insert({datetime, value});
212-
// }
213-
// return;
214-
// }
215-
216-
// if (!m_hold_long) {
217-
// if (iter != m_buySig.end()) {
218-
// iter->second += value;
219-
// } else {
220-
// m_buySig.insert({datetime, value});
221-
// }
222-
// if (getParam<bool>("support_borrow_stock") && m_hold_short) {
223-
// m_hold_short = false;
224-
// } else {
225-
// m_hold_long = true;
226-
// }
227-
// }
228-
// }
229-
230-
// void SignalBase::_addSellSignal(const Datetime& datetime, double value) {
231-
// HKU_CHECK(value < 0.0, "value must < 0!");
232-
// HKU_WARN_IF_RETURN(m_buySig.find(datetime) != m_buySig.end(), void(),
233-
// "Ignore sell sigal! Conflict with buy signal at {}!", datetime);
234-
235-
// auto iter = m_sellSig.find(datetime);
236-
// if (!getParam<bool>("alternate")) {
237-
// if (iter != m_sellSig.end()) {
238-
// iter->second += value;
239-
// } else {
240-
// m_sellSig.insert({datetime, value});
241-
// }
242-
// return;
243-
// }
244-
245-
// if (!m_hold_short) {
246-
// if (m_hold_long) {
247-
// if (iter != m_sellSig.end()) {
248-
// iter->second += value;
249-
// } else {
250-
// m_sellSig.insert({datetime, value});
251-
// }
252-
// m_hold_long = false;
253-
// } else if (getParam<bool>("support_borrow_stock")) {
254-
// if (iter != m_sellSig.end()) {
255-
// iter->second += value;
256-
// } else {
257-
// m_sellSig.insert({datetime, value});
258-
// }
259-
// m_hold_short = true;
260-
// }
261-
// }
262-
// }
263-
264198
bool SignalBase::nextTimeShouldBuy() const {
265199
size_t total = m_kdata.size();
266200
HKU_IF_RETURN(total == 0, false);

hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/AddSignal.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,17 @@ void AddSignal::_calculate(const KData& kdata) {
2222
if (m_sg1 && !m_sg2) {
2323
m_sg1->_calculate(kdata);
2424
for (size_t i = 0; i < total; ++i) {
25-
double value = m_sg1->getValue(ks[i].datetime);
26-
_addSignal(ks[i].datetime, value);
25+
_addSignal(ks[i].datetime, m_sg1->getValue(ks[i].datetime));
2726
}
2827
return;
2928
}
3029

3130
if (!m_sg1 && m_sg2) {
3231
m_sg2->_calculate(kdata);
3332
for (size_t i = 0; i < total; i++) {
34-
double value = m_sg2->getValue(ks[i].datetime);
35-
_addSignal(ks[i].datetime, value);
36-
return;
33+
_addSignal(ks[i].datetime, m_sg2->getValue(ks[i].datetime));
3734
}
35+
return;
3836
}
3937

4038
m_sg1->_calculate(kdata);

hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/AddValueSignal.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,16 @@ void AddValueSignal::_calculate(const KData& kdata) {
2525
_addSignal(ks[i].datetime, m_sg->getValue(ks[i].datetime));
2626
}
2727
} else {
28+
HKU_INFO("m_value: {}", m_value);
2829
for (size_t i = 0; i < total; ++i) {
29-
double buy_value = m_sg->getBuyValue(ks[i].datetime) + m_value;
30-
double sell_value = m_sg->getSellValue(ks[i].datetime) - m_value;
30+
double buy_value = m_sg->getBuyValue(ks[i].datetime);
31+
if (buy_value > 0.0) {
32+
buy_value += m_value;
33+
}
34+
double sell_value = m_sg->getSellValue(ks[i].datetime);
35+
if (sell_value < 0.0) {
36+
sell_value -= m_value;
37+
}
3138
_addSignal(ks[i].datetime, buy_value + sell_value);
3239
}
3340
}

hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/DivSignal.cpp

+1-21
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,11 @@ BOOST_CLASS_EXPORT(hku::DivSignal)
1414
namespace hku {
1515

1616
void DivSignal::_calculate(const KData& kdata) {
17-
HKU_IF_RETURN(!m_sg1 && !m_sg2, void());
17+
HKU_IF_RETURN(!m_sg1 || !m_sg2, void());
1818

1919
auto const* ks = kdata.data();
2020
size_t total = kdata.size();
2121

22-
if (m_sg1 && !m_sg2) {
23-
m_sg1->_calculate(kdata);
24-
for (size_t i = 0; i < total; ++i) {
25-
double value = m_sg1->getValue(ks[i].datetime);
26-
_addSignal(ks[i].datetime, value);
27-
}
28-
return;
29-
}
30-
31-
if (!m_sg1 && m_sg2) {
32-
m_sg2->_calculate(kdata);
33-
for (size_t i = 0; i < total; i++) {
34-
double value = m_sg2->getValue(ks[i].datetime);
35-
if (value != 0.0) {
36-
_addSignal(ks[i].datetime, 1.0 / value);
37-
}
38-
return;
39-
}
40-
}
41-
4222
m_sg1->_calculate(kdata);
4323
m_sg2->_calculate(kdata);
4424
for (size_t i = 0; i < total; ++i) {

hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/MulSignal.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void MulSignal::_calculate(const KData& kdata) {
2424
for (size_t i = 0; i < total; ++i) {
2525
double buy_value = m_sg1->getBuyValue(ks[i].datetime) * m_sg2->getBuyValue(ks[i].datetime);
2626
double sell_value =
27-
m_sg1->getSellValue(ks[i].datetime) * m_sg2->getSellValue(ks[i].datetime);
27+
0.0 - m_sg1->getSellValue(ks[i].datetime) * m_sg2->getSellValue(ks[i].datetime);
2828
_addSignal(ks[i].datetime, buy_value + sell_value);
2929
}
3030
}

hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorValueSignal.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ OperatorValueSignal::OperatorValueSignal(const string& name, const SignalPtr& sg
2222
if (sg) {
2323
m_sg = sg->clone();
2424
}
25+
if (std::isnan(m_value)) {
26+
m_value = 0.0;
27+
}
2528
}
2629

2730
OperatorValueSignal::~OperatorValueSignal() {}
2831

2932
void OperatorValueSignal::_reset() {
30-
m_value = 0.0;
3133
if (m_sg) {
3234
m_sg->reset();
3335
}

hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/SubSignal.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ void SubSignal::_calculate(const KData& kdata) {
2222
if (m_sg1 && !m_sg2) {
2323
m_sg1->_calculate(kdata);
2424
for (size_t i = 0; i < total; ++i) {
25-
double value = m_sg1->getValue(ks[i].datetime);
26-
_addSignal(ks[i].datetime, value);
25+
_addSignal(ks[i].datetime, m_sg1->getValue(ks[i].datetime));
2726
}
2827
return;
2928
}
@@ -33,8 +32,8 @@ void SubSignal::_calculate(const KData& kdata) {
3332
for (size_t i = 0; i < total; i++) {
3433
double value = 0.0 - m_sg2->getValue(ks[i].datetime);
3534
_addSignal(ks[i].datetime, value);
36-
return;
3735
}
36+
return;
3837
}
3938

4039
m_sg1->_calculate(kdata);

hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/SubValueSignal.cpp

+17-5
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,33 @@ void SubValueSignal::_calculate(const KData& kdata) {
3030
}
3131
} else {
3232
for (size_t i = 0; i < total; ++i) {
33-
_addSignal(ks[i].datetime, -(m_sg->getValue(ks[i].datetime)));
33+
_addSignal(ks[i].datetime, 0.0 - (m_sg->getValue(ks[i].datetime)));
3434
}
3535
}
3636

3737
} else {
3838
if (m_mode == 0) {
3939
for (size_t i = 0; i < total; ++i) {
40-
double buy_value = m_sg->getBuyValue(ks[i].datetime) - m_value;
41-
double sell_value = m_sg->getSellValue(ks[i].datetime) + m_value;
40+
double buy_value = m_sg->getBuyValue(ks[i].datetime);
41+
if (buy_value > 0.0) {
42+
buy_value -= m_value;
43+
}
44+
double sell_value = m_sg->getSellValue(ks[i].datetime);
45+
if (sell_value < 0.0) {
46+
sell_value -= m_value;
47+
}
4248
_addSignal(ks[i].datetime, buy_value + sell_value);
4349
}
4450
} else {
4551
for (size_t i = 0; i < total; ++i) {
46-
double buy_value = m_value - m_sg->getBuyValue(ks[i].datetime);
47-
double sell_value = m_sg->getSellValue(ks[i].datetime) + m_value;
52+
double buy_value = m_sg->getBuyValue(ks[i].datetime);
53+
if (buy_value > 0.0) {
54+
buy_value = m_value - buy_value;
55+
}
56+
double sell_value = m_sg->getSellValue(ks[i].datetime);
57+
if (sell_value < 0.0) {
58+
sell_value -= sell_value;
59+
}
4860
_addSignal(ks[i].datetime, buy_value + sell_value);
4961
}
5062
}

0 commit comments

Comments
 (0)