中枢终于画对了,可以交易了
This commit is contained in:
@@ -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 # 由外部设置
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user