添加背离计算
This commit is contained in:
@@ -107,6 +107,13 @@ class Chan_MACDUNITTF_TYPE(Enum):
|
|||||||
START = auto()
|
START = auto()
|
||||||
CROSS0 = auto()
|
CROSS0 = auto()
|
||||||
NEAR0 = auto()
|
NEAR0 = auto()
|
||||||
|
class Chan_MACDUNITTF_JUMP(Enum):
|
||||||
|
CONTUNE = auto()
|
||||||
|
DISCRETE = auto()
|
||||||
|
class Chan_MACDUNITTF_DIV(Enum):
|
||||||
|
CONTUNE = auto()
|
||||||
|
DISCRETE = auto()
|
||||||
|
UNDIV = auto()
|
||||||
class Chan_MACDHISTSET_DIR(Enum):
|
class Chan_MACDHISTSET_DIR(Enum):
|
||||||
ABOVE = auto()
|
ABOVE = auto()
|
||||||
UNDER = auto()
|
UNDER = auto()
|
||||||
|
|||||||
+2
-2
@@ -78,12 +78,12 @@ class ChanKLC():
|
|||||||
self.klc_fx_type = Chan_KLC_FX.BOTTOM4
|
self.klc_fx_type = Chan_KLC_FX.BOTTOM4
|
||||||
if self.fx == Chan_FX_TYPE.TOP:
|
if self.fx == Chan_FX_TYPE.TOP:
|
||||||
#print(self.end_time, self.fx, self.macd, self.macdhist, len(self.klus))
|
#print(self.end_time, self.fx, self.macd, self.macdhist, len(self.klus))
|
||||||
if self.macdhist < 5 and self.macd > 0:
|
if self.macdhist < 0 and self.macd > 0:
|
||||||
self.klc_fx_type = Chan_KLC_FX.TOP5
|
self.klc_fx_type = Chan_KLC_FX.TOP5
|
||||||
self.bb_out = True
|
self.bb_out = True
|
||||||
else:
|
else:
|
||||||
if self.fx == Chan_FX_TYPE.BOTTOM:
|
if self.fx == Chan_FX_TYPE.BOTTOM:
|
||||||
if self.macdhist > -5 and self.macd < 0:
|
if self.macdhist > 0 and self.macd < 0:
|
||||||
self.klc_fx_type = Chan_KLC_FX.BOTTOM5
|
self.klc_fx_type = Chan_KLC_FX.BOTTOM5
|
||||||
self.bb_out = True
|
self.bb_out = True
|
||||||
|
|
||||||
|
|||||||
+58
-59
@@ -22,7 +22,7 @@ class ChanMACD():
|
|||||||
last_seg = None
|
last_seg = None
|
||||||
last_unittf = None
|
last_unittf = None
|
||||||
last_histset = None
|
last_histset = None
|
||||||
|
histset = None
|
||||||
last_klu = None
|
last_klu = None
|
||||||
for klu in self.klu_list:
|
for klu in self.klu_list:
|
||||||
klu.cal_macd_state()
|
klu.cal_macd_state()
|
||||||
@@ -31,80 +31,28 @@ class ChanMACD():
|
|||||||
if klu.macd_state != Chan_MACD_STATE.UNKNOWN:
|
if klu.macd_state != Chan_MACD_STATE.UNKNOWN:
|
||||||
# 初始化首个直方图集合(根据当前柱体正负)
|
# 初始化首个直方图集合(根据当前柱体正负)
|
||||||
if klu.macdhist >= 0:
|
if klu.macdhist >= 0:
|
||||||
histset = ChanMACDHistSet(klu.time, klu, None, Chan_MACDHISTSET_DIR.ABOVE)
|
histset = ChanMACDHistSet(len(self.histset_list), klu.time, klu, None, Chan_MACDHISTSET_DIR.ABOVE)
|
||||||
else:
|
else:
|
||||||
histset = ChanMACDHistSet(klu.time, klu, None, Chan_MACDHISTSET_DIR.UNDER)
|
histset = ChanMACDHistSet(len(self.histset_list), klu.time, klu, None, Chan_MACDHISTSET_DIR.UNDER)
|
||||||
self.histset_list.append(histset)
|
self.histset_list.append(histset)
|
||||||
last_histset = histset
|
last_histset = histset
|
||||||
|
|
||||||
# 初始化首段
|
# 初始化首段
|
||||||
seg_dir = Chan_MACDSEG_DIR.ABOVE if klu.signal >= 0 else Chan_MACDSEG_DIR.UNDER
|
seg_dir = Chan_MACDSEG_DIR.ABOVE if klu.signal >= 0 else Chan_MACDSEG_DIR.UNDER
|
||||||
seg = ChanMACDSeg(klu.time, klu, None, seg_dir)
|
seg = ChanMACDSeg(len(self.seg_list), klu.time, klu, None, seg_dir)
|
||||||
self.seg_list.append(seg)
|
self.seg_list.append(seg)
|
||||||
last_seg = seg
|
last_seg = seg
|
||||||
last_seg.add_histset(histset)
|
last_seg.add_histset(histset)
|
||||||
|
|
||||||
# 初始化首个UnitTF
|
# 初始化首个UnitTF
|
||||||
unittf_dir = Chan_MACDUNITTF_DIR.ABOVE if klu.signal >= 0 else Chan_MACDUNITTF_DIR.UNDER
|
unittf_dir = Chan_MACDUNITTF_DIR.ABOVE if klu.signal >= 0 else Chan_MACDUNITTF_DIR.UNDER
|
||||||
unittf = ChanMACDUnitTF(klu.time, klu, None, unittf_dir, Chan_MACDUNITTF_TYPE.START)
|
unittf = ChanMACDUnitTF(len(self.unittf_list), klu.time, klu, None, unittf_dir, Chan_MACDUNITTF_TYPE.START, histset)
|
||||||
self.unittf_list.append(unittf)
|
self.unittf_list.append(unittf)
|
||||||
unittf.add_histset(histset)
|
|
||||||
last_unittf = unittf
|
last_unittf = unittf
|
||||||
last_unittf.add_histset(histset)
|
|
||||||
last_seg.add_unittf(unittf)
|
last_seg.add_unittf(unittf)
|
||||||
# 未就绪则继续等下一根;已就绪亦已完成首个结构初始化,继续下一根
|
# 未就绪则继续等下一根;已就绪亦已完成首个结构初始化,继续下一根
|
||||||
last_klu = klu
|
last_klu = klu
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 2) 过零切段(使用KLU中的穿越状态)
|
|
||||||
if (klu.macd_state == Chan_MACD_STATE.CROSS0_UP or
|
|
||||||
klu.macd_state == Chan_MACD_STATE.CROSS0_DOWN):
|
|
||||||
# 结束旧 unittf
|
|
||||||
last_unittf.set_end_klu(last_klu, Chan_MACDUNITTF_TYPE.CROSS0)
|
|
||||||
# 新的单位时间周期
|
|
||||||
new_dir = Chan_MACDUNITTF_DIR.UNDER if last_unittf.unittf_dir == Chan_MACDUNITTF_DIR.ABOVE else Chan_MACDUNITTF_DIR.ABOVE
|
|
||||||
unittf = ChanMACDUnitTF(klu.time, klu, last_unittf, new_dir, Chan_MACDUNITTF_TYPE.CROSS0)
|
|
||||||
self.unittf_list.append(unittf)
|
|
||||||
unittf.add_histset(last_histset)
|
|
||||||
last_unittf.set_next(unittf)
|
|
||||||
last_unittf = unittf
|
|
||||||
# 收尾旧段
|
|
||||||
last_seg.set_end_klu(last_klu)
|
|
||||||
# 新段方向取反
|
|
||||||
new_dir = Chan_MACDSEG_DIR.UNDER if last_seg.seg_dir == Chan_MACDSEG_DIR.ABOVE else Chan_MACDSEG_DIR.ABOVE
|
|
||||||
seg = ChanMACDSeg(klu.time, klu, last_seg, new_dir)
|
|
||||||
self.seg_list.append(seg)
|
|
||||||
last_seg.set_next(seg)
|
|
||||||
last_seg = seg
|
|
||||||
last_seg.add_histset(last_histset)
|
|
||||||
last_seg.add_unittf(unittf)
|
|
||||||
else:
|
|
||||||
# 4) UnitTF 状态机:用黄线Signal的归零轴
|
|
||||||
if last_klu.macd_state == Chan_MACD_STATE.NEAR0 and last_unittf.near0_count > 1:
|
|
||||||
if klu.macd_state == Chan_MACD_STATE.RZ_UP:
|
|
||||||
last_unittf.set_end_klu(last_klu, Chan_MACDUNITTF_TYPE.NEAR0)
|
|
||||||
new_dir = Chan_MACDUNITTF_DIR.ABOVE if last_unittf.unittf_dir == Chan_MACDUNITTF_DIR.UNDER else Chan_MACDUNITTF_DIR.UNDER
|
|
||||||
unittf = ChanMACDUnitTF(klu.time, klu, last_unittf, new_dir, Chan_MACDUNITTF_TYPE.NEAR0)
|
|
||||||
self.unittf_list.append(unittf)
|
|
||||||
unittf.add_histset(last_histset)
|
|
||||||
last_unittf.set_next(unittf)
|
|
||||||
last_unittf = unittf
|
|
||||||
last_seg.add_unittf(unittf)
|
|
||||||
elif klu.macd_state == Chan_MACD_STATE.RZ_DOWN:
|
|
||||||
last_unittf.set_end_klu(last_klu, Chan_MACDUNITTF_TYPE.NEAR0)
|
|
||||||
new_dir = Chan_MACDUNITTF_DIR.UNDER if last_unittf.unittf_dir == Chan_MACDUNITTF_DIR.ABOVE else Chan_MACDUNITTF_DIR.ABOVE
|
|
||||||
unittf = ChanMACDUnitTF(klu.time, klu, last_unittf, new_dir, Chan_MACDUNITTF_TYPE.NEAR0)
|
|
||||||
self.unittf_list.append(unittf)
|
|
||||||
unittf.add_histset(last_histset)
|
|
||||||
last_unittf.set_next(unittf)
|
|
||||||
last_unittf = unittf
|
|
||||||
last_seg.add_unittf(unittf)
|
|
||||||
else:
|
|
||||||
last_unittf.add_klu(klu)
|
|
||||||
last_seg.add_klu(klu)
|
|
||||||
else:
|
|
||||||
last_unittf.add_klu(klu)
|
|
||||||
last_seg.add_klu(klu)
|
|
||||||
# 3) 直方图集合(基于当前 unittf)
|
# 3) 直方图集合(基于当前 unittf)
|
||||||
if klu.macdhist >= 0:
|
if klu.macdhist >= 0:
|
||||||
if last_histset and last_histset.histset_dir == Chan_MACDHISTSET_DIR.ABOVE:
|
if last_histset and last_histset.histset_dir == Chan_MACDHISTSET_DIR.ABOVE:
|
||||||
@@ -113,7 +61,7 @@ class ChanMACD():
|
|||||||
# 结束旧 histset(以前一根结束更合理)
|
# 结束旧 histset(以前一根结束更合理)
|
||||||
if last_histset and last_klu:
|
if last_histset and last_klu:
|
||||||
last_histset.set_end_klu(last_klu)
|
last_histset.set_end_klu(last_klu)
|
||||||
histset = ChanMACDHistSet(klu.time, klu, last_histset, Chan_MACDHISTSET_DIR.ABOVE)
|
histset = ChanMACDHistSet(len(self.histset_list), klu.time, klu, last_histset, Chan_MACDHISTSET_DIR.ABOVE)
|
||||||
self.histset_list.append(histset)
|
self.histset_list.append(histset)
|
||||||
if last_histset:
|
if last_histset:
|
||||||
last_histset.set_next(histset)
|
last_histset.set_next(histset)
|
||||||
@@ -129,7 +77,7 @@ class ChanMACD():
|
|||||||
# 结束旧 histset(以前一根结束更合理)
|
# 结束旧 histset(以前一根结束更合理)
|
||||||
if last_histset and last_klu:
|
if last_histset and last_klu:
|
||||||
last_histset.set_end_klu(last_klu)
|
last_histset.set_end_klu(last_klu)
|
||||||
histset = ChanMACDHistSet(klu.time, klu, last_histset, Chan_MACDHISTSET_DIR.UNDER)
|
histset = ChanMACDHistSet(len(self.histset_list), klu.time, klu, last_histset, Chan_MACDHISTSET_DIR.UNDER)
|
||||||
self.histset_list.append(histset)
|
self.histset_list.append(histset)
|
||||||
if last_histset:
|
if last_histset:
|
||||||
last_histset.set_next(histset)
|
last_histset.set_next(histset)
|
||||||
@@ -138,5 +86,56 @@ class ChanMACD():
|
|||||||
last_seg.add_histset(histset)
|
last_seg.add_histset(histset)
|
||||||
if last_unittf:
|
if last_unittf:
|
||||||
last_unittf.add_histset(histset)
|
last_unittf.add_histset(histset)
|
||||||
|
# 2) 过零切段(使用KLU中的穿越状态)
|
||||||
|
if (klu.macd_state == Chan_MACD_STATE.CROSS0_UP or
|
||||||
|
klu.macd_state == Chan_MACD_STATE.CROSS0_DOWN):
|
||||||
|
# 结束旧 unittf
|
||||||
|
last_unittf.set_end_klu(last_klu, Chan_MACDUNITTF_TYPE.CROSS0)
|
||||||
|
# 新的单位时间周期
|
||||||
|
new_dir = Chan_MACDUNITTF_DIR.UNDER if last_unittf.unittf_dir == Chan_MACDUNITTF_DIR.ABOVE else Chan_MACDUNITTF_DIR.ABOVE
|
||||||
|
unittf = ChanMACDUnitTF(len(self.unittf_list), klu.time, klu, last_unittf, new_dir, Chan_MACDUNITTF_TYPE.CROSS0, histset)
|
||||||
|
self.unittf_list.append(unittf)
|
||||||
|
last_unittf.set_next(unittf)
|
||||||
|
last_unittf = unittf
|
||||||
|
# 收尾旧段
|
||||||
|
last_seg.set_end_klu(last_klu)
|
||||||
|
# 新段方向取反
|
||||||
|
new_dir = Chan_MACDSEG_DIR.UNDER if last_seg.seg_dir == Chan_MACDSEG_DIR.ABOVE else Chan_MACDSEG_DIR.ABOVE
|
||||||
|
seg = ChanMACDSeg(len(self.seg_list), klu.time, klu, last_seg, new_dir)
|
||||||
|
self.seg_list.append(seg)
|
||||||
|
last_seg.set_next(seg)
|
||||||
|
last_seg = seg
|
||||||
|
last_seg.add_histset(last_histset)
|
||||||
|
last_seg.add_unittf(unittf)
|
||||||
|
else:
|
||||||
|
# 4) UnitTF 状态机:用黄线Signal的归零轴
|
||||||
|
if last_klu.macd_state == Chan_MACD_STATE.NEAR0 and last_unittf.div_count > 1:
|
||||||
|
#print(klu.time, klu.macd_state)
|
||||||
|
if klu.macd_state == Chan_MACD_STATE.RZ_UP:
|
||||||
|
last_unittf.set_end_klu(last_klu, Chan_MACDUNITTF_TYPE.NEAR0)
|
||||||
|
new_dir = Chan_MACDUNITTF_DIR.ABOVE if klu.signal >= 0 else Chan_MACDUNITTF_DIR.UNDER
|
||||||
|
unittf = ChanMACDUnitTF(len(self.unittf_list), klu.time, klu, last_unittf, new_dir, Chan_MACDUNITTF_TYPE.NEAR0, histset)
|
||||||
|
self.unittf_list.append(unittf)
|
||||||
|
last_unittf.set_next(unittf)
|
||||||
|
last_unittf = unittf
|
||||||
|
last_seg.add_unittf(unittf)
|
||||||
|
elif klu.macd_state == Chan_MACD_STATE.RZ_DOWN:
|
||||||
|
last_unittf.set_end_klu(last_klu, Chan_MACDUNITTF_TYPE.NEAR0)
|
||||||
|
new_dir = Chan_MACDUNITTF_DIR.UNDER if klu.signal >= 0 else Chan_MACDUNITTF_DIR.ABOVE
|
||||||
|
unittf = ChanMACDUnitTF(len(self.unittf_list), klu.time, klu, last_unittf, new_dir, Chan_MACDUNITTF_TYPE.NEAR0, histset)
|
||||||
|
self.unittf_list.append(unittf)
|
||||||
|
last_unittf.set_next(unittf)
|
||||||
|
last_unittf = unittf
|
||||||
|
last_seg.add_unittf(unittf)
|
||||||
|
else:
|
||||||
|
last_unittf.add_klu(klu)
|
||||||
|
last_seg.add_klu(klu)
|
||||||
|
else:
|
||||||
|
last_unittf.add_klu(klu)
|
||||||
|
last_seg.add_klu(klu)
|
||||||
|
|
||||||
last_klu = klu
|
last_klu = klu
|
||||||
|
last_histset.set_end_klu(last_klu)
|
||||||
|
last_unittf.set_end_klu(last_klu, None)
|
||||||
|
last_seg.set_end_klu(last_klu)
|
||||||
return self.klu_list
|
return self.klu_list
|
||||||
+65
-38
@@ -1,7 +1,8 @@
|
|||||||
from ChanEnum import Chan_MACDHISTSET_DIR
|
from ChanEnum import Chan_MACDHISTSET_DIR, Chan_MACDUNITTF_DIV
|
||||||
|
|
||||||
class ChanMACDHistSet():
|
class ChanMACDHistSet():
|
||||||
def __init__(self, start_time, start_klu, pre_histset, dir):
|
def __init__(self, index, start_time, start_klu, pre_histset, dir):
|
||||||
|
self.index = index
|
||||||
self.start_time = start_time
|
self.start_time = start_time
|
||||||
self.end_time = None
|
self.end_time = None
|
||||||
self.klu_list = []
|
self.klu_list = []
|
||||||
@@ -10,42 +11,80 @@ class ChanMACDHistSet():
|
|||||||
self.next = None
|
self.next = None
|
||||||
self.pre = pre_histset
|
self.pre = pre_histset
|
||||||
self.peak_klu = None
|
self.peak_klu = None
|
||||||
self.div_klu = None
|
self.second_peak_klu = None
|
||||||
self.area = start_klu.macdhist
|
self.area = start_klu.macdhist
|
||||||
self.unittf_div = False
|
self.unittf_div = Chan_MACDUNITTF_DIV.UNDIV
|
||||||
|
self.middle_klu = None
|
||||||
|
self.middle_peak = None
|
||||||
|
self.second_middle_peak = None
|
||||||
|
self.div_count = 0
|
||||||
|
self.last_klu = start_klu
|
||||||
|
self.low_klu = None
|
||||||
|
self.start_klu = start_klu
|
||||||
def set_next(self, next_histset):
|
def set_next(self, next_histset):
|
||||||
self.next = next_histset
|
self.next = next_histset
|
||||||
|
def set_middle_klu(self, middle_klu):
|
||||||
|
self.middle_klu = middle_klu
|
||||||
def set_unittf_div(self, unittf_div):
|
def set_unittf_div(self, unittf_div):
|
||||||
self.unittf_div = unittf_div
|
self.unittf_div = unittf_div
|
||||||
def add_klu(self, klu):
|
def add_klu(self, klu):
|
||||||
klu.set_histset(self)
|
klu.set_histset(self)
|
||||||
if self.histset_dir == Chan_MACDHISTSET_DIR.ABOVE:
|
|
||||||
if self.peak_klu:
|
|
||||||
if klu.macdhist > self.peak_klu.macdhist:
|
|
||||||
self.peak_klu = klu
|
|
||||||
if klu.macdhist > self.klu_list[-1].macdhist and klu.macdhist < self.peak_klu.macdhist:
|
|
||||||
self.div_klu = klu
|
|
||||||
else:
|
|
||||||
if len(self.klu_list) > 0:
|
|
||||||
pre_klu = self.klu_list[-1]
|
|
||||||
if pre_klu.macdhist < klu.macdhist:
|
|
||||||
self.peak_klu = klu
|
|
||||||
else:
|
|
||||||
if self.peak_klu:
|
|
||||||
if klu.macdhist < self.peak_klu.macdhist:
|
|
||||||
self.peak_klu = klu
|
|
||||||
if klu.macdhist < self.klu_list[-1].macdhist and klu.macdhist > self.peak_klu.macdhist:
|
|
||||||
self.div_klu = klu
|
|
||||||
else:
|
|
||||||
if len(self.klu_list) > 0:
|
|
||||||
pre_klu = self.klu_list[-1]
|
|
||||||
if pre_klu.macdhist > klu.macdhist:
|
|
||||||
self.peak_klu = klu
|
|
||||||
self.klu_list.append(klu)
|
self.klu_list.append(klu)
|
||||||
self.area += klu.macdhist
|
self.area += klu.macdhist
|
||||||
|
if self.middle_klu and self.middle_klu.index + 1 == klu.index:
|
||||||
|
self.low_klu = None
|
||||||
|
self.peak_klu = None
|
||||||
|
self.div_count = 0
|
||||||
|
else:
|
||||||
|
if self.last_klu:
|
||||||
|
self.cal_peak_klu(klu)
|
||||||
|
self.last_klu = klu
|
||||||
|
def cal_peak_klu(self, klu):
|
||||||
|
if self.middle_klu:
|
||||||
|
if self.low_klu is None and abs(klu.macdhist) > abs(self.last_klu.macdhist):
|
||||||
|
self.low_klu = self.last_klu
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if self.peak_klu is None and self.low_klu and abs(klu.macdhist) < abs(self.last_klu.macdhist):
|
||||||
|
self.peak_klu = self.last_klu
|
||||||
|
self.low_klu = None
|
||||||
|
elif self.low_klu and self.peak_klu:
|
||||||
|
if abs(self.last_klu.macdhist) > abs(self.peak_klu.macdhist):
|
||||||
|
self.peak_klu = self.last_klu
|
||||||
|
self.low_klu = None
|
||||||
|
elif abs(self.last_klu.macdhist) > abs(klu.macdhist):
|
||||||
|
self.second_peak_klu = self.last_klu
|
||||||
|
self.div_count += 1
|
||||||
|
self.low_klu = None
|
||||||
|
else:
|
||||||
|
if self.peak_klu is None and abs(klu.macdhist) < abs(self.last_klu.macdhist):
|
||||||
|
self.peak_klu = self.last_klu
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if self.low_klu is None and self.peak_klu and abs(klu.macdhist) > abs(self.last_klu.macdhist):
|
||||||
|
self.low_klu = self.last_klu
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if self.peak_klu and self.low_klu:
|
||||||
|
if abs(self.last_klu.macdhist) > abs(self.peak_klu.macdhist):
|
||||||
|
self.peak_klu = self.last_klu
|
||||||
|
self.low_klu = None
|
||||||
|
elif abs(self.last_klu.macdhist) > abs(klu.macdhist):
|
||||||
|
self.second_peak_klu = self.last_klu
|
||||||
|
self.div_count += 1
|
||||||
|
self.low_klu = None
|
||||||
def set_end_klu(self, end_klu):
|
def set_end_klu(self, end_klu):
|
||||||
self.end_klu = end_klu
|
self.end_klu = end_klu
|
||||||
self.end_time = end_klu.time
|
self.end_time = end_klu.time
|
||||||
|
if self.start_klu.index == end_klu.index:
|
||||||
|
self.peak_klu = self.start_klu
|
||||||
|
if self.start_klu.index + 1 == end_klu.index:
|
||||||
|
if abs(self.start_klu.macdhist) > abs(end_klu.macdhist):
|
||||||
|
self.peak_klu = self.start_klu
|
||||||
|
else:
|
||||||
|
self.peak_klu = end_klu
|
||||||
|
#if self.div_count > 0:
|
||||||
|
#print("Continue:", self.index, self.start_time, self.second_peak_klu.time, self.div_count)
|
||||||
"""
|
"""
|
||||||
if self.div_klu:
|
if self.div_klu:
|
||||||
print(self.start_time, self.peak_klu.time, self.div_klu.time, self.klu_list[-1].time, len(self.klu_list), self.histset_dir)
|
print(self.start_time, self.peak_klu.time, self.div_klu.time, self.klu_list[-1].time, len(self.klu_list), self.histset_dir)
|
||||||
@@ -54,15 +93,3 @@ class ChanMACDHistSet():
|
|||||||
else:
|
else:
|
||||||
print(self.start_time, "None", self.klu_list[-1].time, len(self.klu_list), self.histset_dir)
|
print(self.start_time, "None", self.klu_list[-1].time, len(self.klu_list), self.histset_dir)
|
||||||
"""
|
"""
|
||||||
def find_peak_from(self, from_klu):
|
|
||||||
peak_klu = None
|
|
||||||
if from_klu in self.klu_list:
|
|
||||||
for i in range(from_klu.index + 1, len(self.klu_list)):
|
|
||||||
klu = self.klu_list[i]
|
|
||||||
if peak_klu:
|
|
||||||
if abs(peak_klu.macdhist) < abs(klu.macdhist):
|
|
||||||
peak_klu = klu
|
|
||||||
else:
|
|
||||||
if abs(self.klu_list[i-1].macdhist) < abs(klu.macdhist):
|
|
||||||
peak_klu = klu
|
|
||||||
return peak_klu
|
|
||||||
+2
-1
@@ -2,7 +2,8 @@ from ChanEnum import Chan_MACDSEG_DIR
|
|||||||
|
|
||||||
|
|
||||||
class ChanMACDSeg():
|
class ChanMACDSeg():
|
||||||
def __init__(self, start_time, start_klu, pre_seg, seg_dir):
|
def __init__(self, index, start_time, start_klu, pre_seg, seg_dir):
|
||||||
|
self.index = index
|
||||||
self.start_time = start_time
|
self.start_time = start_time
|
||||||
self.end_time = None
|
self.end_time = None
|
||||||
self.start_klu = start_klu
|
self.start_klu = start_klu
|
||||||
|
|||||||
+58
-10
@@ -1,8 +1,9 @@
|
|||||||
from ChanEnum import Chan_MACD_STATE, Chan_MACDUNITTF_DIR, Chan_MACDHISTSET_DIR
|
from ChanEnum import Chan_MACD_STATE, Chan_MACDUNITTF_DIR, Chan_MACDHISTSET_DIR, Chan_MACDUNITTF_DIV
|
||||||
|
|
||||||
|
|
||||||
class ChanMACDUnitTF():
|
class ChanMACDUnitTF():
|
||||||
def __init__(self, start_time, start_klu, pre_unittf, dir, start_type):
|
def __init__(self, index, start_time, start_klu, pre_unittf, dir, start_type, start_histset):
|
||||||
|
self.index = index
|
||||||
self.start_time = start_time
|
self.start_time = start_time
|
||||||
self.end_time = None
|
self.end_time = None
|
||||||
self.start_klu = start_klu
|
self.start_klu = start_klu
|
||||||
@@ -10,13 +11,19 @@ class ChanMACDUnitTF():
|
|||||||
self.klu_list = []
|
self.klu_list = []
|
||||||
self.klu_list.append(start_klu)
|
self.klu_list.append(start_klu)
|
||||||
self.histset_list = []
|
self.histset_list = []
|
||||||
|
self.histset_list.append(start_histset)
|
||||||
|
self.div_count = 0
|
||||||
|
start_histset.set_middle_klu(start_klu)
|
||||||
self.next = None
|
self.next = None
|
||||||
self.pre = pre_unittf
|
self.pre = pre_unittf
|
||||||
self.unittf_dir = dir
|
self.unittf_dir = dir
|
||||||
self.start_type = start_type
|
self.start_type = start_type
|
||||||
self.end_type = None
|
self.end_type = None
|
||||||
self.near0_count = 1
|
|
||||||
self.peak_klu = None
|
self.peak_klu = None
|
||||||
|
self.div_type = Chan_MACDUNITTF_DIV.UNDIV
|
||||||
|
self.div_peak_list = []
|
||||||
|
self.div_low_list = []
|
||||||
|
self.rev_low_klu = None
|
||||||
def set_next(self, next_unittf):
|
def set_next(self, next_unittf):
|
||||||
self.next = next_unittf
|
self.next = next_unittf
|
||||||
def add_histset(self, histset):
|
def add_histset(self, histset):
|
||||||
@@ -25,21 +32,62 @@ class ChanMACDUnitTF():
|
|||||||
self.klu_list.append(klu)
|
self.klu_list.append(klu)
|
||||||
self.cal_peak_div()
|
self.cal_peak_div()
|
||||||
def cal_peak_div(self):
|
def cal_peak_div(self):
|
||||||
|
self.div_count = 0
|
||||||
|
self.div_peak_list = []
|
||||||
|
self.div_low_list = []
|
||||||
|
self.rev_low_klu = None
|
||||||
|
self.peak_klu = None
|
||||||
|
if len(self.histset_list) == 0:
|
||||||
|
return
|
||||||
if len(self.histset_list) == 1:
|
if len(self.histset_list) == 1:
|
||||||
self.peak_klu = self.histset_list[0].find_peak_from(self.start_klu)
|
self.div_type = self.histset_list[0].unittf_div
|
||||||
|
self.peak_klu = self.histset_list[0].peak_klu
|
||||||
else:
|
else:
|
||||||
for histset in self.histset_list:
|
for index in range(0, len(self.histset_list)):
|
||||||
if histset.peak_klu and self.peak_klu:
|
histset = self.histset_list[index]
|
||||||
if abs(histset.peak_klu.macdhist) > abs(self.peak_klu.macdhist):
|
if self.same_dir(histset):
|
||||||
|
if self.peak_klu:
|
||||||
|
if histset.peak_klu and histset.end_time:
|
||||||
|
if abs(histset.peak_klu.macdhist) >= abs(self.peak_klu.macdhist):
|
||||||
|
self.peak_klu = histset.peak_klu
|
||||||
|
self.div_type = Chan_MACDUNITTF_DIV.UNDIV
|
||||||
|
self.div_count = 0
|
||||||
|
else:
|
||||||
|
self.div_type = Chan_MACDUNITTF_DIV.DISCRETE
|
||||||
|
self.div_count += 1
|
||||||
|
self.div_peak_list.append(histset.peak_klu)
|
||||||
|
else:
|
||||||
|
if histset.peak_klu:
|
||||||
self.peak_klu = histset.peak_klu
|
self.peak_klu = histset.peak_klu
|
||||||
else:
|
else:
|
||||||
histset.set_unittf_div(True)
|
if self.rev_low_klu:
|
||||||
|
if histset.low_klu:
|
||||||
|
if abs(histset.low_klu.macdhist) < abs(self.rev_low_klu.macdhist):
|
||||||
|
self.rev_low_klu = histset.low_klu
|
||||||
|
self.div_low_list.append(histset.low_klu)
|
||||||
|
else:
|
||||||
|
if histset.low_klu:
|
||||||
|
self.rev_low_klu = histset.low_klu
|
||||||
|
self.div_low_list.append(histset.low_klu)
|
||||||
|
def same_dir(self, histset):
|
||||||
|
if self.unittf_dir == Chan_MACDUNITTF_DIR.ABOVE:
|
||||||
|
return histset.histset_dir == Chan_MACDHISTSET_DIR.ABOVE
|
||||||
|
else:
|
||||||
|
return histset.histset_dir == Chan_MACDHISTSET_DIR.UNDER
|
||||||
def set_end_klu(self, end_klu, end_type):
|
def set_end_klu(self, end_klu, end_type):
|
||||||
self.add_klu(end_klu)
|
self.add_klu(end_klu)
|
||||||
self.end_type = end_type
|
self.end_type = end_type
|
||||||
self.end_klu = end_klu
|
self.end_klu = end_klu
|
||||||
self.end_time = end_klu.time
|
self.end_time = end_klu.time
|
||||||
|
div_time = ""
|
||||||
|
for div in self.div_peak_list:
|
||||||
|
div_time += f"{div.time}, "
|
||||||
|
histset_time = ""
|
||||||
|
for histset in self.histset_list:
|
||||||
|
histset_time += f"{histset.start_time}, "
|
||||||
|
|
||||||
if self.peak_klu:
|
if self.peak_klu:
|
||||||
print(self.start_klu.time, self.peak_klu.time)
|
print(self.index, self.start_klu.time, self.peak_klu.time, self.div_count, self.div_type, div_time, len(self.histset_list))
|
||||||
else:
|
else:
|
||||||
print("None", len(self.histset_list))
|
print(self.index, "None", len(self.histset_list))
|
||||||
|
|
||||||
@@ -5081,7 +5081,7 @@
|
|||||||
if (fx.fx_strength < 1.0) { // 降低阈值,让更多分型显示
|
if (fx.fx_strength < 1.0) { // 降低阈值,让更多分型显示
|
||||||
displayText = fx.fx_strength >= 0.8 ? '' : '' // 0.8以上显示点,0.8以下不显示文本
|
displayText = fx.fx_strength >= 0.8 ? '' : '' // 0.8以上显示点,0.8以下不显示文本
|
||||||
}
|
}
|
||||||
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("1", "").replace("2", "").replace("3", "");
|
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("11", "").replace("21", "").replace("31", "").replace("4", "").replace("5", "");
|
||||||
// 添加标记配置
|
// 添加标记配置
|
||||||
const markerConfig = {
|
const markerConfig = {
|
||||||
time: timestamp,
|
time: timestamp,
|
||||||
@@ -5145,7 +5145,7 @@
|
|||||||
if (fx.fx_strength < 1.0) { // 降低阈值,让更多分型显示
|
if (fx.fx_strength < 1.0) { // 降低阈值,让更多分型显示
|
||||||
displayText = fx.fx_strength >= 1.5 ? '' : '' // 0.8以上显示点,0.8以下不显示文本
|
displayText = fx.fx_strength >= 1.5 ? '' : '' // 0.8以上显示点,0.8以下不显示文本
|
||||||
}
|
}
|
||||||
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("1", "").replace("2", "").replace("3", "");
|
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("11", "").replace("21", "").replace("31", "").replace("4", "").replace("5", "");
|
||||||
// 添加标记配置
|
// 添加标记配置
|
||||||
const markerConfig = {
|
const markerConfig = {
|
||||||
time: timestamp,
|
time: timestamp,
|
||||||
@@ -5229,7 +5229,7 @@
|
|||||||
if (fx.fx_strength < 1.0){ // 调整小周期阈值
|
if (fx.fx_strength < 1.0){ // 调整小周期阈值
|
||||||
displayText = fx.fx_strength >= 0.6 ? '' : '' // 0.6以上显示点
|
displayText = fx.fx_strength >= 0.6 ? '' : '' // 0.6以上显示点
|
||||||
}
|
}
|
||||||
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("1", "").replace("2", "").replace("3", "");
|
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("11", "").replace("21", "").replace("31", "").replace("4", "").replace("5", "");
|
||||||
// 小周期分型标记配置
|
// 小周期分型标记配置
|
||||||
const markerConfig = {
|
const markerConfig = {
|
||||||
time: timestamp,
|
time: timestamp,
|
||||||
@@ -5285,7 +5285,7 @@
|
|||||||
if (fx.fx_strength < 2.0){ // 调整小周期阈值
|
if (fx.fx_strength < 2.0){ // 调整小周期阈值
|
||||||
displayText = fx.fx_strength >= 1.5 ? '' : '' // 0.6以上显示点
|
displayText = fx.fx_strength >= 1.5 ? '' : '' // 0.6以上显示点
|
||||||
}
|
}
|
||||||
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("1", "").replace("2", "").replace("3", "");
|
displayText = fx.fx_type.replace("TOP", "").replace("BOTTOM", "").replace("11", "").replace("21", "").replace("31", "").replace("4", "").replace("5", "");
|
||||||
// 小周期KLU分型标记配置
|
// 小周期KLU分型标记配置
|
||||||
const markerConfig = {
|
const markerConfig = {
|
||||||
time: timestamp,
|
time: timestamp,
|
||||||
|
|||||||
Reference in New Issue
Block a user