From 5c0ad516a3c29d2c02737e08040fc0c4c6bf4a0c Mon Sep 17 00:00:00 2001 From: jackyu66git Date: Tue, 2 Sep 2025 01:14:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=83=8C=E7=A6=BB=E8=AE=A1?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChanEnum.py | 7 +++ ChanKLC.py | 4 +- ChanMACD.py | 119 +++++++++++++++++++-------------------- ChanMACDHistSet.py | 105 +++++++++++++++++++++------------- ChanMACDSeg.py | 3 +- ChanMACDUnitTF.py | 70 +++++++++++++++++++---- web/templates/index.html | 8 +-- 7 files changed, 199 insertions(+), 117 deletions(-) diff --git a/ChanEnum.py b/ChanEnum.py index 34a757c..927f8de 100644 --- a/ChanEnum.py +++ b/ChanEnum.py @@ -107,6 +107,13 @@ class Chan_MACDUNITTF_TYPE(Enum): START = auto() CROSS0 = 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): ABOVE = auto() UNDER = auto() diff --git a/ChanKLC.py b/ChanKLC.py index 1972a79..655799a 100644 --- a/ChanKLC.py +++ b/ChanKLC.py @@ -78,12 +78,12 @@ class ChanKLC(): self.klc_fx_type = Chan_KLC_FX.BOTTOM4 if self.fx == Chan_FX_TYPE.TOP: #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.bb_out = True else: 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.bb_out = True diff --git a/ChanMACD.py b/ChanMACD.py index fc4383d..a539695 100644 --- a/ChanMACD.py +++ b/ChanMACD.py @@ -22,7 +22,7 @@ class ChanMACD(): last_seg = None last_unittf = None last_histset = None - + histset = None last_klu = None for klu in self.klu_list: klu.cal_macd_state() @@ -31,81 +31,29 @@ class ChanMACD(): if klu.macd_state != Chan_MACD_STATE.UNKNOWN: # 初始化首个直方图集合(根据当前柱体正负) 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: - 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) last_histset = histset # 初始化首段 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) last_seg = seg last_seg.add_histset(histset) # 初始化首个UnitTF 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) - unittf.add_histset(histset) last_unittf = unittf - last_unittf.add_histset(histset) last_seg.add_unittf(unittf) # 未就绪则继续等下一根;已就绪亦已完成首个结构初始化,继续下一根 last_klu = klu 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 last_histset and last_histset.histset_dir == Chan_MACDHISTSET_DIR.ABOVE: last_histset.add_klu(klu) @@ -113,7 +61,7 @@ class ChanMACD(): # 结束旧 histset(以前一根结束更合理) if last_histset and 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) if last_histset: last_histset.set_next(histset) @@ -129,7 +77,7 @@ class ChanMACD(): # 结束旧 histset(以前一根结束更合理) if last_histset and 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) if last_histset: last_histset.set_next(histset) @@ -138,5 +86,56 @@ class ChanMACD(): last_seg.add_histset(histset) if last_unittf: 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_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 \ No newline at end of file diff --git a/ChanMACDHistSet.py b/ChanMACDHistSet.py index 11d371e..47a0c39 100644 --- a/ChanMACDHistSet.py +++ b/ChanMACDHistSet.py @@ -1,7 +1,8 @@ -from ChanEnum import Chan_MACDHISTSET_DIR +from ChanEnum import Chan_MACDHISTSET_DIR, Chan_MACDUNITTF_DIV 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.end_time = None self.klu_list = [] @@ -10,42 +11,80 @@ class ChanMACDHistSet(): self.next = None self.pre = pre_histset self.peak_klu = None - self.div_klu = None + self.second_peak_klu = None 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): self.next = next_histset + def set_middle_klu(self, middle_klu): + self.middle_klu = middle_klu def set_unittf_div(self, unittf_div): self.unittf_div = unittf_div def add_klu(self, klu): 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.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): self.end_klu = end_klu 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: print(self.start_time, self.peak_klu.time, self.div_klu.time, self.klu_list[-1].time, len(self.klu_list), self.histset_dir) @@ -53,16 +92,4 @@ class ChanMACDHistSet(): print(self.start_time, "Peak:", self.peak_klu.time, self.klu_list[-1].time, len(self.klu_list), self.histset_dir) else: 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 \ No newline at end of file + """ \ No newline at end of file diff --git a/ChanMACDSeg.py b/ChanMACDSeg.py index c35a6e4..62c18a6 100644 --- a/ChanMACDSeg.py +++ b/ChanMACDSeg.py @@ -2,7 +2,8 @@ from ChanEnum import Chan_MACDSEG_DIR 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.end_time = None self.start_klu = start_klu diff --git a/ChanMACDUnitTF.py b/ChanMACDUnitTF.py index a9c35b3..8e77c67 100644 --- a/ChanMACDUnitTF.py +++ b/ChanMACDUnitTF.py @@ -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(): - 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.end_time = None self.start_klu = start_klu @@ -10,13 +11,19 @@ class ChanMACDUnitTF(): self.klu_list = [] self.klu_list.append(start_klu) self.histset_list = [] + self.histset_list.append(start_histset) + self.div_count = 0 + start_histset.set_middle_klu(start_klu) self.next = None self.pre = pre_unittf self.unittf_dir = dir self.start_type = start_type self.end_type = None - self.near0_count = 1 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): self.next = next_unittf def add_histset(self, histset): @@ -25,21 +32,62 @@ class ChanMACDUnitTF(): self.klu_list.append(klu) self.cal_peak_div() 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: - 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: - for histset in self.histset_list: - if histset.peak_klu and self.peak_klu: - if abs(histset.peak_klu.macdhist) > abs(self.peak_klu.macdhist): - self.peak_klu = histset.peak_klu + for index in range(0, len(self.histset_list)): + histset = self.histset_list[index] + 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: - histset.set_unittf_div(True) + 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 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 + 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: - 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: - print("None", len(self.histset_list)) \ No newline at end of file + print(self.index, "None", len(self.histset_list)) + \ No newline at end of file diff --git a/web/templates/index.html b/web/templates/index.html index f35e277..6cd2a1d 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -5081,7 +5081,7 @@ if (fx.fx_strength < 1.0) { // 降低阈值,让更多分型显示 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 = { time: timestamp, @@ -5145,7 +5145,7 @@ if (fx.fx_strength < 1.0) { // 降低阈值,让更多分型显示 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 = { time: timestamp, @@ -5229,7 +5229,7 @@ if (fx.fx_strength < 1.0){ // 调整小周期阈值 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 = { time: timestamp, @@ -5285,7 +5285,7 @@ if (fx.fx_strength < 2.0){ // 调整小周期阈值 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分型标记配置 const markerConfig = { time: timestamp,