Skip to content

Commit 1d35b68

Browse files
committed
feat(trade_manager): 添加按股票获取扩展持仓详情功能
1 parent 2442d1c commit 1d35b68

File tree

5 files changed

+94
-6
lines changed

5 files changed

+94
-6
lines changed

docs/source/trade_manage/TradeManager.rst

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -555,14 +555,36 @@
555555
:param int trade_mode: 交易模式,影响部分统计项:0-收盘时交易,1-下一开盘时交易
556556
:return: 持仓扩展详情列表
557557

558-
.. py:method:: get_position_ext_info(self, current_time, ktype=Query.DAY, trade_mode=0) -> dict
558+
.. py:method:: get_position_ext_info(self, stock, current_time, ktype=Query.DAY, trade_mode=0) -> PositionExtInfo
559559
560-
获取账户最后交易时刻之后指定时间的持仓详情,以字典返回,stock 为 key, PositionExtInfo 为 value
560+
获取账户指定时刻的扩展持仓详情(仅针对指定股票)
561561

562+
:param Stock stock: 指定股票
562563
:param Datetime current_time: 当前时刻(需大于等于最后交易时刻)
563-
:param Query.KType ktype: k 线类型
564-
:param int trade_mode: 交易模式,影响部分统计项:0-收盘时交易,1-下一开盘时交易
565-
:return: 持仓扩展详情字典
564+
:param Query.KType ktype: K 线类型,默认日线
565+
:param int trade_mode: 交易模式,影响部分统计项:0-收盘时交易,1-下一开盘时交易,默认 0
566+
:return: 扩展持仓详情,包含以下字段:
567+
568+
- position (PositionRecord): 基础持仓记录
569+
- max_high_price (float): 期间最高价最大值
570+
- min_low_price (float): 期间最低价最小值
571+
- max_close_price (float): 期间收盘价最高值
572+
- min_close_price (float): 期间收盘价最低值
573+
- current_close_price (float): 当前收盘价
574+
- max_pull_back1 (float): 最大回撤百分比 1(仅使用最大收盘价和最低收盘价计算)(负数)
575+
- max_pull_back2 (float): 最大回撤百分比 2(使用期间最高价最大值和最低价最小值计算)(负数)
576+
- current_profit (float): 当前浮动盈亏(不含预计卖出成本)
577+
578+
以及以下计算方法:
579+
580+
- current_pull_back1(): 当前回撤百分比 1(仅使用最大收盘价和当前收盘价计算)
581+
- current_pull_back2(): 当前回撤百分比 2(使用期间最高价最大值和当前收盘价计算)
582+
- max_floating_profit1(): 期间最大浮盈百分比 1(仅使用收盘价计算,不含预计卖出成本,多次买卖时统计不准)
583+
- max_floating_profit2(): 期间最大浮盈百分比 2(使用最高价最大值进行计算,不含预计卖出成本,多次买卖时统计不准)
584+
- min_loss_profit1(): 期间最大浮亏百分比 1(仅使用收盘价计算,不含预计卖出成本,多次买卖时统计不准)
585+
- min_loss_profit2(): 期间最大浮亏百分比 2(仅使用期间最低价计算,不含预计卖出成本,多次买卖时统计不准)
586+
587+
:note: 该功能只适合一买一卖的情况,对于一买多卖的情况,部分统计可能不准确,仅供参考
566588

567589
.. py:method:: get_history_position_ext_info_list(self, ktype=Query.DAY, trade_mode=0) -> list[PositionExtInfo]
568590

hikyuu_cpp/hikyuu/plugin/interface/TMReportPluginInterface.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,24 @@ class TMReportPluginInterface : public PluginBase {
4949
const KQuery::KType& ktype,
5050
int trade_mode) = 0;
5151

52+
/**
53+
* @brief 获取账户指定时刻的指定证券的持仓详情
54+
* @param tm 账户
55+
* @param stock 持仓的股票
56+
* @param current_time 当前时刻(需大于等于最后交易时刻)
57+
* @param ktype k线类型
58+
* @param trade_mode 交易模式,影响部分统计项: 0-收盘时交易, 1-下一开盘时交易
59+
* @return PositionExtInfo
60+
*/
61+
virtual PositionExtInfo getPositionExtInfo(const TMPtr& tm, const Stock& stock,
62+
const Datetime& current_time,
63+
const KQuery::KType& ktype, int trade_mode) = 0;
64+
5265
/**
5366
* 统计截至某一时刻的系统绩效, datetime必须大于等于lastDatetime,
5467
* 以便用于计算当前市值
5568
* @param tm 指定的交易管理实例
5669
* @param datetime 统计截止时刻
57-
* @param ktype k线类型
5870
*/
5971
virtual Performance getExtPerformance(const TMPtr& tm, const Datetime& datetime,
6072
const KQuery::KType& ktype) = 0;

hikyuu_cpp/hikyuu/trade_manage/TradeManagerBase.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,17 @@ std::unordered_map<Stock, PositionExtInfo> TradeManagerBase::getPositionExtInfoD
8585
return ret;
8686
}
8787

88+
PositionExtInfo TradeManagerBase::getPositionExtInfo(const Stock& stock,
89+
const Datetime& current_time,
90+
const KQuery::KType& ktype, int trade_mode) {
91+
PositionExtInfo ret;
92+
auto& sm = StockManager::instance();
93+
auto* plugin = sm.getPlugin<TMReportPluginInterface>(HKU_PLUGIN_TMREPORT);
94+
HKU_ERROR_IF_RETURN(!plugin, ret, "Can't find {} plugin!", HKU_PLUGIN_TMREPORT);
95+
ret = plugin->getPositionExtInfo(shared_from_this(), stock, current_time, ktype, trade_mode);
96+
return ret;
97+
}
98+
8899
std::vector<std::pair<Datetime, double>> TradeManagerBase::getProfitPercentMonthly(
89100
const Datetime& datetime) {
90101
std::vector<std::pair<Datetime, double>> ret;

hikyuu_cpp/hikyuu/trade_manage/TradeManagerBase.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,14 @@ class HKU_API TradeManagerBase : public enable_shared_from_this<TradeManagerBase
768768
const Datetime& datetime = Datetime::now(), const KQuery::KType& ktype = KQuery::DAY,
769769
int trade_mode = 0);
770770

771+
/**
772+
* 获取账户最后交易时刻后持仓详情
773+
*/
774+
PositionExtInfo getPositionExtInfo(const Stock& stock,
775+
const Datetime& current_time = Datetime::now(),
776+
const KQuery::KType& ktype = KQuery::DAY,
777+
int trade_mode = 0);
778+
771779
/**
772780
* @brief 获取指定截止时间前各月的收益百分比
773781
* @param datetime

hikyuu_pywrap/trade_manage/_TradeManager.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,41 @@ void export_TradeManager(py::module& m) {
618618
:param Query.KType ktype: k线类型
619619
:return: 最大回撤百分比)")
620620

621+
.def(
622+
"get_position_ext_info", &TradeManagerBase::getPositionExtInfo, py::arg("stock"),
623+
py::arg("current_time"), py::arg("ktype") = KQuery::DAY, py::arg("trade_mode") = 0,
624+
R"(get_position_ext_info(self, stock, current_time, ktype=Query.DAY, trade_mode=0) -> PositionExtInfo)
625+
626+
获取账户指定时刻的扩展持仓详情(仅针对指定股票)
627+
628+
:param Stock stock: 指定股票
629+
:param Datetime current_time: 当前时刻(需大于等于最后交易时刻)
630+
:param Query.KType ktype: K 线类型,默认日线
631+
:param int trade_mode: 交易模式,影响部分统计项:0-收盘时交易,1-下一开盘时交易,默认 0
632+
:return: 扩展持仓详情,包含以下字段:
633+
634+
- position (PositionRecord): 基础持仓记录
635+
- max_high_price (float): 期间最高价最大值
636+
- min_low_price (float): 期间最低价最小值
637+
- max_close_price (float): 期间收盘价最高值
638+
- min_close_price (float): 期间收盘价最低值
639+
- current_close_price (float): 当前收盘价
640+
- max_pull_back1 (float): 最大回撤百分比 1(仅使用最大收盘价和最低收盘价计算)(负数)
641+
- max_pull_back2 (float): 最大回撤百分比 2(使用期间最高价最大值和最低价最小值计算)(负数)
642+
- current_profit (float): 当前浮动盈亏(不含预计卖出成本)
643+
644+
以及以下计算方法:
645+
646+
- current_pull_back1(): 当前回撤百分比 1(仅使用最大收盘价和当前收盘价计算)
647+
- current_pull_back2(): 当前回撤百分比 2(使用期间最高价最大值和当前收盘价计算)
648+
- max_floating_profit1(): 期间最大浮盈百分比 1(仅使用收盘价计算,不含预计卖出成本,多次买卖时统计不准)
649+
- max_floating_profit2(): 期间最大浮盈百分比 2(使用最高价最大值进行计算,不含预计卖出成本,多次买卖时统计不准)
650+
- min_loss_profit1(): 期间最大浮亏百分比 1(仅使用收盘价计算,不含预计卖出成本,多次买卖时统计不准)
651+
- min_loss_profit2(): 期间最大浮亏百分比 2(仅使用期间最低价计算,不含预计卖出成本,多次买卖时统计不准)
652+
653+
:note: 该功能只适合一买一卖的情况,对于一买多卖的情况,部分统计可能不准确,仅供参考
654+
)")
655+
621656
.def(
622657
"get_position_ext_info_list", &TradeManagerBase::getPositionExtInfoList,
623658
py::arg("current_time"), py::arg("ktype") = KQuery::DAY, py::arg("trade_mode") = 0,

0 commit comments

Comments
 (0)