diff --git a/.DS_Store b/.DS_Store index d4c4352..e43026d 100644 Binary files a/.DS_Store and b/.DS_Store differ 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") ),