From 2e0ed3a1c624608bbd694bb471093504d1bbc8ca Mon Sep 17 00:00:00 2001 From: fasiondog Date: Sun, 23 Feb 2025 16:24:16 +0800 Subject: [PATCH] =?UTF-8?q?fixed=20=E8=B6=85=E8=BF=872=E4=B8=AASG=E8=BF=90?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp | 6 ++++-- hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.h | 8 +------- .../trade_sys/signal/imp/logic/OperatorSignal.cpp | 15 ++++----------- .../trade_sys/signal/imp/logic/OperatorSignal.h | 3 ++- .../hikyuu/trade_sys/signal/test_SG_OneSide.cpp | 1 + 5 files changed, 12 insertions(+), 21 deletions(-) diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp index f390d3433..3f1e977ab 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp @@ -81,9 +81,11 @@ void SignalBase::setTO(const KData& kdata) { bool cycle = getParam("cycle"); m_cycle_start = kdata[0].datetime; - if (m_ignore_cycle || !cycle) { + if (!cycle) { _calculate(kdata); } + + m_calculated = true; } void SignalBase::reset() { @@ -98,7 +100,7 @@ void SignalBase::reset() { } void SignalBase::startCycle(const Datetime& start, const Datetime& close) { - HKU_IF_RETURN(!m_ignore_cycle && !getParam("cycle"), void()); + HKU_IF_RETURN(!getParam("cycle"), void()); HKU_CHECK(start != Null() && close != Null() && start < close, "{}", m_name); HKU_CHECK(start >= m_cycle_end || m_cycle_end == Null(), diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.h b/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.h index 8448e040d..21056461d 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.h +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.h @@ -107,9 +107,6 @@ class HKU_API SignalBase : public enable_shared_from_this { 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(); @@ -146,13 +143,12 @@ class HKU_API SignalBase : public enable_shared_from_this { /* 空头持仓 */ bool m_hold_short; - // 用 map 保存,以便获取是能保持顺序 + // 用 map 保存,以便获取时能保持顺序 std::map m_buySig; std::map m_sellSig; Datetime m_cycle_start; Datetime m_cycle_end; - bool m_ignore_cycle{false}; // 特殊用途,用于 OperatorSignal //============================================ // 序列化支持 @@ -168,7 +164,6 @@ class HKU_API SignalBase : public enable_shared_from_this { 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); @@ -182,7 +177,6 @@ class HKU_API SignalBase : public enable_shared_from_this { 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); diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.cpp index 2ecd7e4ca..55cc15174 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.cpp @@ -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(); } @@ -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("cycle"); - if (m_kdata == kdata && !cycle) { - sg->_calculate(kdata); - } else if (m_kdata != Null() && m_kdata != kdata && cycle) { + if (cycle) { sg->startCycle(m_cycle_start, m_cycle_end); - sg->_calculate(kdata); } + sg->_calculate(kdata); } SignalPtr OperatorSignal::_clone() { diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.h b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.h index a89b2da17..fbe2a7c28 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.h +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/logic/OperatorSignal.h @@ -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 {} diff --git a/hikyuu_cpp/unit_test/hikyuu/trade_sys/signal/test_SG_OneSide.cpp b/hikyuu_cpp/unit_test/hikyuu/trade_sys/signal/test_SG_OneSide.cpp index d8d7dd1de..455e38bf4 100644 --- a/hikyuu_cpp/unit_test/hikyuu/trade_sys/signal/test_SG_OneSide.cpp +++ b/hikyuu_cpp/unit_test/hikyuu/trade_sys/signal/test_SG_OneSide.cpp @@ -74,6 +74,7 @@ TEST_CASE("test_SG_OneSide") { /** @arg 单边买入 + 单边卖出 */ sg = sg_buy + sg_sell; + sg->setParam("alternate", true); sg->setTO(k); auto sg_expect = SG_Bool(CLOSE() > REF(CLOSE(), 1), CLOSE() < REF(CLOSE(), 1)); sg_expect->setTO(k);