中枢终于画对了,可以交易了

This commit is contained in:
jackyu66git
2026-03-11 11:33:21 +08:00
parent 5226c551d5
commit ea47bfe9b7
2 changed files with 76 additions and 30 deletions
+20 -1
View File
@@ -69,4 +69,23 @@ class ChanZS():
def set_gg(self, gg):
self.gg = gg
def set_dd(self, dd):
self.dd = dd
self.dd = dd
# 大级别中枢:由多个区间重叠(扩张)的笔/线段中枢合并而成,用于显示更大级别的震荡区间
class ChanZS_Big():
def __init__(self, zs_list):
assert len(zs_list) >= 1
self.zs_list = list(zs_list)
first = self.zs_list[0]
last = self.zs_list[-1]
self.start_time = first.start_time
self.end_time = last.end_time if last.end_time else None
self.start_klc = first.start_klc
self.end_klc = last.end_klc
# 大级别区间取并集:包住所有子中枢
self.zd = min(zs.zd for zs in self.zs_list)
self.zg = max(zs.zg for zs in self.zs_list)
self.dd = min(zs.dd for zs in self.zs_list)
self.gg = max(zs.gg for zs in self.zs_list)
self.index = 0 # 由外部设置
+56 -29
View File
@@ -6,7 +6,7 @@ from ChanKLC import ChanKLC
from ChanBI import ChanBI
from ChanSBI import ChanSBI
from ChanSEG import ChanSEG
from ChanZS import ChanZS
from ChanZS import ChanZS, ChanZS_Big
from ChanBSP import ChanBSP
import talib.abstract as ta
import pandas as pd
@@ -46,6 +46,7 @@ class TF_DF():
self.bi_list = self.cal_bi_list(self.klc_list)
self.seg_list = self.get_seg_list(self.bi_list)
self.zs_list = self.get_zs_list(self.bi_list, self.seg_list)
self.big_zs_list = self.get_big_zs_list(self.zs_list)
self.chanmacd = ChanMACD(self.klu_list)
self.klu_list = self.chanmacd.cal_macd_state()
@@ -1945,9 +1946,9 @@ class TF_DF():
overlap = (zg >= last_zs.zd and zd <= last_zs.zg)
if overlap:
# 有重叠,扩展中枢到5根、7根...
# 继续往后检查是否有更多线段与中枢重叠
seg_count = 3
# 有重叠,扩展中枢到5根、7根...(缠论:合并为同一中枢)
# 本组先纳入当前 3 根,再向后逐根尝试;遇到与 [zd,zg] 不重叠(离开中枢)则停止扩展
added_segs = [seg_list[start_idx], seg_list[start_idx + 1], seg_list[start_idx + 2]]
cur_idx = start_idx + 3
while cur_idx < len(seg_list):
@@ -1955,43 +1956,39 @@ class TF_DF():
if not next_seg.is_sure:
break
# 计算包含新线段后的区间
segs = seg_list[start_idx:start_idx + seg_count + 1]
segs.append(next_seg)
seg_highs = [s.high for s in segs]
seg_lows = [s.low for s in segs]
new_zg = min(seg_highs)
new_zd = max(seg_lows)
if new_zg > new_zd:
# 新线段与中枢重叠,扩展
seg_count += 1
cur_idx += 1
else:
# 扩展条件:新线段与中枢区间 [zd, zg] 有重叠即并入;不重叠则停止,离开中枢的线段不包含
# 用起止笔的极值算线段区间,避免 seg.high/seg.low 在个别线段上未同步导致的误判
seg_high = max(next_seg.start_bi.high, next_seg.end_bi.high) if next_seg.end_bi else next_seg.start_bi.high
seg_low = min(next_seg.start_bi.low, next_seg.end_bi.low) if next_seg.end_bi else next_seg.start_bi.low
overlap_with_zs = (seg_high >= last_zs.zd and seg_low <= last_zs.zg)
if not overlap_with_zs:
break
if seg_list[start_idx].dir != seg_list[start_idx + seg_count].dir:
seg_count -= 1
print(seg_count)
# 更新中枢区间为扩展后的范围
segs_for_zs = seg_list[start_idx:start_idx + seg_count]
added_segs.append(next_seg)
cur_idx += 1
# 扩展中枢 = 原中枢线段 + 本组并入的线段(缠论合并)
segs_for_zs = list(last_zs.seg_list) + list(added_segs)
# 中枢开始与结束线段方向一致:上涨中枢结束于 DOWN,下跌中枢结束于 UP
required_end_seg_dir = Chan_SEG_DIR.DOWN if last_zs.dir == Chan_ZS_DIR.DOWN else Chan_SEG_DIR.UP
while len(segs_for_zs) >= 3 and segs_for_zs[-1].dir != required_end_seg_dir:
segs_for_zs.pop()
# 扩展时只更新 gg、dd 和 seg_list;zg、zd 由前 3 根线段确定,不随扩展改变
seg_highs = [s.high for s in segs_for_zs]
seg_lows = [s.low for s in segs_for_zs]
last_zs.set_zg(min(seg_highs))
last_zs.set_zd(max(seg_lows))
last_zs.set_gg(max(seg_highs))
last_zs.set_dd(min(seg_lows))
last_zs.seg_list = segs_for_zs
# 更新结束时间
# 更新结束时间(以裁剪后的最后一段为准)
last_seg = segs_for_zs[-1]
if last_seg.end_bi:
last_zs.set_end_klc(last_seg.end_bi.end_klc, last_seg.sure_time, 0, last_seg)
last_zs.set_end_seg(last_seg)
# 跳过已处理的线段
start_idx += 3
# 跳过本组已扫描的线段(从 start_idx 到 cur_idx-1),下一组从 cur_idx 起可能再形成新中枢
start_idx = cur_idx
continue
else:
# 没有重叠,创建新中枢
@@ -2063,6 +2060,36 @@ class TF_DF():
last_zs.is_sure = True
return zs_list
def get_big_zs_list(self, zs_list):
"""
中枢扩张:将区间重叠的连续中枢合并为大级别中枢,便于显示更大级别的震荡区间。
重叠定义:两中枢 [zd,zg] 有交集,即 (zs_i.zg >= zs_j.zd and zs_i.zd <= zs_j.zg)。
"""
big_list = []
if len(zs_list) < 2:
return big_list
i = 0
while i < len(zs_list):
group = [zs_list[i]]
j = i + 1
while j < len(zs_list):
cur = zs_list[j]
# 与当前组内任一中枢有重叠即算扩张(通常只需与组内最后一个比)
last_in_group = group[-1]
overlap = (last_in_group.zg >= cur.zd and last_in_group.zd <= cur.zg)
if overlap:
group.append(cur)
j += 1
else:
break
if len(group) >= 2:
big = ChanZS_Big(group)
big.index = len(big_list)
big_list.append(big)
i = j if len(group) >= 2 else i + 1
return big_list
def get_klu_list(self, dataframe):
klu_list = self.get_kl_data(dataframe)
#klu_list = self.cal_klu_pattern(klu_list)