From 3b45b28b624eecbf5ff1750e71c619db59e9cbd3 Mon Sep 17 00:00:00 2001 From: fasiondog Date: Fri, 2 Feb 2024 09:57:11 +0800 Subject: [PATCH 1/4] update analysis_sys_list --- hikyuu/analysis/__init__.py | 1 + hikyuu/analysis/analysis.py | 15 ++++++++++++++- hikyuu_pywrap/_analysis.cpp | 25 ++++++++++++++++--------- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/hikyuu/analysis/__init__.py b/hikyuu/analysis/__init__.py index 53030e2ae..48834c378 100644 --- a/hikyuu/analysis/__init__.py +++ b/hikyuu/analysis/__init__.py @@ -9,4 +9,5 @@ __all__ = [ 'combinate_ind_analysis', 'combinate_ind_analysis_multi', + 'analysis_sys_list', ] diff --git a/hikyuu/analysis/analysis.py b/hikyuu/analysis/analysis.py index ccabd69fb..bc483184b 100644 --- a/hikyuu/analysis/analysis.py +++ b/hikyuu/analysis/analysis.py @@ -5,7 +5,7 @@ # Author: fasiondog import pandas as pd -from hikyuu.core import Block, Performance, inner_combinate_ind_analysis, inner_combinate_ind_analysis_with_block +from hikyuu.core import * def combinate_ind_analysis( @@ -92,3 +92,16 @@ def combinate_ind_analysis_multi( for name in names: ret[name] = out[name] return pd.DataFrame(ret) + + +def analysis_sys_list(stks, query, sys_proto, keys=["累计投入本金", "当前总资产", "现金余额", "未平仓头寸净值", "赢利交易比例%", "赢利交易数", "亏损交易数"]): + out = inner_analysis_sys_list(stks, query, sys_proto) + if not keys: + ret = out + else: + ret = {} + names = ["证券代码", "证券名称"] + names.extend(keys) + for name in names: + ret[name] = out[name] + return pd.DataFrame(ret) diff --git a/hikyuu_pywrap/_analysis.cpp b/hikyuu_pywrap/_analysis.cpp index eb3516aed..bd044f2f4 100644 --- a/hikyuu_pywrap/_analysis.cpp +++ b/hikyuu_pywrap/_analysis.cpp @@ -110,7 +110,7 @@ static py::dict combinate_ind_analysis_with_block(const Block& blk, const KQuery return result; } -static py::list analysis_sys_list(const py::object& pystk_list, const KQuery& query, +static py::dict analysis_sys_list(const py::object& pystk_list, const KQuery& query, SystemPtr sys_proto) { SystemList sys_list; StockList stk_list; @@ -141,16 +141,23 @@ static py::list analysis_sys_list(const py::object& pystk_list, const KQuery& qu records = analysisSystemList(sys_list, stk_list, query); } - py::list result; + Performance per; + auto keys = per.names(); + std::vector tmp(keys.size() + 2); for (size_t i = 0, total = records.size(); i < total; i++) { const auto& record = records[i]; - py::list tmp; - tmp.append(record.market_code); - tmp.append(record.name); - for (const auto& value : record.values) { - tmp.append(value); + tmp[0].append(record.market_code); + tmp[1].append(record.name); + for (size_t j = 0, len = keys.size(); j < len; j++) { + tmp[j + 2].append(record.values[j]); } - result.append(tmp); + } + + py::dict result; + result["证券代码"] = tmp[0]; + result["证券名称"] = tmp[1]; + for (size_t i = 0, total = keys.size(); i < total; i++) { + result[keys[i].c_str()] = tmp[i + 2]; } return result; } @@ -178,5 +185,5 @@ void export_analysis(py::module& m) { m.def("inner_combinate_ind_analysis", combinate_ind_analysis); m.def("inner_combinate_ind_analysis_with_block", combinate_ind_analysis_with_block); - m.def("analysis_sys_list", analysis_sys_list); + m.def("inner_analysis_sys_list", analysis_sys_list); } \ No newline at end of file From 6481a51043dbc9a7b2d6b25930722218372af959 Mon Sep 17 00:00:00 2001 From: fasiondog Date: Fri, 2 Feb 2024 11:19:36 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fixed=20add=5Foptions("stacktrace")=20?= =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hikyuu_cpp/hikyuu/xmake.lua | 2 +- hikyuu_pywrap/xmake.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hikyuu_cpp/hikyuu/xmake.lua b/hikyuu_cpp/hikyuu/xmake.lua index 6c8041457..e7974f3e2 100644 --- a/hikyuu_cpp/hikyuu/xmake.lua +++ b/hikyuu_cpp/hikyuu/xmake.lua @@ -7,7 +7,7 @@ target("hikyuu") -- set_kind("shared") -- end - add_options("hdf5", "mysql", "sqlite", "tdx", "feedback", "stackstrace") + add_options("hdf5", "mysql", "sqlite", "tdx", "feedback", "stacktrace") add_packages("boost", "fmt", "spdlog", "flatbuffers", "nng", "nlohmann_json", "cpp-httplib") if is_plat("windows", "linux", "cross") then diff --git a/hikyuu_pywrap/xmake.lua b/hikyuu_pywrap/xmake.lua index fd9152c64..c4ddc0a63 100644 --- a/hikyuu_pywrap/xmake.lua +++ b/hikyuu_pywrap/xmake.lua @@ -9,7 +9,7 @@ target("core") -- --set_enable(false) --set_enable(false)会彻底禁用这个target,连target的meta也不会被加载,vcproj不会保留它 -- end - add_options("stackstrace") + add_options("stacktrace") add_deps("hikyuu") add_packages("boost", "fmt", "spdlog", "flatbuffers", "pybind11", "cpp-httplib") From a65bd1beee75e6c1cbe8c7f6be4fae5759707869 Mon Sep 17 00:00:00 2001 From: fasiondog Date: Fri, 2 Feb 2024 13:19:10 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fixed=20=E7=BB=84=E4=BB=B6=20indicator=20?= =?UTF-8?q?=E6=88=90=E5=91=98=E6=9C=AA=20clone=20=E5=BC=95=E8=B5=B7?= =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E6=97=B6=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hikyuu_cpp/hikyuu/analysis/analysis_sys.h | 8 +++++--- .../hikyuu/trade_sys/condition/imp/BoolCondition.cpp | 4 ++-- .../hikyuu/trade_sys/condition/imp/OPLineCondition.cpp | 2 +- .../trade_sys/environment/imp/TwoLineEnvironment.cpp | 4 ++-- hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal.cpp | 2 +- hikyuu_cpp/hikyuu/trade_sys/signal/imp/BoolSignal.cpp | 4 ++-- .../hikyuu/trade_sys/signal/imp/CrossGoldSignal.cpp | 4 ++-- hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossSignal.cpp | 4 ++-- hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal.cpp | 2 +- hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal2.cpp | 2 +- .../hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.cpp | 2 +- hikyuu_pywrap/_analysis.cpp | 7 ++++++- 12 files changed, 26 insertions(+), 19 deletions(-) diff --git a/hikyuu_cpp/hikyuu/analysis/analysis_sys.h b/hikyuu_cpp/hikyuu/analysis/analysis_sys.h index 1b46f9d4b..ecbd2932e 100644 --- a/hikyuu_cpp/hikyuu/analysis/analysis_sys.h +++ b/hikyuu_cpp/hikyuu/analysis/analysis_sys.h @@ -9,7 +9,7 @@ #include "hikyuu/trade_sys/system/System.h" #include "hikyuu/trade_manage/Performance.h" -#include "hikyuu/utilities/thread/MQStealThreadPool.h" +#include "hikyuu/utilities/thread/thread.h" namespace hku { @@ -49,8 +49,10 @@ inline vector analysisSystemListWith(const Container SystemList sys_list; StockList stk_list; for (const auto& stk : blk) { - sys_list.emplace_back(std::move(sys_proto->clone())); - stk_list.emplace_back(stk); + if (!stk.isNull()) { + sys_list.emplace_back(std::move(sys_proto->clone())); + stk_list.emplace_back(stk); + } } result = analysisSystemList(sys_list, stk_list, query); diff --git a/hikyuu_cpp/hikyuu/trade_sys/condition/imp/BoolCondition.cpp b/hikyuu_cpp/hikyuu/trade_sys/condition/imp/BoolCondition.cpp index 1135951e8..e4247256f 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/condition/imp/BoolCondition.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/condition/imp/BoolCondition.cpp @@ -20,14 +20,14 @@ BoolCondition::BoolCondition(const Indicator& ind) : ConditionBase("CN_Bool"), m BoolCondition::~BoolCondition() {} ConditionPtr BoolCondition::_clone() { - return make_shared(m_ind); + return make_shared(m_ind.clone()); } void BoolCondition::_calculate() { auto ds = m_kdata.getDatetimeList(); m_ind.setContext(m_kdata); for (size_t i = m_ind.discard(), len = m_ind.size(); i < len; i++) { - if (m_ind[i] > 0.) { + if (!std::isnan(m_ind[i]) && m_ind[i] > 0.) { _addValid(ds[i]); } } diff --git a/hikyuu_cpp/hikyuu/trade_sys/condition/imp/OPLineCondition.cpp b/hikyuu_cpp/hikyuu/trade_sys/condition/imp/OPLineCondition.cpp index e9917b306..f763130e1 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/condition/imp/OPLineCondition.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/condition/imp/OPLineCondition.cpp @@ -25,7 +25,7 @@ OPLineCondition::OPLineCondition(const Indicator& op) : ConditionBase("CN_OPLine OPLineCondition::~OPLineCondition() {} ConditionPtr OPLineCondition::_clone() { - return make_shared(m_op); + return make_shared(m_op.clone()); } void OPLineCondition::_calculate() { diff --git a/hikyuu_cpp/hikyuu/trade_sys/environment/imp/TwoLineEnvironment.cpp b/hikyuu_cpp/hikyuu/trade_sys/environment/imp/TwoLineEnvironment.cpp index 45a74adef..71ac9ac7c 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/environment/imp/TwoLineEnvironment.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/environment/imp/TwoLineEnvironment.cpp @@ -28,8 +28,8 @@ TwoLineEnvironment::~TwoLineEnvironment() {} EnvironmentPtr TwoLineEnvironment::_clone() { TwoLineEnvironment* ptr = new TwoLineEnvironment; - ptr->m_fast = m_fast; - ptr->m_slow = m_slow; + ptr->m_fast = m_fast.clone(); + ptr->m_slow = m_slow.clone(); return EnvironmentPtr(ptr); } diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal.cpp index 1e74a1cb8..c8bdb0f3e 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal.cpp @@ -26,7 +26,7 @@ SignalPtr BandSignal::_clone() { BandSignal* p = new BandSignal(); p->m_upper = m_upper; p->m_lower = m_lower; - p->m_ind = m_ind; + p->m_ind = m_ind.clone(); return SignalPtr(p); } diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BoolSignal.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BoolSignal.cpp index 021672736..a617411fb 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BoolSignal.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/BoolSignal.cpp @@ -23,8 +23,8 @@ BoolSignal::~BoolSignal() {} SignalPtr BoolSignal::_clone() { BoolSignal* p = new BoolSignal(); - p->m_bool_buy = m_bool_buy; - p->m_bool_sell = m_bool_sell; + p->m_bool_buy = m_bool_buy.clone(); + p->m_bool_sell = m_bool_sell.clone(); return SignalPtr(p); } diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossGoldSignal.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossGoldSignal.cpp index 6b62df8fa..ba7477d22 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossGoldSignal.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossGoldSignal.cpp @@ -23,8 +23,8 @@ CrossGoldSignal::~CrossGoldSignal() {} SignalPtr CrossGoldSignal::_clone() { CrossGoldSignal* p = new CrossGoldSignal(); - p->m_fast = m_fast; - p->m_slow = m_slow; + p->m_fast = m_fast.clone(); + p->m_slow = m_slow.clone(); return SignalPtr(p); } diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossSignal.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossSignal.cpp index 505bb660b..f413ca672 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossSignal.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossSignal.cpp @@ -23,8 +23,8 @@ CrossSignal::~CrossSignal() {} SignalPtr CrossSignal::_clone() { CrossSignal* p = new CrossSignal(); - p->m_fast = m_fast; - p->m_slow = m_slow; + p->m_fast = m_fast.clone(); + p->m_slow = m_slow.clone(); return SignalPtr(p); } diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal.cpp index 561dc8370..ccf4439d9 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal.cpp @@ -30,7 +30,7 @@ SingleSignal::~SingleSignal() {} SignalPtr SingleSignal::_clone() { SingleSignal* p = new SingleSignal(); - p->m_ind = m_ind; + p->m_ind = m_ind.clone(); return SignalPtr(p); } diff --git a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal2.cpp b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal2.cpp index 738aa9a48..3f6cd325e 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal2.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal2.cpp @@ -33,7 +33,7 @@ SingleSignal2::~SingleSignal2() {} SignalPtr SingleSignal2::_clone() { SingleSignal2* p = new SingleSignal2(); - p->m_ind = m_ind; + p->m_ind = m_ind.clone(); return SignalPtr(p); } diff --git a/hikyuu_cpp/hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.cpp b/hikyuu_cpp/hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.cpp index f541dff12..d68d4c92b 100644 --- a/hikyuu_cpp/hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.cpp +++ b/hikyuu_cpp/hikyuu/trade_sys/stoploss/imp/IndicatorStoploss.cpp @@ -34,7 +34,7 @@ void IndicatorStoploss::_reset() { } StoplossPtr IndicatorStoploss::_clone() { - IndicatorStoploss* p = new IndicatorStoploss(m_op, getParam("kpart")); + IndicatorStoploss* p = new IndicatorStoploss(m_op.clone(), getParam("kpart")); p->m_result = m_result; return StoplossPtr(p); } diff --git a/hikyuu_pywrap/_analysis.cpp b/hikyuu_pywrap/_analysis.cpp index bd044f2f4..8c48fde83 100644 --- a/hikyuu_pywrap/_analysis.cpp +++ b/hikyuu_pywrap/_analysis.cpp @@ -146,6 +146,9 @@ static py::dict analysis_sys_list(const py::object& pystk_list, const KQuery& qu std::vector tmp(keys.size() + 2); for (size_t i = 0, total = records.size(); i < total; i++) { const auto& record = records[i]; + if (record.values.size() != keys.size()) { + continue; + } tmp[0].append(record.market_code); tmp[1].append(record.name); for (size_t j = 0, len = keys.size(); j < len; j++) { @@ -157,7 +160,9 @@ static py::dict analysis_sys_list(const py::object& pystk_list, const KQuery& qu result["证券代码"] = tmp[0]; result["证券名称"] = tmp[1]; for (size_t i = 0, total = keys.size(); i < total; i++) { - result[keys[i].c_str()] = tmp[i + 2]; + if (!tmp[i + 2].empty()) { + result[keys[i].c_str()] = tmp[i + 2]; + } } return result; } From ce9c2077f80d8ffd1a3885b90a537fed82773a8c Mon Sep 17 00:00:00 2001 From: fasiondog Date: Fri, 2 Feb 2024 18:46:10 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fixed=20windows=20=E5=B9=B3=E5=8F=B0=20DATE?= =?UTF-8?q?=20=E5=AE=9A=E4=B9=89=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hikyuu_pywrap/indicator/_build_in.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hikyuu_pywrap/indicator/_build_in.cpp b/hikyuu_pywrap/indicator/_build_in.cpp index 87bb3c664..c2c6a4186 100644 --- a/hikyuu_pywrap/indicator/_build_in.cpp +++ b/hikyuu_pywrap/indicator/_build_in.cpp @@ -35,8 +35,8 @@ Indicator (*VOL3)() = VOL; Indicator (*KDATA_PART1)(const KData& kdata, const string& part) = KDATA_PART; Indicator (*KDATA_PART3)(const string& part) = KDATA_PART; -Indicator (*DATE1)() = DATE; -Indicator (*DATE2)(const KData&) = DATE; +Indicator (*DATE1)() = hku::DATE; +Indicator (*DATE2)(const KData&) = hku::DATE; Indicator (*TIME1)() = TIME; Indicator (*TIME2)(const KData&) = TIME;