Add Continue Div and Cross Div

This commit is contained in:
jackyu66git
2025-09-04 19:52:01 +08:00
parent 5c0ad516a3
commit 164db4ab51
8 changed files with 318 additions and 143 deletions
+61 -22
View File
@@ -1,8 +1,8 @@
from ChanEnum import Chan_MACD_STATE, Chan_MACDUNITTF_DIR, Chan_MACDHISTSET_DIR, Chan_MACDUNITTF_DIV
from ChanEnum import Chan_MACD_STATE, Chan_MACDUNITTF_DIR, Chan_MACDHISTSET_DIR, Chan_MACDUNITTF_DIV, Chan_MACDUNITTF_TYPE
class ChanMACDUnitTF():
def __init__(self, index, start_time, start_klu, pre_unittf, dir, start_type, start_histset):
def __init__(self, index, start_time, start_klu, pre_unittf, unittf_dir, start_type, start_histset):
self.index = index
self.start_time = start_time
self.end_time = None
@@ -16,26 +16,26 @@ class ChanMACDUnitTF():
start_histset.set_middle_klu(start_klu)
self.next = None
self.pre = pre_unittf
self.unittf_dir = dir
self.unittf_dir = unittf_dir
self.start_type = start_type
self.end_type = 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
self.is_end = False
def set_next(self, next_unittf):
self.next = next_unittf
def set_pre(self, pre_unittf):
self.pre = pre_unittf
def add_histset(self, histset):
self.histset_list.append(histset)
def add_klu(self, klu):
self.klu_list.append(klu)
self.cal_peak_div()
self.cal_macd_state()
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
@@ -59,26 +59,66 @@ class ChanMACDUnitTF():
else:
if histset.peak_klu:
self.peak_klu = histset.peak_klu
else:
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 cal_macd_state(self):
if len(self.klu_list) > 0:
last_klu = self.klu_list[0]
macd_peak_klu = None
signal_peak_klu = None
for index in range(1, len(self.klu_list)):
klu = self.klu_list[index]
if klu.macd == 0 and klu.signal == 0 and klu.macdhist == 0:
continue
if self.start_type == Chan_MACDUNITTF_TYPE.CROSS0 or self.start_type == Chan_MACDUNITTF_TYPE.NEAR0:
if self.unittf_dir == Chan_MACDUNITTF_DIR.ABOVE:
if macd_peak_klu is None:
if last_klu.macd < klu.macd:
if last_klu.signal < last_klu.macdhist:
last_klu.set_macd_state(Chan_MACD_STATE.UP)
else:
last_klu.set_macd_state(Chan_MACD_STATE.HIGH)
else:
macd_peak_klu = last_klu
last_klu.set_macd_state(Chan_MACD_STATE.PEAK)
elif klu.macd > macd_peak_klu.macd:
macd_peak_klu = None
last_klu.set_macd_state(Chan_MACD_STATE.HIGH)
elif last_klu.signal < klu.signal:
last_klu.set_macd_state(Chan_MACD_STATE.HIGH_EMPTY)
elif signal_peak_klu is None:
signal_peak_klu = last_klu
last_klu.set_macd_state(Chan_MACD_STATE.HIGH_EMPTY)
elif klu.signal > signal_peak_klu.signal:
signal_peak_klu = None
last_klu.set_macd_state(Chan_MACD_STATE.HIGH)
elif last_klu.macd < last_klu.signal:
last_klu.set_macd_state(Chan_MACD_STATE.RETURN_ZERO)
if self.return_zero(last_klu, klu):
self.end_type = Chan_MACDUNITTF_TYPE.NEAR0
self.is_end = True
self.end_klu = klu
self.end_time = klu.time
klu.set_macd_state(Chan_MACD_STATE.NEAR0)
#print(self.index, last_klu.time, last_klu.macd, last_klu.signal, last_klu.macd_state, klu.macd_state)
break
#print(self.index, last_klu.time, last_klu.macd, last_klu.signal, last_klu.macd_state)
last_klu = klu
def return_zero(self, last_klu, klu):
return_zero = False
if last_klu.close < last_klu.ema52 and klu.close > klu.ema52:
return_zero = True
return return_zero
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):
self.add_klu(end_klu)
self.end_type = end_type
self.end_klu = end_klu
self.end_time = end_klu.time
self.is_end = True
self.cal_macd_state()
div_time = ""
for div in self.div_peak_list:
div_time += f"{div.time}, "
@@ -86,8 +126,7 @@ class ChanMACDUnitTF():
for histset in self.histset_list:
histset_time += f"{histset.start_time}, "
if self.peak_klu:
print(self.index, self.start_klu.time, self.peak_klu.time, self.div_count, self.div_type, div_time, len(self.histset_list))
else:
print(self.index, "None", len(self.histset_list))
if self.peak_klu and self.div_type == Chan_MACDUNITTF_DIV.DISCRETE:
print("Cross Div: ", self.start_klu.time, self.peak_klu.time, self.div_count, self.div_type, self.unittf_dir, div_time, len(self.histset_list))