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

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
+19
View File
@@ -70,3 +70,22 @@ class ChanZS():
self.gg = gg self.gg = gg
def set_dd(self, dd): 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 ChanBI import ChanBI
from ChanSBI import ChanSBI from ChanSBI import ChanSBI
from ChanSEG import ChanSEG from ChanSEG import ChanSEG
from ChanZS import ChanZS from ChanZS import ChanZS, ChanZS_Big
from ChanBSP import ChanBSP from ChanBSP import ChanBSP
import talib.abstract as ta import talib.abstract as ta
import pandas as pd import pandas as pd
@@ -46,6 +46,7 @@ class TF_DF():
self.bi_list = self.cal_bi_list(self.klc_list) self.bi_list = self.cal_bi_list(self.klc_list)
self.seg_list = self.get_seg_list(self.bi_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.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.chanmacd = ChanMACD(self.klu_list)
self.klu_list = self.chanmacd.cal_macd_state() 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) overlap = (zg >= last_zs.zd and zd <= last_zs.zg)
if overlap: if overlap:
# 有重叠,扩展中枢到5根、7根... # 有重叠,扩展中枢到5根、7根...(缠论:合并为同一中枢)
# 继续往后检查是否有更多线段与中枢重叠 # 本组先纳入当前 3 根,再向后逐根尝试;遇到与 [zd,zg] 不重叠(离开中枢)则停止扩展
seg_count = 3 added_segs = [seg_list[start_idx], seg_list[start_idx + 1], seg_list[start_idx + 2]]
cur_idx = start_idx + 3 cur_idx = start_idx + 3
while cur_idx < len(seg_list): while cur_idx < len(seg_list):
@@ -1955,43 +1956,39 @@ class TF_DF():
if not next_seg.is_sure: if not next_seg.is_sure:
break break
# 计算包含新线段后的区间 # 扩展条件:新线段与中枢区间 [zd, zg] 有重叠即并入;不重叠则停止,离开中枢的线段不包含
segs = seg_list[start_idx:start_idx + seg_count + 1] # 用起止笔的极值算线段区间,避免 seg.high/seg.low 在个别线段上未同步导致的误判
segs.append(next_seg) 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
seg_highs = [s.high for s in segs] overlap_with_zs = (seg_high >= last_zs.zd and seg_low <= last_zs.zg)
seg_lows = [s.low for s in segs] if not overlap_with_zs:
new_zg = min(seg_highs)
new_zd = max(seg_lows)
if new_zg > new_zd:
# 新线段与中枢重叠,扩展
seg_count += 1
cur_idx += 1
else:
break break
if seg_list[start_idx].dir != seg_list[start_idx + seg_count].dir: added_segs.append(next_seg)
seg_count -= 1 cur_idx += 1
print(seg_count)
# 更新中枢区间为扩展后的范围 # 扩展中枢 = 原中枢线段 + 本组并入的线段(缠论合并)
segs_for_zs = seg_list[start_idx:start_idx + seg_count] 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_highs = [s.high for s in segs_for_zs]
seg_lows = [s.low 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_gg(max(seg_highs))
last_zs.set_dd(min(seg_lows)) last_zs.set_dd(min(seg_lows))
last_zs.seg_list = segs_for_zs last_zs.seg_list = segs_for_zs
# 更新结束时间 # 更新结束时间(以裁剪后的最后一段为准)
last_seg = segs_for_zs[-1] last_seg = segs_for_zs[-1]
if last_seg.end_bi: 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_klc(last_seg.end_bi.end_klc, last_seg.sure_time, 0, last_seg)
last_zs.set_end_seg(last_seg) last_zs.set_end_seg(last_seg)
# 跳过已处理的线段 # 跳过本组已扫描的线段(从 start_idx 到 cur_idx-1),下一组从 cur_idx 起可能再形成新中枢
start_idx += 3 start_idx = cur_idx
continue continue
else: else:
# 没有重叠,创建新中枢 # 没有重叠,创建新中枢
@@ -2063,6 +2060,36 @@ class TF_DF():
last_zs.is_sure = True last_zs.is_sure = True
return zs_list 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): def get_klu_list(self, dataframe):
klu_list = self.get_kl_data(dataframe) klu_list = self.get_kl_data(dataframe)
#klu_list = self.cal_klu_pattern(klu_list) #klu_list = self.cal_klu_pattern(klu_list)