From c4b746fc6923643ac8559688f641b4c321a85d52 Mon Sep 17 00:00:00 2001 From: fasiondog Date: Sun, 23 Feb 2025 16:33:53 +0800 Subject: [PATCH] =?UTF-8?q?feat.trade=5Fsys:=20=E6=B7=BB=E5=8A=A0=20SG=5FA?= =?UTF-8?q?dd=20=E7=AD=89=E5=87=BD=E6=95=B0=E9=81=BF=E5=85=8D=20alternate?= =?UTF-8?q?=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 由于 SG 的 alternate 默认为 True, 在使用如 "sg1 + sg2 + sg3" 的形式时,容易忽略 sg1 + sg2 的 alternate 属性,故添加 SG_Add 等函数 建议使用: SG_Add(sg1, sg2, False) + sg3 来避免 alternate 的问题 - 新增 SG_Add、SG_Sub、SG_Mul、SG_Div 函数 - 在 Python 接口中导出新增的函数 - 更新文档说明新函数的使用方法和注意事项 --- .../hikyuu/trade_sys/signal/crt/SG_Logic.h | 29 +++++++++++ hikyuu_pywrap/trade_sys/_Signal.cpp | 50 +++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Logic.h b/hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Logic.h index 0188fc472..428136a03 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Logic.h +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Logic.h @@ -34,4 +34,33 @@ inline SignalPtr operator|(const SignalPtr& sg1, const SignalPtr& sg2) { return sg1 + sg2; } +//------------------------------------------------------------------ +// 由于 SG 的 alternate 默认为 True, 在使用如 "sg1 + sg2 + sg3" +// 的形式时,容易忽略 sg1 + sg2 的 alternate 属性,故添加 SG_Add 等函数 +// 建议使用: SG_Add(sg1, sg2, False) + sg3 来避免 alternate 的问题 +//------------------------------------------------------------------ +inline SignalPtr SG_Add(const SignalPtr& sg1, const SignalPtr& sg2, bool alternate) { + auto sg = sg1 + sg2; + sg->setParam("alternate", alternate); + return sg; +} + +inline SignalPtr SG_Sub(const SignalPtr& sg1, const SignalPtr& sg2, bool alternate) { + auto sg = sg1 - sg2; + sg->setParam("alternate", alternate); + return sg; +} + +inline SignalPtr SG_Mul(const SignalPtr& sg1, const SignalPtr& sg2, bool alternate) { + auto sg = sg1 * sg2; + sg->setParam("alternate", alternate); + return sg; +} + +inline SignalPtr SG_Div(const SignalPtr& sg1, const SignalPtr& sg2, bool alternate) { + auto sg = sg1 / sg2; + sg->setParam("alternate", alternate); + return sg; +} + } // namespace hku \ No newline at end of file diff --git a/hikyuu_pywrap/trade_sys/_Signal.cpp b/hikyuu_pywrap/trade_sys/_Signal.cpp index 2727d93e2..0e2a93e16 100644 --- a/hikyuu_pywrap/trade_sys/_Signal.cpp +++ b/hikyuu_pywrap/trade_sys/_Signal.cpp @@ -269,4 +269,54 @@ void export_Signal(py::module& m) { :param Indicator ind: 输入指标 :return: 信号指示器)"); + + m.def("SG_Add", SG_Add, py::arg("sg1"), py::arg("sg2"), py::arg("alternate"), + R"(SG_Add(sg1, sg2, alternate) + + 生成两个指标之和的信号 + + 由于 SG 的 alternate 默认为 True, 在使用如 "sg1 + sg2 + sg3" 的形式时,容易忽略 sg1 + sg2 的 alternate 属性 + 建议使用: SG_Add(sg1, sg2, False) + sg3 来避免 alternate 的问题 + + :param SignalBase sg1: 输入信号1 + :param SignalBase sg2: 输入信号2 + :param bool alternate: 是否交替买入卖出,默认为True + :return: 信号指示器)"); + + m.def("SG_Sub", SG_Sub, py::arg("sg1"), py::arg("sg2"), py::arg("alternate"), + R"(SG_Sub(sg1, sg2, alternate) + + 生成两个指标之差的信号 + + 由于 SG 的 alternate 默认为 True, 在使用如 "sg1 + sg2 + sg3" 的形式时,容易忽略 sg1 + sg2 的 alternate 属性 + 建议使用: SG_Add(sg1, sg2, False) + sg3 来避免 alternate 的问题 + + :param SignalBase sg1: 输入信号1 + :param SignalBase sg2: 输入信号2 + :param bool alternate: 是否交替买入卖出,默认为True + :return: 信号指示器)"); + + m.def("SG_Mul", SG_Mul, py::arg("sg1"), py::arg("sg2"), py::arg("alternate"), + R"(SG_Mul(sg1, sg2, alternate) + + 生成两个指标之差的信号 + + 由于 SG 的 alternate 默认为 True, 在使用如 "sg1 + sg2 + sg3" 的形式时,容易忽略 sg1 + sg2 的 alternate 属性 + 建议使用: SG_Add(sg1, sg2, False) + sg3 来避免 alternate 的问题 + + :param SignalBase sg1: 输入信号1 + :param SignalBase sg2: 输入信号2 + :param bool alternate: 是否交替买入卖出,默认为True)"); + + m.def("SG_Div", SG_Div, py::arg("sg1"), py::arg("sg2"), py::arg("alternate"), + R"(SG_Div(sg1, sg2, alternate) + + 生成两个指标之差的信号 + + 由于 SG 的 alternate 默认为 True, 在使用如 "sg1 + sg2 + sg3" 的形式时,容易忽略 sg1 + sg2 的 alternate 属性 + 建议使用: SG_Add(sg1, sg2, False) + sg3 来避免 alternate 的问题 + + :param SignalBase sg1: 输入信号1 + :param SignalBase sg2: 输入信号2 + :param bool alternate: 是否交替买入卖出,默认为True)"); }