Files
2025-06-10 01:16:09 +08:00

170 lines
5.7 KiB
Python

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