from ChanEnum import Chan_MACDHISTSET_DIR, Chan_MACDUNITTF_DIV, Chan_MACD_STATE class ChanMACDHistSet(): def __init__(self, index, start_time, start_klu, pre_histset, dir): self.index = index self.start_time = start_time self.end_time = None self.klu_list = [] self.klu_list.append(start_klu) self.histset_dir = dir self.next = None self.pre = pre_histset self.peak_klu = None self.area = start_klu.macdhist self.unittf_div = Chan_MACDUNITTF_DIV.UNDIV self.middle_klu = None self.div_count = 0 self.last_klu = start_klu self.start_klu = start_klu self.peak_div_list = [] self.middle_area = 0 self.total_macdhist = 0 def set_next(self, next_histset): self.next = next_histset def set_pre(self, pre_histset): self.pre = pre_histset def set_middle_klu(self, middle_klu): self.middle_klu = middle_klu #self.middle_area = abs(middle_klu.macdhist) #self.middle_klu = None def set_unittf_div(self, unittf_div): self.unittf_div = unittf_div def add_klu(self, klu): klu.set_histset(self) self.klu_list.append(klu) self.area += abs(klu.macdhist) if self.middle_klu: self.middle_area += abs(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 self.peak_div_list = [] else: if self.last_klu: self.cal_macdhist_klu(klu) self.last_klu = klu def cal_macdhist_klu(self, klu): if self.middle_klu: if klu.index >= self.middle_klu.index + 2: if klu.pre.pre: if abs(klu.pre.macdhist) > abs(klu.pre.pre.macdhist) and abs(klu.pre.macdhist) > abs(klu.macdhist): if self.peak_klu: if abs(klu.pre.macdhist) > abs(self.peak_klu.macdhist): self.peak_klu = klu.pre #self.div_count = 0 #self.peak_div_list = [] else: if klu.pre.macd * klu.pre.macdhist > 0: self.peak_div_list.append(klu.pre) self.div_count += 1 klu.pre.continue_div = True else: self.peak_klu = klu.pre else: if len(self.klu_list) >= 3: if klu.pre.pre: if abs(klu.pre.macdhist) > abs(klu.pre.pre.macdhist) and abs(klu.pre.macdhist) > abs(klu.macdhist): if self.peak_klu: if abs(klu.pre.macdhist) > abs(self.peak_klu.macdhist): self.peak_klu = klu.pre #self.div_count = 0 #self.peak_div_list = [] else: if klu.pre.macd * klu.pre.macdhist > 0 and klu.pre.signal * klu.pre.macdhist > 0: self.peak_div_list.append(klu.pre) self.div_count += 1 klu.pre.continue_div = True else: self.peak_klu = klu.pre def set_end_klu(self, end_klu): self.end_klu = end_klu self.end_time = end_klu.time #if len(self.peak_div_list) > 0: #klu = self.peak_div_list[-1] #if klu.macd * klu.macdhist > 0: #end_klu.continue_div = True #print(end_klu.time, "Continue Div") 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 len(self.klu_list) >= 3 and self.peak_klu == None: self.peak_klu = self.klu_list[0] for klu in self.klu_list: if abs(klu.macdhist) > abs(self.peak_klu.macdhist): self.peak_klu = klu peak_str = "" state_str = "" for peak_div in self.peak_div_list: peak_str += f"{peak_div.time}, " state_str += f"{peak_div.macd_state}, " total_macdhist = 0 first_klu = self.klu_list[0] last_klu = self.klu_list[-1] if (first_klu.macd > 0 and last_klu.macd > 0 and first_klu.macdhist > 0) or (first_klu.macd < 0 and last_klu.macd < 0 and first_klu.macdhist < 0): for klu in self.klu_list: self.total_macdhist += klu.macdhist if abs(self.total_macdhist) < 150: #print(self.end_time, "Total MACDHist: ", self.total_macdhist) last_klu.separate_div = 99999 #if self.peak_klu and len(self.peak_div_list) > 0: #print("Continue Div: ",self.start_time, "Peak:", self.peak_klu.time, "Div: ", peak_str, state_str)