117 lines
5.4 KiB
Python
117 lines
5.4 KiB
Python
from ChanKLU import ChanKLU
|
|
from ChanEnum import Chan_MACD_STATE, Chan_MACDSEG_DIR, Chan_MACDHISTSET_DIR
|
|
from ChanMACDSeg import ChanMACDSeg
|
|
from ChanMACDUnitTF import ChanMACDUnitTF
|
|
from ChanMACDHistSet import ChanMACDHistSet
|
|
|
|
class ChanMACD():
|
|
def __init__(self, klu_list: list[ChanKLU]):
|
|
self.klu_list = klu_list
|
|
self.seg_list = []
|
|
self.unittf_list = []
|
|
self.histset_list = []
|
|
self.cal_macd()
|
|
def cal_macd(self):
|
|
last_seg = None
|
|
last_unittf = None
|
|
last_histset = None
|
|
|
|
last_klu = None
|
|
for klu in self.klu_list:
|
|
klu.cal_macd_state()
|
|
|
|
# 1) 只有当 MACD 已可用(非 UNKNOWN)时,才开始初始化段/单元
|
|
if last_seg is None:
|
|
if klu.macd_state != Chan_MACD_STATE.UNKNOWN:
|
|
# 初始化首段与首单元
|
|
seg_dir = Chan_MACDSEG_DIR.ABOVE if klu.macd >= 0 else Chan_MACDSEG_DIR.UNDER
|
|
seg = ChanMACDSeg(klu.time, klu, None, seg_dir)
|
|
self.seg_list.append(seg)
|
|
last_seg = seg
|
|
|
|
unittf = ChanMACDUnitTF(klu.time, klu, None, None)
|
|
self.unittf_list.append(unittf)
|
|
last_unittf = unittf
|
|
|
|
# 初始化首个直方图集合(根据当前柱体正负)
|
|
if klu.macdhist >= 0:
|
|
histset = ChanMACDHistSet(klu.time, klu, last_unittf, Chan_MACDHISTSET_DIR.ABOVE)
|
|
else:
|
|
histset = ChanMACDHistSet(klu.time, klu, last_unittf, Chan_MACDHISTSET_DIR.UNDER)
|
|
self.histset_list.append(histset)
|
|
last_histset = histset
|
|
last_seg.add_histset(histset)
|
|
last_unittf.add_histset(histset)
|
|
last_seg.add_unittf(unittf)
|
|
# 未就绪则继续等下一根;已就绪亦已完成首个结构初始化,继续下一根
|
|
last_klu = klu
|
|
continue
|
|
|
|
# 2) 过零切段/切单元
|
|
if klu.macd_state == Chan_MACD_STATE.CROSS0:
|
|
# 收尾旧段
|
|
last_seg.end_klu = last_klu
|
|
last_seg.end_time = last_klu.time
|
|
# 新段方向取反
|
|
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
|
|
|
|
# 切换 unit tf(以当前histset收尾为边界)
|
|
unittf = ChanMACDUnitTF(klu.time, klu, last_histset, None)
|
|
self.unittf_list.append(unittf)
|
|
if last_unittf:
|
|
last_unittf.end_klu = last_klu
|
|
last_unittf.end_time = last_klu.time
|
|
last_unittf.set_next(unittf)
|
|
last_unittf = unittf
|
|
|
|
# 3) 直方图集合(基于当前 unittf)
|
|
if klu.macdhist >= 0:
|
|
if last_histset and last_histset.histset_dir == Chan_MACDHISTSET_DIR.ABOVE:
|
|
last_histset.add_klu(klu)
|
|
else:
|
|
# 结束旧 histset(以前一根结束更合理)
|
|
if last_histset:
|
|
end_klu = getattr(klu, 'pre', None) or klu
|
|
last_histset.end_klu = end_klu
|
|
last_histset.end_time = end_klu.time
|
|
histset = ChanMACDHistSet(klu.time, klu, last_unittf, Chan_MACDHISTSET_DIR.ABOVE)
|
|
self.histset_list.append(histset)
|
|
if last_histset:
|
|
last_histset.set_next(histset)
|
|
last_histset = histset
|
|
if last_seg:
|
|
last_seg.add_histset(histset)
|
|
if last_unittf:
|
|
last_unittf.add_histset(histset)
|
|
else:
|
|
if last_histset and last_histset.histset_dir == Chan_MACDHISTSET_DIR.UNDER:
|
|
last_histset.add_klu(klu)
|
|
else:
|
|
if last_histset:
|
|
end_klu = getattr(klu, 'pre', None) or klu
|
|
last_histset.end_klu = end_klu
|
|
last_histset.end_time = end_klu.time
|
|
histset = ChanMACDHistSet(klu.time, klu, last_unittf, Chan_MACDHISTSET_DIR.UNDER)
|
|
self.histset_list.append(histset)
|
|
if last_histset:
|
|
last_histset.set_next(histset)
|
|
last_histset = histset
|
|
if last_seg:
|
|
last_seg.add_histset(histset)
|
|
if last_unittf:
|
|
last_unittf.add_histset(histset)
|
|
last_klu = klu
|
|
# 循环结束后,收尾当前打开的结构
|
|
if last_seg and getattr(last_seg, 'end_klu', None) is None:
|
|
last_seg.end_klu = last_klu
|
|
last_seg.end_time = last_klu.time
|
|
if last_unittf and getattr(last_unittf, 'end_klu', None) is None:
|
|
last_unittf.end_klu = last_klu
|
|
last_unittf.end_time = last_klu.time
|
|
if last_histset and getattr(last_histset, 'end_klu', None) is None:
|
|
last_histset.end_klu = last_klu
|
|
last_histset.end_time = last_klu.time |