From 20a633910da076bd8ef0b68e81510e304f7d7af7 Mon Sep 17 00:00:00 2001 From: jackyu66git Date: Fri, 13 Jun 2025 02:00:38 +0800 Subject: [PATCH] Add to strategy --- .DS_Store | Bin 6148 -> 8196 bytes ChanLun.py | 4 +-- strategies/ChanPY.py => ChanPY.py | 38 ++++++++++++++++++++------- strategies/ChanLun_BTC_30.py | 41 ++++++++++++++++++------------ 4 files changed, 56 insertions(+), 27 deletions(-) rename strategies/ChanPY.py => ChanPY.py (88%) diff --git a/.DS_Store b/.DS_Store index d4c435210e31ec36b03ab78ef225313466b076f4..e43026df0290258d060bd82d6137c9e905b1fbce 100644 GIT binary patch literal 8196 zcmeHMO>Yx15FIB~)i!{NP^%t5%7GJyNBHBP@xn04C}s-|VQ1_lBHc?LLluSm{5qOp^|&yS;|+li76dhn)tg1Y}h z3hsWPCN!rmwNZ!EXFVCz=M3sT`bIRMgr+jukYb>^_#We(L0ej9_%=ps3XL;d`E5eR z8ucKfcbht5#hWFn1zn6k$9O5tT)WhV-^KT4-Kdi!5pc9ghnQ{~M%L-rYu;r>eZ@h% zqNWd38e~vg7OF`vyqND9%&jHnkWN8y3=%v9mJc(ym4!!`*Ew)L)RzouW#Mx=!N?wr zIL=4Qaa_zxFNWR5k2!&DV;@E_=QgGyPRXkj8B9tSl)8=}oZG0KC4YLP7QRPV>lr>H zdX3tLV|nH&E@^AJml>ZOdJ0WF=on)Q>_cxt1J@pLOk2x}t!9z8mDmT0Fh}&vXRWNi zjam70fp?a9?QO)mY}>JLl9>gsxw>Pm`6g!F$2R5}&tcDuhVHxxEAAj}(^KK8hd^*D zTX_r}1-v`R9awY$6o(ED0nBxZ{i?%^vDd2!LBY|qTd1jz5!w>6BLDtkZ*+9sg%#|% zBVlcdJ8dC{JPvU=M%XhQ4ZAWM4xcHs@V;&t`>wTyJ;c$qE$ryA*$(#Uw_+Pdi<~X& zEe?K5@a)YTqz6DE)VeFm{&GFW4y)@>Iv2%#id|*mQ12~=D$_d**~#=`C-U^N2Qk2C zaM0`~v3X7X_yoRfp2SI`VUE3x!Kdi*(YLRB^evzEu6Q~b+FH*5yUC@jjoah=|ET!= z|4p7kuq`kU82Cd5)LNt2s6&a#t#j%)*RGpAV3oQkLi=^X_l8!?z|1iXT6t<8 diff --git a/ChanLun.py b/ChanLun.py index 9c404d4..044957d 100644 --- a/ChanLun.py +++ b/ChanLun.py @@ -156,8 +156,8 @@ class ChanLun(): else: fx_list.append(0) klc_strength_list.append(klc.cal_fx_strength(2)) - #if klc.klc_fx_type != Chan_KLC_FX.UNKNOWN and klc.cal_fx_strength() > 1: - #print(klc.start_time, klc.end_time, klc.cal_fx_strength(), klc.klc_fx_type, fx_list[-1], klc_strength_list[-1]) + if klc.klc_fx_type != Chan_KLC_FX.UNKNOWN and klc.cal_fx_strength() > 1: + print(klc.start_time, klc.end_time, klc.cal_fx_strength(), klc.klc_fx_type, fx_list[-1], klc_strength_list[-1]) else: klc_strength_list.append(0) fx_list.append(0) diff --git a/strategies/ChanPY.py b/ChanPY.py similarity index 88% rename from strategies/ChanPY.py rename to ChanPY.py index c5372c3..868fb2d 100644 --- a/strategies/ChanPY.py +++ b/ChanPY.py @@ -30,13 +30,13 @@ class ChanPY(): k_type = KL_TYPE.K_5M config = CChanConfig({ "bi_strict": True, - "bi_algo": "fx", + "bi_algo": "normal", "trigger_step": True, "skip_step": 0, - "divergence_rate": 0.9, + "divergence_rate": float("inf"), "bsp2_follow_1": False, "bsp3_follow_1": False, - "min_zs_cnt": 1, + "min_zs_cnt": 0, "bs1_peak": False, "macd_algo": "peak", "bs_type": '1,2,3a,1p,2s,3b', @@ -61,7 +61,7 @@ class ChanPY(): self.chan.trigger_load({self.k_type: [klu]}) self.klu_list.append(klu) def add_klu_from_dataframe(self, dataframe): - if len(dataframe) > len(self.klu_list): + if len(dataframe) > len(self.klu_list) and len(dataframe) - len(self.klu_list) == 1: klu = self.get_last_klu(dataframe) self.chan.trigger_load({self.k_type: [klu]}) self.klu_list.append(klu) @@ -166,6 +166,7 @@ class ChanPY(): if bsp_type == BSP_TYPE.T3B: return -6 def get_bsps(self, dataframe:DataFrame): + fields = "time,open,high,low,close,volume" bsps = [] updown = [] bi_sure = [] @@ -190,20 +191,23 @@ class ChanPY(): last_bsp = bsp_list[-1] #print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value, lst[-2].fx, bi_list[-1].dir, bi_list[-1].is_sure,klu.close) if bsp_list_pre_len > len(bsp_list): - bsps.append(99) - #print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value, 99) + if abs(last_bsp_value) == 1 or abs(last_bsp_value) == 2: + bsps.append(1) + print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value, 98) + else: + bsps.append(99) else: if bsp_list_pre_len == len(bsp_list): if klu.idx == last_bsp.klu.idx: last_bsp_value = self.get_bsp_type(last_bsp.type[0], last_bsp.is_buy) bsps.append(last_bsp_value) - #print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value) + print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value) else: bsps.append(0) else: last_bsp_value = self.get_bsp_type(last_bsp.type[0], last_bsp.is_buy) bsps.append(last_bsp_value) - #print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value) + print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value) else: bsps.append(0) bsp_list_pre_len = len(bsp_list) @@ -266,9 +270,25 @@ class ChanPY(): if self.last_kline.time < klu.time: self.chan.trigger_load({self.k_type: [klu]}) # 喂给CChan新增k线 self.last_kline = klu + for index in range(0, len(bsps)): + if not (abs(bsps[index]) == 1 or abs(bsps[index]) == 2): + bsps[index] = 0 + else: + if bsps[index] == 2: + bsps[index] = 1 + else: + if bsps[index] == -2: + bsps[index] = -1 + else: + bsps[index] = 0 #print(bsps) #print(updown) kl_datas = self.chan.kl_datas[self.k_type] #for zs in kl_datas.zs_list: #print(zs.begin.time, zs.end.time) - return bsps, updown, bi_sure \ No newline at end of file + return bsps, updown, bi_sure + def get_bsp_state(self, dataframe:DataFrame): + bsps, updown, bi_sure = self.get_bsps(dataframe) + #print(bsps) + return bsps + diff --git a/strategies/ChanLun_BTC_30.py b/strategies/ChanLun_BTC_30.py index 4f12a3e..e4f2b3a 100644 --- a/strategies/ChanLun_BTC_30.py +++ b/strategies/ChanLun_BTC_30.py @@ -8,6 +8,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from ChanLun import ChanLun from ChanLun_Classifier import ChanLunClassifier from ChanEnum import Chan_FX_TYPE, Chan_KLC_FX, Chan_BI_DIR, Chan_KLC_FX +from ChanPY import ChanPY # -------------------------------- from technical.util import resample_to_interval, resampled_merge import talib.abstract as ta @@ -61,7 +62,7 @@ class ChanLun_BTC_30(IStrategy): "3600": 0 } can_short = True - lev = 50.0 + lev = 1.0 stoploss = -0.3 trailing_stop = False trailing_stop_positive = 0.025 @@ -76,9 +77,9 @@ class ChanLun_BTC_30(IStrategy): time30 = 30 time60 = 60 time4h = 240 - time5 = 30 last_time = datetime.now() chan = ChanLun() + chanpy = ChanPY() classifier = ChanLunClassifier(None) def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: @@ -104,7 +105,7 @@ class ChanLun_BTC_30(IStrategy): dataframe_1d = self.add_indicators(dataframe_1d) #self.chan.plot_dual(dataframe_5, dataframe_30) dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) - + dataframe_5['chanpy_state'] = self.chanpy.get_bsp_state(dataframe_5) state_list, fx_list = self.chan.get_klc_strength_list(dataframe_30) dataframe_30['state'] = state_list dataframe_30['fx'] = fx_list @@ -116,7 +117,7 @@ class ChanLun_BTC_30(IStrategy): print(klc_list[-1].klc_fx_type, klc_list[-2].klc_fx_type, klc_list[-3].klc_fx_type, klc_list[-4].klc_fx_type, klc_list[-5].klc_fx_type) print("-------------------------------------------------------------------------------") self.last_time = datetime.now() - #dataframe = resampled_merge(dataframe, dataframe_5) + dataframe = resampled_merge(dataframe, dataframe_5) dataframe = resampled_merge(dataframe, dataframe_30) #dataframe = resampled_merge(dataframe, dataframe_30) #dataframe = resampled_merge(dataframe, dataframe_60) @@ -169,13 +170,16 @@ class ChanLun_BTC_30(IStrategy): return new_exitprice def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: - state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time5) - fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time5) + state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time30) + fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time30) + chanpy_state_str = 'resample_{}_chanpy_state'.format(self.get_ticker_indicator()*self.time5) + shift_time = self.time30 dataframe.loc[ ( #(dataframe['state'] == "-30") - (dataframe[state_str].shift(self.time5) > 1.0) & - (dataframe[fx_str].shift(self.time5) == -1) + (dataframe[state_str].shift(shift_time) > 1.0) & + (dataframe[fx_str].shift(shift_time) == -1) & + (dataframe[chanpy_state_str].shift(shift_time) == 1) #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") & #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "-10") & #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") @@ -185,8 +189,9 @@ class ChanLun_BTC_30(IStrategy): dataframe.loc[ ( #(dataframe['state'] == "-30") - (dataframe[state_str].shift(self.time5) > 1.0) & - (dataframe[fx_str].shift(self.time5) == 1) + (dataframe[state_str].shift(shift_time) > 1.0) & + (dataframe[fx_str].shift(shift_time) == 1) & + (dataframe[chanpy_state_str].shift(shift_time) == -1) #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") & #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "-10") & #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") @@ -195,13 +200,16 @@ class ChanLun_BTC_30(IStrategy): ['enter_short', 'enter_tag']] = (1, 'short_signal_chan') return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: - state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time5) - fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time5) + state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time30) + fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time30) + chanpy_state_str = 'resample_{}_chanpy_state'.format(self.get_ticker_indicator()*self.time5) + shift_time = self.time30 dataframe.loc[ ( #(dataframe['state']== "30") - (dataframe[state_str].shift(self.time5) > 1.0) & - (dataframe[fx_str].shift(self.time5) == 1) + (dataframe[state_str].shift(shift_time) > 1.0) & + (dataframe[fx_str].shift(shift_time) == 1) & + (dataframe[chanpy_state_str].shift(shift_time) == -1) #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") & #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10") ), @@ -209,8 +217,9 @@ class ChanLun_BTC_30(IStrategy): dataframe.loc[ ( #(dataframe['state']== "30") - (dataframe[state_str].shift(self.time5) > 1.0) & - (dataframe[fx_str].shift(self.time5) == -1) + (dataframe[state_str].shift(shift_time) > 1.0) & + (dataframe[fx_str].shift(shift_time) == -1) & + (dataframe[chanpy_state_str].shift(shift_time) == 1) #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") & #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10") ),