from typing import List from Bi.Bi import CBi from BuySellPoint.BS_Point import CBS_Point from Common.CEnum import FX_TYPE from KLine.KLine import CKLine from KLine.KLine_List import CKLine_List from Seg.Eigen import CEigen from Seg.EigenFX import CEigenFX from Seg.Seg import CSeg from ZS.ZS import CZS class Cklc_meta: def __init__(self, klc: CKLine): self.high = klc.high self.low = klc.low self.begin_idx = klc.lst[0].idx self.end_idx = klc.lst[-1].idx self.type = klc.fx if klc.fx != FX_TYPE.UNKNOWN else klc.dir self.klu_list = list(klc.lst) class CBi_meta: def __init__(self, bi: CBi): self.idx = bi.idx self.dir = bi.dir self.type = bi.type self.begin_x = bi.get_begin_klu().idx self.end_x = bi.get_end_klu().idx self.begin_y = bi.get_begin_val() self.end_y = bi.get_end_val() self.is_sure = bi.is_sure class CSeg_meta: def __init__(self, seg: CSeg): if isinstance(seg.start_bi, CBi): self.begin_x = seg.start_bi.get_begin_klu().idx self.begin_y = seg.start_bi.get_begin_val() self.end_x = seg.end_bi.get_end_klu().idx self.end_y = seg.end_bi.get_end_val() else: assert isinstance(seg.start_bi, CSeg) self.begin_x = seg.start_bi.start_bi.get_begin_klu().idx self.begin_y = seg.start_bi.start_bi.get_begin_val() self.end_x = seg.end_bi.end_bi.get_end_klu().idx self.end_y = seg.end_bi.end_bi.get_end_val() self.dir = seg.dir self.is_sure = seg.is_sure self.tl = {} if seg.support_trend_line and seg.support_trend_line.line: self.tl["support"] = seg.support_trend_line if seg.resistance_trend_line and seg.resistance_trend_line.line: self.tl["resistance"] = seg.resistance_trend_line def format_tl(self, tl): assert tl.line tl_slope = tl.line.slope + 1e-7 tl_x = tl.line.p.x tl_y = tl.line.p.y tl_y0 = self.begin_y tl_y1 = self.end_y tl_x0 = (tl_y0-tl_y)/tl_slope + tl_x tl_x1 = (tl_y1-tl_y)/tl_slope + tl_x return tl_x0, tl_y0, tl_x1, tl_y1 class CEigen_meta: def __init__(self, eigen: CEigen): self.begin_x = eigen.lst[0].get_begin_klu().idx self.end_x = eigen.lst[-1].get_end_klu().idx self.begin_y = eigen.low self.end_y = eigen.high self.w = self.end_x - self.begin_x self.h = self.end_y - self.begin_y class CEigenFX_meta: def __init__(self, eigenFX: CEigenFX): self.ele = [CEigen_meta(ele) for ele in eigenFX.ele if ele is not None] assert len(self.ele) == 3 assert eigenFX.ele[1] is not None self.gap = eigenFX.ele[1].gap self.fx = eigenFX.ele[1].fx class CZS_meta: def __init__(self, zs: CZS): self.low = zs.low self.high = zs.high self.begin = zs.begin.idx self.end = zs.end.idx self.w = self.end - self.begin self.h = self.high - self.low self.is_sure = zs.is_sure self.sub_zs_lst = [CZS_meta(t) for t in zs.sub_zs_lst] self.is_onebi_zs = zs.is_one_bi_zs() class CBS_Point_meta: def __init__(self, bsp: CBS_Point, is_seg): self.is_buy = bsp.is_buy self.type = bsp.type2str() self.is_seg = is_seg self.x = bsp.klu.idx self.y = bsp.klu.low if self.is_buy else bsp.klu.high def desc(self): is_seg_flag = "※" if self.is_seg else "" return f'{is_seg_flag}b{self.type}' if self.is_buy else f'{is_seg_flag}s{self.type}' class CChanPlotMeta: def __init__(self, kl_list: CKLine_List): self.data = kl_list self.klc_list: List[Cklc_meta] = [Cklc_meta(klc) for klc in kl_list.lst] self.datetick = [klu.time.to_str() for klu in self.klu_iter()] self.klu_len = sum(len(klc.klu_list) for klc in self.klc_list) self.bi_list = [CBi_meta(bi) for bi in kl_list.bi_list] self.seg_list: List[CSeg_meta] = [] self.eigenfx_lst: List[CEigenFX_meta] = [] for seg in kl_list.seg_list: self.seg_list.append(CSeg_meta(seg)) if seg.eigen_fx: self.eigenfx_lst.append(CEigenFX_meta(seg.eigen_fx)) self.seg_eigenfx_lst: List[CEigenFX_meta] = [] self.segseg_list: List[CSeg_meta] = [] for segseg in kl_list.segseg_list: self.segseg_list.append(CSeg_meta(segseg)) if segseg.eigen_fx: self.seg_eigenfx_lst.append(CEigenFX_meta(segseg.eigen_fx)) self.zs_lst: List[CZS_meta] = [CZS_meta(zs) for zs in kl_list.zs_list] self.segzs_lst: List[CZS_meta] = [CZS_meta(segzs) for segzs in kl_list.segzs_list] self.bs_point_lst: List[CBS_Point_meta] = [CBS_Point_meta(bs_point, is_seg=False) for bs_point in kl_list.bs_point_lst] self.seg_bsp_lst: List[CBS_Point_meta] = [CBS_Point_meta(seg_bsp, is_seg=True) for seg_bsp in kl_list.seg_bs_point_lst] def klu_iter(self): for klc in self.klc_list: yield from klc.klu_list def sub_last_kseg_start_idx(self, seg_cnt): if seg_cnt is None or len(self.data.seg_list) <= seg_cnt: return 0 else: return self.data.seg_list[-seg_cnt].get_begin_klu().sub_kl_list[0].idx def sub_last_kbi_start_idx(self, bi_cnt): if bi_cnt is None or len(self.data.bi_list) <= bi_cnt: return 0 else: return self.data.bi_list[-bi_cnt].begin_klc.lst[0].sub_kl_list[0].idx def sub_range_start_idx(self, x_range): for klc in self.data[::-1]: for klu in klc[::-1]: x_range -= 1 if x_range == 0: return klu.sub_kl_list[0].idx return 0