Skip to content

Commit

Permalink
fixed 超过2个SG运算
Browse files Browse the repository at this point in the history
  • Loading branch information
fasiondog committed Feb 23, 2025
1 parent 6cc3fb0 commit 2e0ed3a
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 21 deletions.
6 changes: 4 additions & 2 deletions hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,11 @@ void SignalBase::setTO(const KData& kdata) {
bool cycle = getParam<bool>("cycle");
m_cycle_start = kdata[0].datetime;

if (m_ignore_cycle || !cycle) {
if (!cycle) {
_calculate(kdata);
}

m_calculated = true;
}

void SignalBase::reset() {
Expand All @@ -98,7 +100,7 @@ void SignalBase::reset() {
}

void SignalBase::startCycle(const Datetime& start, const Datetime& close) {
HKU_IF_RETURN(!m_ignore_cycle && !getParam<bool>("cycle"), void());
HKU_IF_RETURN(!getParam<bool>("cycle"), void());
HKU_CHECK(start != Null<Datetime>() && close != Null<Datetime>() && start < close, "{}",
m_name);
HKU_CHECK(start >= m_cycle_end || m_cycle_end == Null<Datetime>(),
Expand Down
8 changes: 1 addition & 7 deletions hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,6 @@ class HKU_API SignalBase : public enable_shared_from_this<SignalBase> {
void startCycle(const Datetime& start, const Datetime& end);
const Datetime& getCycleStart() const;
const Datetime& getCycleEnd() const;
bool ignoreCycle() const {
return m_ignore_cycle;
}

/** 复位操作 */
void reset();
Expand Down Expand Up @@ -146,13 +143,12 @@ class HKU_API SignalBase : public enable_shared_from_this<SignalBase> {
/* 空头持仓 */
bool m_hold_short;

// 用 map 保存,以便获取是能保持顺序
// 用 map 保存,以便获取时能保持顺序
std::map<Datetime, double> m_buySig;
std::map<Datetime, double> m_sellSig;

Datetime m_cycle_start;
Datetime m_cycle_end;
bool m_ignore_cycle{false}; // 特殊用途,用于 OperatorSignal

//============================================
// 序列化支持
Expand All @@ -168,7 +164,6 @@ class HKU_API SignalBase : public enable_shared_from_this<SignalBase> {
ar& BOOST_SERIALIZATION_NVP(m_hold_short);
ar& BOOST_SERIALIZATION_NVP(m_buySig);
ar& BOOST_SERIALIZATION_NVP(m_sellSig);
ar& BOOST_SERIALIZATION_NVP(m_ignore_cycle);
// m_kdata都是系统运行时临时设置,不需要序列化
// ar & BOOST_SERIALIZATION_NVP(m_kdata);
// ar & BOOST_SERIALIZATION_NVP(m_calculated);
Expand All @@ -182,7 +177,6 @@ class HKU_API SignalBase : public enable_shared_from_this<SignalBase> {
ar& BOOST_SERIALIZATION_NVP(m_hold_short);
ar& BOOST_SERIALIZATION_NVP(m_buySig);
ar& BOOST_SERIALIZATION_NVP(m_sellSig);
ar& BOOST_SERIALIZATION_NVP(m_ignore_cycle);
// m_kdata都是系统运行时临时设置,不需要序列化
// ar & BOOST_SERIALIZATION_NVP(m_kdata);
// ar & BOOST_SERIALIZATION_NVP(m_calculated);
Expand Down
15 changes: 4 additions & 11 deletions hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,11 @@ BOOST_CLASS_EXPORT(hku::OperatorSignal)

namespace hku {

OperatorSignal::OperatorSignal() : SignalBase("SG_Operator") {
m_ignore_cycle = true;
}
OperatorSignal::OperatorSignal(const string& name) : SignalBase(name) {
m_ignore_cycle = true;
}
OperatorSignal::OperatorSignal() : SignalBase("SG_Operator") {}
OperatorSignal::OperatorSignal(const string& name) : SignalBase(name) {}

OperatorSignal::OperatorSignal(const string& name, const SignalPtr& sg1, const SignalPtr& sg2)
: SignalBase(name) {
m_ignore_cycle = true;
if (sg1) {
m_sg1 = sg1->clone();
}
Expand All @@ -45,12 +40,10 @@ void OperatorSignal::_reset() {
void OperatorSignal::sub_sg_calculate(SignalPtr& sg, const KData& kdata) {
HKU_IF_RETURN(!sg, void());
bool cycle = sg->getParam<bool>("cycle");
if (m_kdata == kdata && !cycle) {
sg->_calculate(kdata);
} else if (m_kdata != Null<KData>() && m_kdata != kdata && cycle) {
if (cycle) {
sg->startCycle(m_cycle_start, m_cycle_end);
sg->_calculate(kdata);
}
sg->_calculate(kdata);
}

SignalPtr OperatorSignal::_clone() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ class OperatorSignal : public SignalBase {
OperatorSignal(const string& name, const SignalPtr& sg1, const SignalPtr& sg2);
virtual ~OperatorSignal();

virtual void _reset() override;
virtual void _reset() override final;

virtual SignalPtr _clone() override;
virtual void _calculate(const KData& kdata) override {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ TEST_CASE("test_SG_OneSide") {

/** @arg 单边买入 + 单边卖出 */
sg = sg_buy + sg_sell;
sg->setParam<bool>("alternate", true);
sg->setTO(k);
auto sg_expect = SG_Bool(CLOSE() > REF(CLOSE(), 1), CLOSE() < REF(CLOSE(), 1));
sg_expect->setTO(k);
Expand Down

0 comments on commit 2e0ed3a

Please sign in to comment.