/* * _MoneyManager.cpp * * Created on: 2013-3-13 * Author: fasiondog */ #include #include #include "../_Parameter.h" #include "../pickle_support.h" using namespace boost::python; using namespace hku; class MoneyManagerWrap : public MoneyManagerBase, public wrapper { public: MoneyManagerWrap() : MoneyManagerBase() {} MoneyManagerWrap(const string& name) : MoneyManagerBase(name) {} void buyNotify(const TradeRecord& record) { if (override buyNotify = this->get_override("buyNotify")) { buyNotify(record); return; } MoneyManagerBase::buyNotify(record); } void default_buyNotify(const TradeRecord& record) { MoneyManagerBase::buyNotify(record); } void sellNotify(const TradeRecord& record) { if (override sellNotify = this->get_override("sellNotify")) { sellNotify(record); return; } MoneyManagerBase::sellNotify(record); } void default_sellNotify(const TradeRecord& record) { MoneyManagerBase::sellNotify(record); } double _getSellNumber(const Datetime& datetime, const Stock& stock, price_t price, price_t risk, SystemPart from) { if (override _getSellNumber = this->get_override("_getSellNumber")) { return _getSellNumber(datetime, stock, price, risk, from); } return MoneyManagerBase::_getSellNumber(datetime, stock, price, risk, from); } double default_getSellNumber(const Datetime& datetime, const Stock& stock, price_t price, price_t risk, SystemPart from) { return MoneyManagerBase::_getSellNumber(datetime, stock, price, risk, from); } double _getBuyNumber(const Datetime& datetime, const Stock& stock, price_t price, price_t risk, SystemPart from) { return this->get_override("_getBuyNumber")(datetime, stock, price, risk, from); } double _getSellShortNumber(const Datetime& datetime, const Stock& stock, price_t price, price_t risk, SystemPart from) { if (override _getSellShortNumber = this->get_override("_getSellShortNumber")) { return _getSellShortNumber(datetime, stock, price, risk, from); } return MoneyManagerBase::_getSellShortNumber(datetime, stock, price, risk, from); } double default_getSellShortNumber(const Datetime& datetime, const Stock& stock, price_t price, price_t risk, SystemPart from) { return MoneyManagerBase::_getSellShortNumber(datetime, stock, price, risk, from); } double getBuyShortNumber(const Datetime& datetime, const Stock& stock, price_t price, price_t risk, SystemPart from) { if (override _getBuyShortNumber = this->get_override("_getBuyShortNumber")) { return _getBuyShortNumber(datetime, stock, price, risk, from); } return MoneyManagerBase::_getBuyShortNumber(datetime, stock, price, risk, from); } double default_getBuyShortNumber(const Datetime& datetime, const Stock& stock, price_t price, price_t risk, SystemPart from) { return MoneyManagerBase::_getBuyShortNumber(datetime, stock, price, risk, from); } void _reset() { if (override func = get_override("_reset")) { func(); } else { MoneyManagerBase::_reset(); } } void default_reset() { this->MoneyManagerBase::_reset(); } MoneyManagerPtr _clone() { return this->get_override("_clone")(); } }; string (MoneyManagerBase::*mm_get_name)() const = &MoneyManagerBase::name; void (MoneyManagerBase::*mm_set_name)(const string&) = &MoneyManagerBase::name; void export_MoneyManager() { class_("MoneyManagerBase", R"(资金管理策略基类 公共参数: - auto-checkin=False (bool) : 当账户现金不足以买入资金管理策略指示的买入数量时,自动向账户中补充存入(checkin)足够的现金。 - max-stock=20000 (int) : 最大持有的证券种类数量(即持有几只股票,而非各个股票的持仓数) - disable_ev_force_clean_position=False (bool) : 禁用市场环境失效时强制清仓 - disable_cn_force_clean_position=False (bool) : 禁用系统有效条件失效时强制清仓 自定义资金管理策略接口: - buyNotify : 【可选】接收实际买入通知,预留用于多次增减仓处理 - sellNotify : 【可选】接收实际卖出通知,预留用于多次增减仓处理 - _getBuyNumber : 【必须】获取指定交易对象可买入的数量 - _getSellNumber : 【可选】获取指定交易对象可卖出的数量,如未重载,默认为卖出全部已持仓数量 - _reset : 【可选】重置私有属性 - _clone : 【必须】克隆接口)", init<>()) .def(init()) .def(self_ns::str(self)) .def(self_ns::repr(self)) .add_property("name", mm_get_name, mm_set_name, "名称") .def("getParam", &MoneyManagerBase::getParam, R"(get_param(self, name) 获取指定的参数 :param str name: 参数名称 :return: 参数值 :raises out_of_range: 无此参数)") .def("setParam", &MoneyManagerBase::setParam, R"(set_param(self, name, value) 设置参数 :param str name: 参数名称 :param value: 参数值 :raises logic_error: Unsupported type! 不支持的参数类型)") .def("haveParam", &MoneyManagerBase::haveParam, "是否存在指定参数") .def("setTM", &MoneyManagerBase::setTM) .def("getTM", &MoneyManagerBase::getTM) .def("setQuery", &MoneyManagerBase::setQuery) .def("getQuery", &MoneyManagerBase::getQuery) .def("reset", &MoneyManagerBase::reset) .def("clone", &MoneyManagerBase::clone) .def("buyNotify", &MoneyManagerBase::buyNotify, &MoneyManagerWrap::default_buyNotify) .def("sellNotify", &MoneyManagerBase::sellNotify, &MoneyManagerWrap::default_sellNotify) .def("getBuyNumber", &MoneyManagerBase::getBuyNumber) .def("getSellNumber", &MoneyManagerBase::getSellNumber) .def("getSellShortNumber", &MoneyManagerBase::getSellShortNumber) .def("getBuyShortNumber", &MoneyManagerBase::getBuyShortNumber) .def("_getBuyNumber", pure_virtual(&MoneyManagerBase::_getBuyNumber)) .def("_getSellNumber", &MoneyManagerBase::_getSellNumber, &MoneyManagerWrap::default_getSellNumber) .def("_getSellShortNumber", &MoneyManagerBase::_getSellShortNumber, &MoneyManagerWrap::default_getSellShortNumber) .def("_getBuyShortNumber", &MoneyManagerBase::_getBuyShortNumber, &MoneyManagerWrap::default_getBuyShortNumber) .def("_reset", &MoneyManagerBase::_reset, &MoneyManagerWrap::default_reset) .def("_clone", pure_virtual(&MoneyManagerBase::_clone)) #if HKU_PYTHON_SUPPORT_PICKLE .def_pickle(name_init_pickle_suite()) #endif ; register_ptr_to_python(); def("MM_Nothing", MM_Nothing); def("MM_FixedRisk", MM_FixedRisk, (arg("risk") = 1000.00)); def("MM_FixedCapital", MM_FixedCapital, (arg("capital") = 10000.00)); def("MM_FixedCount", MM_FixedCount, (arg("n") = 100)); def("MM_FixedPercent", MM_FixedPercent, (arg("p") = 0.03)); def("MM_FixedUnits", MM_FixedUnits, (arg("n") = 33)); def("MM_WilliamsFixedRisk", MM_WilliamsFixedRisk, (arg("p") = 0.1, arg("max_loss") = 1000.0)); }