Skip to content

Commit

Permalink
Merge pull request #161 from fasiondog/feature/analysis
Browse files Browse the repository at this point in the history
Feature/analysis fixed add_options("stacktrace") 拼写错误;组件 indicator 成员未 clone 引起并行时崩溃
  • Loading branch information
fasiondog authored Feb 2, 2024
2 parents 14a9180 + bf50d10 commit e762667
Show file tree
Hide file tree
Showing 17 changed files with 60 additions and 32 deletions.
1 change: 1 addition & 0 deletions hikyuu/analysis/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@
__all__ = [
'combinate_ind_analysis',
'combinate_ind_analysis_multi',
'analysis_sys_list',
]
15 changes: 14 additions & 1 deletion hikyuu/analysis/analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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)
8 changes: 5 additions & 3 deletions hikyuu_cpp/hikyuu/analysis/analysis_sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -49,8 +49,10 @@ inline vector<AnalysisSystemWithBlockOut> 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);
Expand Down
4 changes: 2 additions & 2 deletions hikyuu_cpp/hikyuu/trade_sys/condition/imp/BoolCondition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ BoolCondition::BoolCondition(const Indicator& ind) : ConditionBase("CN_Bool"), m
BoolCondition::~BoolCondition() {}

ConditionPtr BoolCondition::_clone() {
return make_shared<BoolCondition>(m_ind);
return make_shared<BoolCondition>(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]);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ OPLineCondition::OPLineCondition(const Indicator& op) : ConditionBase("CN_OPLine
OPLineCondition::~OPLineCondition() {}

ConditionPtr OPLineCondition::_clone() {
return make_shared<OPLineCondition>(m_op);
return make_shared<OPLineCondition>(m_op.clone());
}

void OPLineCondition::_calculate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 1 addition & 1 deletion hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
4 changes: 2 additions & 2 deletions hikyuu_cpp/hikyuu/trade_sys/signal/imp/BoolSignal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
4 changes: 2 additions & 2 deletions hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossGoldSignal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
4 changes: 2 additions & 2 deletions hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossSignal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 1 addition & 1 deletion hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 1 addition & 1 deletion hikyuu_cpp/hikyuu/trade_sys/signal/imp/SingleSignal2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void IndicatorStoploss::_reset() {
}

StoplossPtr IndicatorStoploss::_clone() {
IndicatorStoploss* p = new IndicatorStoploss(m_op, getParam<string>("kpart"));
IndicatorStoploss* p = new IndicatorStoploss(m_op.clone(), getParam<string>("kpart"));
p->m_result = m_result;
return StoplossPtr(p);
}
Expand Down
2 changes: 1 addition & 1 deletion hikyuu_cpp/hikyuu/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 21 additions & 9 deletions hikyuu_pywrap/_analysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -141,16 +141,28 @@ 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<py::list> 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);
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++) {
tmp[j + 2].append(record.values[j]);
}
}

py::dict result;
result["证券代码"] = tmp[0];
result["证券名称"] = tmp[1];
for (size_t i = 0, total = keys.size(); i < total; i++) {
if (!tmp[i + 2].empty()) {
result[keys[i].c_str()] = tmp[i + 2];
}
result.append(tmp);
}
return result;
}
Expand Down Expand Up @@ -178,5 +190,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);
}
4 changes: 2 additions & 2 deletions hikyuu_pywrap/indicator/_build_in.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion hikyuu_pywrap/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit e762667

Please sign in to comment.