Skip to content

Commit

Permalink
fix: CChan deepcopy
Browse files Browse the repository at this point in the history
  • Loading branch information
Vespa314 committed Nov 23, 2023
1 parent 6ef6dae commit 5ad4af7
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 3 deletions.
35 changes: 33 additions & 2 deletions Chan.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import copy
import datetime
from collections import defaultdict
from typing import Dict, Iterable, List, Optional, Union
Expand Down Expand Up @@ -49,8 +50,8 @@ def __init__(
lv_list = [KL_TYPE.K_DAY, KL_TYPE.K_60M]
check_kltype_order(lv_list) # lv_list顺序从高到低
self.code = code
self.begin_time = str(begin_time) if type(begin_time) == datetime.date else begin_time
self.end_time = str(end_time) if type(end_time) == datetime.date else end_time
self.begin_time = str(begin_time) if isinstance(begin_time, datetime.date) else begin_time
self.end_time = str(end_time) if isinstance(end_time, datetime.date) else end_time
self.autype = autype
self.data_src = data_src
self.lv_list: List[KL_TYPE] = lv_list
Expand All @@ -70,6 +71,36 @@ def __init__(
for _ in self.load():
...

def __deepcopy__(self, memo):
cls = self.__class__
obj: CChan = cls.__new__(cls)
memo[id(self)] = obj
obj.code = self.code
obj.begin_time = self.begin_time
obj.end_time = self.end_time
obj.autype = self.autype
obj.data_src = self.data_src
obj.lv_list = copy.deepcopy(self.lv_list, memo)
obj.conf = copy.deepcopy(self.conf, memo)
obj.kl_misalign_cnt = self.kl_misalign_cnt
obj.kl_inconsistent_detail = copy.deepcopy(self.kl_inconsistent_detail, memo)
obj.g_kl_iter = copy.deepcopy(self.g_kl_iter, memo)
if hasattr(self, 'kl_datas'):
obj.klu_cache = copy.deepcopy(self.klu_cache, memo)
if hasattr(self, 'klu_last_t'):
obj.klu_last_t = copy.deepcopy(self.klu_last_t, memo)
obj.kl_datas = {}
for kl_type, ckline in self.kl_datas.items():
obj.kl_datas[kl_type] = copy.deepcopy(ckline, memo)
for kl_type, ckline in self.kl_datas.items():
for klc in ckline:
for klu in klc.lst:
assert id(klu) in memo
if klu.sup_kl:
memo[id(klu)].sup_kl = memo[id(klu.sup_kl)]
memo[id(klu)].sub_kl_list = [memo[id(sub_kl)] for sub_kl in klu.sub_kl_list]
return obj

def do_init(self):
self.kl_datas: Dict[KL_TYPE, CKLine_List] = {}
for idx in range(len(self.lv_list)):
Expand Down
8 changes: 8 additions & 0 deletions Combiner/KLine_Combiner.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ def test_combine(self, item: CCombine_Item, exclude_included=False, allow_top_eq
else:
raise CChanException("combine type unknown", ErrCode.COMBINER_ERR)

def add(self, unit_kl: T):
# only for deepcopy
self.__lst.append(unit_kl)

def set_fx(self, fx: FX_TYPE):
# only for deepcopy
self.__fx = fx

def try_add(self, unit_kl: T, exclude_included=False, allow_top_equal=None):
# allow_top_equal = None普通模式
# allow_top_equal = 1 被包含,顶部相等不合并
Expand Down
33 changes: 33 additions & 0 deletions KLine/KLine_List.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import copy
from typing import List, Union, overload

from Bi.Bi import CBi
Expand Down Expand Up @@ -50,6 +51,38 @@ def __init__(self, kl_type, conf: CChanConfig):

self.step_calculation = self.need_cal_step_by_step()

def __deepcopy__(self, memo):
new_obj = CKLine_List(self.kl_type, self.config)
memo[id(self)] = new_obj
for klc in self.lst:
klus_new = []
for klu in klc.lst:
new_klu = copy.deepcopy(klu, memo)
klus_new.append(new_klu)

new_klc = CKLine(klus_new[0], idx=klc.idx, _dir=klc.dir)
new_klc.set_fx(klc.fx)
new_klc.kl_type = klc.kl_type
for idx, klu in enumerate(klus_new):
klu.set_klc(new_klc)
if idx != 0:
new_klc.add(klu)
memo[id(klc)] = new_klc
if new_obj.lst:
new_obj.lst[-1].set_next(new_klc)
new_klc.set_pre(new_obj.lst[-1])
new_obj.lst.append(new_klc)
new_obj.bi_list = copy.deepcopy(self.bi_list, memo)
new_obj.seg_list = copy.deepcopy(self.seg_list, memo)
new_obj.segseg_list = copy.deepcopy(self.segseg_list, memo)
new_obj.zs_list = copy.deepcopy(self.zs_list, memo)
new_obj.segzs_list = copy.deepcopy(self.segzs_list, memo)
new_obj.bs_point_lst = copy.deepcopy(self.bs_point_lst, memo)
new_obj.metric_model_lst = copy.deepcopy(self.metric_model_lst, memo)
new_obj.step_calculation = copy.deepcopy(self.step_calculation, memo)
new_obj.seg_bs_point_lst = copy.deepcopy(self.seg_bs_point_lst, memo)
return new_obj

@overload
def __getitem__(self, index: int) -> CKLine: ...

Expand Down
28 changes: 27 additions & 1 deletion KLine/KLine_Unit.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import copy
from typing import Dict, Optional

from Common.CEnum import DATA_FIELD, TREND_TYPE
from Common.CEnum import DATA_FIELD, TRADE_INFO_LST, TREND_TYPE
from Common.ChanException import CChanException, ErrCode
from Common.CTime import CTime
from Math.BOLL import BOLL_Metric, BollModel
Expand Down Expand Up @@ -43,6 +44,31 @@ def __init__(self, kl_dict, autofix=False):

self.set_idx(-1)

def __deepcopy__(self, memo):
_dict = {
DATA_FIELD.FIELD_TIME: self.time,
DATA_FIELD.FIELD_CLOSE: self.close,
DATA_FIELD.FIELD_OPEN: self.open,
DATA_FIELD.FIELD_HIGH: self.high,
DATA_FIELD.FIELD_LOW: self.low,
}
for metric in TRADE_INFO_LST:
if metric in self.trade_info.metric:
_dict[metric] = self.trade_info.metric[metric]
obj = CKLine_Unit(_dict)
obj.demark = copy.deepcopy(self.demark, memo)
obj.trend = copy.deepcopy(self.trend, memo)
obj.limit_flag = self.limit_flag
obj.macd = copy.deepcopy(self.macd, memo)
obj.boll = copy.deepcopy(self.boll, memo)
if hasattr(self, "rsi"):
obj.rsi = copy.deepcopy(self.rsi, memo)
if hasattr(self, "kdj"):
obj.kdj = copy.deepcopy(self.kdj, memo)
obj.set_idx(self.idx)
memo[id(self)] = obj
return obj

@property
def klc(self):
assert self.__klc is not None
Expand Down

0 comments on commit 5ad4af7

Please sign in to comment.