From e44f9dd8372b34e84b6189384d6884883efd9367 Mon Sep 17 00:00:00 2001 From: YuWuKunCheng Date: Sun, 14 Jun 2026 11:48:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E4=B8=AD=E6=9E=A2?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chan.py | 46 +++++++++++++++++++++++++----------- chanlun-py/Cargo.toml | 4 ++-- chanlun-py/chanlun/chan.py | 46 +++++++++++++++++++++++++----------- chanlun-py/pyproject.toml | 2 +- chanlun/src/algorithm/hub.rs | 33 ++++++++++++++++++++------ 5 files changed, 93 insertions(+), 38 deletions(-) diff --git a/chan.py b/chan.py index bc7fd55..d7d0029 100644 --- a/chan.py +++ b/chan.py @@ -1661,6 +1661,9 @@ class 平滑异同移动平均线: self.慢线EMA = 慢线EMA self.DEA_EMA = DEA_EMA + def __repr__(self): + return f"平滑异同移动平均线(时间戳={self.时间戳}, 收盘价={self.收盘价}, 快线周期={self.快线周期}, 慢线周期={self.慢线周期}, 信号周期={self.信号周期}, DIF={self.DIF}, DEA={self.DEA}, MACD柱={self.MACD柱}, 快线EMA={self.快线EMA}, 慢线EMA={self.慢线EMA}, DEA_EMA={self.DEA_EMA})" + @classmethod def 首次计算(cls, 初始收盘价: float, 初始时间: datetime, 快线周期: int = 12, 慢线周期: int = 26, 信号周期: int = 9) -> 平滑异同移动平均线: """ @@ -1692,12 +1695,12 @@ class 平滑异同移动平均线: 快线周期=快线周期, 慢线周期=慢线周期, 信号周期=信号周期, - DIF=DIF, - DEA=DEA_EMA, - MACD柱=MACD柱, - 快线EMA=快线EMA, - 慢线EMA=慢线EMA, - DEA_EMA=DEA_EMA, + DIF=round(DIF, 2), + DEA=round(DEA_EMA, 2), + MACD柱=round(MACD柱, 2), + 快线EMA=round(快线EMA, 2), + 慢线EMA=round(慢线EMA, 2), + DEA_EMA=round(DEA_EMA, 2), ) @classmethod @@ -1763,12 +1766,12 @@ class 平滑异同移动平均线: 快线周期=前一个MACD.快线周期, 慢线周期=前一个MACD.慢线周期, 信号周期=前一个MACD.信号周期, - DIF=DIF, - DEA=DEA_EMA, - MACD柱=MACD柱, - 快线EMA=快线EMA, - 慢线EMA=慢线EMA, - DEA_EMA=DEA_EMA, + DIF=round(DIF, 2), + DEA=round(DEA_EMA, 2), + MACD柱=round(MACD柱, 2), + 快线EMA=round(快线EMA, 2), + 慢线EMA=round(慢线EMA, 2), + DEA_EMA=round(DEA_EMA, 2), ) @classmethod @@ -4988,7 +4991,8 @@ class 线段: @staticmethod def _索引(序列: list, 项) -> int: """O(1) index lookup — 序列元素序号连续递增。""" - return 项.序号 - 序列[0].序号 + # return 项.序号 - 序列[0].序号 + return 序列.index(项) @classmethod def _添加虚线(cls, 段: 虚线, 筆: 虚线): @@ -6167,9 +6171,23 @@ class 中枢: else: # if self.本级_第三买卖线: # return True + 中枢状态 = self.当前状态() + if 中枢状态 == "中枢之中": + return False 线段内部中枢 = self.基础序列[-1].合_中枢序列 if 虚实 == "合" else self.基础序列[-1].实_中枢序列 + if not 线段内部中枢: + return False + 高, 低 = self.高, self.低 for 内部中枢 in 线段内部中枢: - if 相对方向.分析(self.高, self.低, 内部中枢.高, 内部中枢.低).是否缺口(): + 内部中枢高, 内部中枢低 = 内部中枢.高, 内部中枢.低 + if 中枢状态 == "中枢之下": + if 低 <= 内部中枢高: + continue + else: + # 中枢之上 + if 高 >= 内部中枢低: + continue + if 相对方向.分析(self.高, self.低, 内部中枢高, 内部中枢低).是否缺口(): return True return False diff --git a/chanlun-py/Cargo.toml b/chanlun-py/Cargo.toml index 87bc46a..d2a9b88 100644 --- a/chanlun-py/Cargo.toml +++ b/chanlun-py/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chanlun-py" -version = "26.6.73" +version = "26.6.74" edition = "2024" description = "缠论技术分析库 — Rust 高性能 Python 绑定" authors = ["YuYuKunKun"] @@ -12,7 +12,7 @@ crate-type = ["cdylib"] name = "chanlun" [dependencies] -chanlun = "26.6.4" # { path = "../chanlun" } +chanlun = { path = "../chanlun" } parking_lot = "0.12" tracing-subscriber = { version = "0.3", features = ["env-filter", "ansi", "std", "registry"] } tracing-core = "0.1" diff --git a/chanlun-py/chanlun/chan.py b/chanlun-py/chanlun/chan.py index 7294d72..824ebc6 100644 --- a/chanlun-py/chanlun/chan.py +++ b/chanlun-py/chanlun/chan.py @@ -1661,6 +1661,9 @@ class 平滑异同移动平均线: self.慢线EMA = 慢线EMA self.DEA_EMA = DEA_EMA + def __repr__(self): + return f"平滑异同移动平均线(时间戳={self.时间戳}, 收盘价={self.收盘价}, 快线周期={self.快线周期}, 慢线周期={self.慢线周期}, 信号周期={self.信号周期}, DIF={self.DIF}, DEA={self.DEA}, MACD柱={self.MACD柱}, 快线EMA={self.快线EMA}, 慢线EMA={self.慢线EMA}, DEA_EMA={self.DEA_EMA})" + @classmethod def 首次计算(cls, 初始收盘价: float, 初始时间: datetime, 快线周期: int = 12, 慢线周期: int = 26, 信号周期: int = 9) -> 平滑异同移动平均线: """ @@ -1692,12 +1695,12 @@ class 平滑异同移动平均线: 快线周期=快线周期, 慢线周期=慢线周期, 信号周期=信号周期, - DIF=DIF, - DEA=DEA_EMA, - MACD柱=MACD柱, - 快线EMA=快线EMA, - 慢线EMA=慢线EMA, - DEA_EMA=DEA_EMA, + DIF=round(DIF, 2), + DEA=round(DEA_EMA, 2), + MACD柱=round(MACD柱, 2), + 快线EMA=round(快线EMA, 2), + 慢线EMA=round(慢线EMA, 2), + DEA_EMA=round(DEA_EMA, 2), ) @classmethod @@ -1763,12 +1766,12 @@ class 平滑异同移动平均线: 快线周期=前一个MACD.快线周期, 慢线周期=前一个MACD.慢线周期, 信号周期=前一个MACD.信号周期, - DIF=DIF, - DEA=DEA_EMA, - MACD柱=MACD柱, - 快线EMA=快线EMA, - 慢线EMA=慢线EMA, - DEA_EMA=DEA_EMA, + DIF=round(DIF, 2), + DEA=round(DEA_EMA, 2), + MACD柱=round(MACD柱, 2), + 快线EMA=round(快线EMA, 2), + 慢线EMA=round(慢线EMA, 2), + DEA_EMA=round(DEA_EMA, 2), ) @classmethod @@ -4988,7 +4991,8 @@ class 线段: @staticmethod def _索引(序列: list, 项) -> int: """O(1) index lookup — 序列元素序号连续递增。""" - return 项.序号 - 序列[0].序号 + # return 项.序号 - 序列[0].序号 + return 序列.index(项) @classmethod def _添加虚线(cls, 段: 虚线, 筆: 虚线): @@ -6167,9 +6171,23 @@ class 中枢: else: # if self.本级_第三买卖线: # return True + 中枢状态 = self.当前状态() + if 中枢状态 == "中枢之中": + return False 线段内部中枢 = self.基础序列[-1].合_中枢序列 if 虚实 == "合" else self.基础序列[-1].实_中枢序列 + if not 线段内部中枢: + return False + 高, 低 = self.高, self.低 for 内部中枢 in 线段内部中枢: - if 相对方向.分析(self.高, self.低, 内部中枢.高, 内部中枢.低).是否缺口(): + 内部中枢高, 内部中枢低 = 内部中枢.高, 内部中枢.低 + if 中枢状态 == "中枢之下": + if 低 <= 内部中枢高: + continue + else: + # 中枢之上 + if 高 >= 内部中枢低: + continue + if 相对方向.分析(self.高, self.低, 内部中枢高, 内部中枢低).是否缺口(): return True return False diff --git a/chanlun-py/pyproject.toml b/chanlun-py/pyproject.toml index 4a3ac7b..af6500a 100644 --- a/chanlun-py/pyproject.toml +++ b/chanlun-py/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "chanlun" -version = "2606.73" +version = "2606.74" description = "缠论技术分析库 — Rust 高性能实现" readme = { file = "README.md", content-type = "text/markdown" } license = { file = "LICENSE", content-type = "text/plain" } diff --git a/chanlun/src/algorithm/hub.rs b/chanlun/src/algorithm/hub.rs index 77b681a..ffee8a9 100644 --- a/chanlun/src/algorithm/hub.rs +++ b/chanlun/src/algorithm/hub.rs @@ -301,6 +301,13 @@ impl 中枢 { return self.第三买卖线.read().is_some(); } + // if self.本级_第三买卖线: return True # 暂未启用 + + let 中枢状态 = self.当前状态(); + if 中枢状态 == "中枢之中" { + return false; + } + let 基础序列_ref = self.基础序列.read(); let 最后段 = 基础序列_ref.last().unwrap(); let 内部中枢_vec = if 虚实 == "合" { @@ -308,14 +315,26 @@ impl 中枢 { } else { 最后段.实_中枢序列.read() }; + if 内部中枢_vec.is_empty() { + return false; + } + + let 高 = self.高(); + let 低 = self.低(); for 内部中枢 in 内部中枢_vec.iter() { - if crate::types::相对方向::分析( - self.高(), - self.低(), - 内部中枢.高(), - 内部中枢.低(), - ) - .是否缺口() + let 内部中枢高 = 内部中枢.高(); + let 内部中枢低 = 内部中枢.低(); + if 中枢状态 == "中枢之下" { + if 低 <= 内部中枢高 { + continue; + } + } else { + // 中枢之上 + if 高 >= 内部中枢低 { + continue; + } + } + if crate::types::相对方向::分析(高, 低, 内部中枢高, 内部中枢低).是否缺口() { return true; }