add DelegateSystem

This commit is contained in:
fasiondog 2024-09-13 12:30:29 +08:00
parent f1b96dd456
commit 98bb1459a6
5 changed files with 149 additions and 24 deletions

View File

@ -0,0 +1,75 @@
/*
* Copyright (c) 2024 hikyuu.org
*
* Created on: 2024-09-13
* Author: fasiondog
*/
#include "DelegateSystem.h"
namespace hku {
void DelegateSystem::_reset() {
if (m_sys) {
m_sys->reset();
}
}
void DelegateSystem::_forceResetAll() {
if (m_sys) {
m_sys->forceResetAll();
}
}
SystemPtr DelegateSystem::_clone() {
return m_sys ? make_shared<DelegateSystem>(m_sys->clone()) : make_shared<DelegateSystem>();
}
void DelegateSystem::run(const KData& kdata, bool reset, bool resetAll) {
HKU_WARN_IF_RETURN(!m_sys, void(), "No delegated system is specified!");
m_kdata = kdata;
m_sys->setTM(getTM());
m_sys->setMM(getMM());
m_sys->setEV(getEV());
m_sys->setCN(getCN());
m_sys->setSG(getSG());
m_sys->setST(getST());
m_sys->setTP(getTP());
m_sys->setPG(getPG());
m_sys->setSP(getSP());
m_sys->run(kdata, reset, resetAll);
}
TradeRecord DelegateSystem::runMoment(const Datetime& datetime) {
HKU_WARN_IF_RETURN(!m_sys, TradeRecord(), "No delegated system is specified!");
return m_sys->runMoment(datetime);
}
TradeRecord DelegateSystem::sellForceOnOpen(const Datetime& date, double num, Part from) {
HKU_WARN_IF_RETURN(!m_sys, TradeRecord(), "No delegated system is specified!");
return m_sys->sellForceOnOpen(date, num, from);
}
TradeRecord DelegateSystem::sellForceOnClose(const Datetime& date, double num, Part from) {
HKU_WARN_IF_RETURN(!m_sys, TradeRecord(), "No delegated system is specified!");
return m_sys->sellForceOnClose(date, num, from);
}
void DelegateSystem::clearDelayBuyRequest() {
HKU_WARN_IF_RETURN(!m_sys, void(), "No delegated system is specified!");
m_sys->clearDelayBuyRequest();
}
bool DelegateSystem::haveDelaySellRequest() const {
HKU_WARN_IF_RETURN(!m_sys, false, "No delegated system is specified!");
return m_sys->haveDelaySellRequest();
}
TradeRecord DelegateSystem::pfProcessDelaySellRequest(const Datetime& date) {
HKU_WARN_IF_RETURN(!m_sys, TradeRecord(), "No delegated system is specified!");
return m_sys->pfProcessDelaySellRequest(date);
}
} // namespace hku

View File

@ -0,0 +1,37 @@
/*
* Copyright (c) 2024 hikyuu.org
*
* Created on: 2024-09-13
* Author: fasiondog
*/
#include "System.h"
namespace hku {
class HKU_API DelegateSystem : public System {
public:
DelegateSystem() = default;
explicit DelegateSystem(const string& name) : System(name) {}
explicit DelegateSystem(const SystemPtr& sys) : m_sys(sys) {}
virtual ~DelegateSystem() = default;
virtual void run(const KData& kdata, bool reset = true, bool resetAll = false) override;
virtual TradeRecord runMoment(const Datetime& datetime) override;
virtual void _reset() override;
virtual void _forceResetAll() override;
virtual SystemPtr _clone() override;
public:
virtual TradeRecord sellForceOnOpen(const Datetime& date, double num, Part from) override;
virtual TradeRecord sellForceOnClose(const Datetime& date, double num, Part from) override;
virtual void clearDelayBuyRequest() override;
virtual bool haveDelaySellRequest() const override;
virtual TradeRecord pfProcessDelaySellRequest(const Datetime& date) override;
private:
SystemPtr m_sys;
};
} // namespace hku

View File

@ -193,6 +193,8 @@ void System::reset() {
m_sellRequest.clear();
m_sellShortRequest.clear();
m_buyShortRequest.clear();
_reset();
}
void System::forceResetAll() {
@ -234,6 +236,8 @@ void System::forceResetAll() {
m_sellRequest.clear();
m_sellShortRequest.clear();
m_buyShortRequest.clear();
_forceResetAll();
}
void System::setTO(const KData& kdata) {
@ -279,7 +283,7 @@ void System::setTO(const KData& kdata) {
}
SystemPtr System::clone() {
SystemPtr p = make_shared<System>();
SystemPtr p = _clone();
if (m_tm)
p->m_tm = getParam<bool>("shared_tm") ? m_tm : m_tm->clone();
if (m_ev)

View File

@ -63,6 +63,8 @@ public:
const StoplossPtr& tp, const ProfitGoalPtr& pg, const SlippagePtr& sp,
const string& name);
System(const System&) = default;
/** 析构函数 */
virtual ~System();
@ -199,48 +201,56 @@ public:
* @param reset
* @param resetAll
*/
void run(const KData& kdata, bool reset = true, bool resetAll = false);
virtual void run(const KData& kdata, bool reset = true, bool resetAll = false);
/**
* @brief PF
* @param datetime
* @return TradeRecord
*/
TradeRecord runMoment(const Datetime& datetime);
virtual TradeRecord runMoment(const Datetime& datetime);
// 运行前准备工作, 失败将抛出异常
void readyForRun();
TradeRecord sell(const KRecord& today, const KRecord& src_today, Part from) {
return _sell(today, src_today, from);
}
// 由各个相关组件调用,用于组件参数变化时通知 sys以便重算
void partChangedNotify() {
m_calculated = false;
}
private:
virtual void _reset() {}
virtual void _forceResetAll() {}
/** 子类克隆接口 */
virtual SystemPtr _clone() {
return make_shared<System>();
}
public:
//-------------------------
// 仅供 PF/AF 内部调用
//-------------------------
// 强制以开盘价卖出,仅供 PF/AF 内部调用
TradeRecord sellForceOnOpen(const Datetime& date, double num, Part from) {
virtual TradeRecord sellForceOnOpen(const Datetime& date, double num, Part from) {
HKU_ASSERT(from == PART_ALLOCATEFUNDS || from == PART_PORTFOLIO);
return _sellForce(date, num, from, true);
}
// 强制以收盘价卖出,仅供 PF/AF 内部调用
TradeRecord sellForceOnClose(const Datetime& date, double num, Part from) {
virtual TradeRecord sellForceOnClose(const Datetime& date, double num, Part from) {
HKU_ASSERT(from == PART_ALLOCATEFUNDS || from == PART_PORTFOLIO);
return _sellForce(date, num, from, false);
}
// 清除已有的交易请求供Portfolio使用
void clearDelayBuyRequest();
virtual void clearDelayBuyRequest();
// 当前是否存在延迟的操作请求供Portfolio
bool haveDelaySellRequest() const;
virtual bool haveDelaySellRequest() const;
// 处理延迟买入请求,仅供 PF 调用
TradeRecord pfProcessDelaySellRequest(const Datetime& date);
virtual TradeRecord pfProcessDelaySellRequest(const Datetime& date);
private:
bool _environmentIsValid(const Datetime& datetime);

View File

@ -15,12 +15,6 @@ using namespace hku;
#pragma warning(disable : 4267)
#endif
void (System::*run_1)(const KQuery&, bool, bool) = &System::run;
void (System::*run_2)(const KData&, bool, bool) = &System::run;
void (System::*run_3)(const Stock&, const KQuery&, bool, bool) = &System::run;
TradeRecord (System::*runMoment_1)(const Datetime&) = &System::runMoment;
void export_System(py::module& m) {
m.def("get_system_part_name", getSystemPartName, R"(get_system_part_name(part)
@ -67,7 +61,8 @@ void export_System(py::module& m) {
DEF_PICKLE(TradeRequest);
//--------------------------------------------------------------------------------------
py::class_<System, SystemPtr>(m, "System",
py::class_<System, SystemPtr>(
m, "System",
R"(系统基类。需要扩展或实现更复杂的系统交易行为,可从此类继承。
@ -84,6 +79,7 @@ void export_System(py::module& m) {
- cn_open_position=False (bool): 使)")
.def(py::init<const string&>())
.def(py::init<const System&>())
.def(py::init<const TradeManagerPtr&, const MoneyManagerPtr&, const EnvironmentPtr&,
const ConditionPtr&, const SignalPtr&, const StoplossPtr&, const StoplossPtr&,
const ProfitGoalPtr&, const SlippagePtr&, const string&>())
@ -172,9 +168,12 @@ void export_System(py::module& m) {
)")
.def("run", run_1, py::arg("query"), py::arg("reset") = true, py::arg("reset_all") = false)
.def("run", run_2, py::arg("kdata"), py::arg("reset") = true, py::arg("reset_all") = false)
.def("run", run_3, py::arg("stock"), py::arg("query"), py::arg("reset") = true,
.def("run", py::overload_cast<const KQuery&, bool, bool>(&System::run), py::arg("query"),
py::arg("reset") = true, py::arg("reset_all") = false)
.def("run", py::overload_cast<const KData&, bool, bool>(&System::run), py::arg("kdata"),
py::arg("reset") = true, py::arg("reset_all") = false)
.def("run", py::overload_cast<const Stock&, const KQuery&, bool, bool>(&System::run),
py::arg("stock"), py::arg("query"), py::arg("reset") = true,
py::arg("reset_all") = false,
R"(run(self, stock, query[, reset=True])