hikyuu2/hikyuu_pywrap/_Block.cpp

138 lines
4.1 KiB
C++
Raw Normal View History

2016-04-03 00:08:31 +08:00
/*
* _Block.cpp
*
* Created on: 2015210
2016-04-14 01:36:53 +08:00
* Author: fasiondog
2016-04-03 00:08:31 +08:00
*/
#include <hikyuu/serialization/Block_serialization.h>
2023-12-27 02:16:10 +08:00
#include "pybind_utils.h"
2016-04-03 00:08:31 +08:00
using namespace hku;
2023-12-27 02:16:10 +08:00
namespace py = pybind11;
2016-04-03 00:08:31 +08:00
2022-02-21 22:23:52 +08:00
#if defined(_MSC_VER)
#pragma warning(disable : 4267)
#endif
2016-04-03 00:08:31 +08:00
string (Block::*getCategory)() const = &Block::category;
void (Block::*setCategory)(const string&) = &Block::category;
string (Block::*getName)() const = &Block::name;
void (Block::*setName)(const string&) = &Block::name;
2023-12-27 02:16:10 +08:00
void export_Block(py::module& m) {
py::class_<Block>(m, "Block", "板块类,可视为证券的容器")
.def(py::init<>())
.def(py::init<const string&, const string&>())
.def(py::init<const Block&>())
2017-09-29 01:37:12 +08:00
2023-12-27 02:16:10 +08:00
.def("__str__", to_py_str<Block>)
.def("__repr__", to_py_str<Block>)
2020-07-06 00:41:32 +08:00
2024-05-25 01:16:55 +08:00
.def_property("category", getCategory, setCategory, "板块所属分类")
2023-12-27 02:16:10 +08:00
.def_property("name", getName, setName, "板块名称")
2024-04-23 18:04:05 +08:00
.def_property("index_stock", &Block::getIndexStock, &Block::setIndexStock,
py::return_value_policy::copy, "对应指数")
2020-07-06 00:41:32 +08:00
.def("empty", &Block::empty, R"(empty(self)
)")
2024-05-20 22:39:27 +08:00
.def("add", py::overload_cast<const Stock&>(&Block::add), R"(add(self, stock)
2020-07-06 00:41:32 +08:00
:param Stock stock:
:return:
2024-05-20 22:39:27 +08:00
:rtype: bool)")
2020-07-06 00:41:32 +08:00
2024-05-20 22:39:27 +08:00
.def("add", py::overload_cast<const string&>(&Block::add), R"(add(self, market_code)
2020-07-06 00:41:32 +08:00
"市场简称证券代码"
:param str market_code:
:return:
2024-05-20 22:39:27 +08:00
:rtype: bool)")
.def(
"add",
[](Block& blk, py::sequence stks) {
auto total = len(stks);
HKU_IF_RETURN(total == 0, true);
if (py::isinstance<Stock>(stks[0])) {
StockList cpp_stks = python_list_to_vector<Stock>(stks);
return blk.add(cpp_stks);
}
if (py::isinstance<string>(stks[0])) {
StringList codes = python_list_to_vector<string>(stks);
return blk.add(codes);
}
HKU_ERROR("Not support type!");
return false;
},
R"(add(self, sequence)
:param sequence stks: Stock
:return: True | False )")
2020-07-06 00:41:32 +08:00
2024-05-20 22:39:27 +08:00
.def("remove", py::overload_cast<const Stock&>(&Block::remove), R"(remove(self, stock)
2020-07-06 00:41:32 +08:00
:param Stock stock:
:return:
:rtype: bool)")
2024-05-20 22:39:27 +08:00
.def("remove", py::overload_cast<const string&>(&Block::remove), R"(remove(market_code)
2020-07-06 00:41:32 +08:00
:param str market_code:
2020-07-07 00:34:25 +08:00
:return: True | False
2020-07-06 00:41:32 +08:00
:rtype: bool)")
.def("clear", &Block::clear, "移除包含的所有证券")
2020-07-07 00:34:25 +08:00
.def("__len__", &Block::size, "包含的证券数量")
.def("__getitem__", &Block::get, R"(__getitem__(self, market_code)
:param str market_code:
:return: Stock )")
2023-12-27 02:16:10 +08:00
.def(
"__iter__",
[](const Block& blk) {
return py::make_iterator<py::return_value_policy::reference_internal, StockMapIterator,
StockMapIterator, const Stock&>(blk.begin(), blk.end());
},
py::keep_alive<0, 1>())
2016-04-03 00:08:31 +08:00
.def(
"get_stock_list",
[](const Block& self, py::object filter) {
StockList ret;
if (filter.is_none()) {
ret = self.getStockList();
} else {
HKU_CHECK(py::hasattr(filter, "__call__"), "filter not callable!");
py::object filter_func = filter.attr("__call__");
ret = self.getStockList(
[&](const Stock& stk) { return filter_func(stk).cast<bool>(); });
}
return ret;
},
py::arg("filter") = py::none(), R"(get_stock_list(self[, filter=None])
:param func filter: stock, True | False )")
2023-12-27 02:16:10 +08:00
DEF_PICKLE(Block);
2016-04-03 00:08:31 +08:00
}