From 0cc19132eb402c6f0a97e6841ee0727a954a21fd Mon Sep 17 00:00:00 2001 From: Porter Date: Mon, 26 May 2025 11:59:46 +0800 Subject: [PATCH] Add new strategy files --- __pycache__/ChanBI.cpython-312.pyc | Bin 6693 -> 6709 bytes __pycache__/ChanBSP.cpython-312.pyc | Bin 1352 -> 1368 bytes __pycache__/ChanCTime.cpython-312.pyc | Bin 3389 -> 3405 bytes __pycache__/ChanEnum.cpython-312.pyc | Bin 6285 -> 6301 bytes __pycache__/ChanKLC.cpython-312.pyc | Bin 72308 -> 72324 bytes __pycache__/ChanKLU.cpython-312.pyc | Bin 3691 -> 3707 bytes __pycache__/ChanLun.cpython-312.pyc | Bin 112125 -> 112141 bytes __pycache__/ChanSBI.cpython-312.pyc | Bin 3860 -> 3876 bytes __pycache__/ChanSEG.cpython-312.pyc | Bin 3472 -> 3488 bytes __pycache__/ChanZS.cpython-312.pyc | Bin 3789 -> 3805 bytes config/ChanLun_BTC_15.json | 83 +++++++++++ strategies/ChanLun_BTC_15.py | 204 ++++++++++++++++++++++++++ 12 files changed, 287 insertions(+) create mode 100644 config/ChanLun_BTC_15.json create mode 100644 strategies/ChanLun_BTC_15.py diff --git a/__pycache__/ChanBI.cpython-312.pyc b/__pycache__/ChanBI.cpython-312.pyc index 12fc32a84aad6aaf16641ab91d58508ea03f9d55..9b13e87b356c9d0e25b2e6fe93aeb6a8183abc92 100644 GIT binary patch delta 55 zcmZ2#veks^G%qg~0}x1QZRE0LX0)H|!7MA0R+L&;Qk0mIs$W{1S`?p>SdyskoROHf JIhT2d7yz0S5RCu; delta 39 tcmdmLvebm@G%qg~0}zC(Z{)INX4IeT!7R(+oROFpAD)`Dxt4i{7y!QV3Sa;L diff --git a/__pycache__/ChanBSP.cpython-312.pyc b/__pycache__/ChanBSP.cpython-312.pyc index b0781ec1eff323c82b026087d0690596dcc2d85b..cc05b4cce47830f5a8acf5fa538a820e3e139dbd 100644 GIT binary patch delta 55 zcmX@Xb%TrhG%qg~0}vee$F`CCJQJhCQ{DTyVC`py}N Jd7GF$m;mle5;Fh* delta 40 ucmcb?b%KlgG%qg~0}vd{=h?`8o{7<5@@*zr4(E)-y!i0cq|E}%9!vn|*b7Af diff --git a/__pycache__/ChanCTime.cpython-312.pyc b/__pycache__/ChanCTime.cpython-312.pyc index d700437f6724f1807952dd46982c64422d6c484a..c08bfc5fa9dff8e5604de28374d71f213e750d71 100644 GIT binary patch delta 80 zcmdlhbykY|G%qg~0}vee$F`CC2BVpierR!OQL%njVsf^=OMY@`ZfaghvA%m|iAQOY hep*p#VM$S9N~(S-P*r?NVo9RDb4Fs`W=rwO5M!G%qg~0}vd{=h?`8gHg>$KeRZts8~NMF*#e`B|o_|H#M)MSl>Of#G^Dx S-#H^OFFrgqX|p7g2{!b8_;=rMBeyFnqr>DtR#}O(qSV5YqQsO`{nFypqWF}=l0<#y QjKsX=GS=;7tc?Fe0D!<0=l}o! delta 46 zcmZqK%JO9k3-@VWUM>b8*fZN`BeyFnqrv1rR#^_`jKsY7@YJN{HrDNJtc?Fe07R7z A3;+NC diff --git a/__pycache__/ChanKLU.cpython-312.pyc b/__pycache__/ChanKLU.cpython-312.pyc index c67e27222ee6b8a52bb88dd1847f8a24a4f69a79..9c66c5ff48fb80e786e808eeca80c5d7b72bd980 100644 GIT binary patch delta 55 zcmaDY^IL}NG%qg~0}$|JZsclYVsx0?!z3$_R+L&;Qk0mIs$W{1S`?p>SdyskoROHf Jc_Y&b8`2E^&BR3B#qr+qgR#}O(qSV5YqQsO`{nFypqWF}=l0<#y RjKsWVTh{Hitc(XX004};6z>24 delta 46 zcmeBu!}j+z8~15mUM>b8*fZN`BR3B#qrqeeR#^_`jKsY7@YJMcU)Jrutc(XX002$Z B4hjGO diff --git a/__pycache__/ChanSBI.cpython-312.pyc b/__pycache__/ChanSBI.cpython-312.pyc index 18c9fb8571471029a8c3e4183fb09d66f01305ff..39238c4f1ffb050951849e99d129db3e54299dea 100644 GIT binary patch delta 80 zcmbOtw?vNnG%qg~0}vee$F`B1gW1eMKeRZts8~NMF*#e`B|o_|H#M)MSl>Of#G^Dx hKdmUWu%sw4B~`x^s46}su_RI7IU_M|vnBIwZUFjt8y)}v delta 64 zcmZ1?H${&7G%qg~0}vd{=h?{3!K`MWA6lGRRIHzsn4GQelAm0fo0?ZrtnZ##;!&EU S@0^jC7ayLQwAqvSHa7rJsuV8( diff --git a/__pycache__/ChanSEG.cpython-312.pyc b/__pycache__/ChanSEG.cpython-312.pyc index 072139bd4b030d899f8f5e3c792d6e78bd8ba407..309ff0782713bb4b28e1d3dcbfc97828a88adebc 100644 GIT binary patch delta 79 zcmbOry+E4lG%qg~0}$wBZsc0QZ04XJTAW%`te=&boUQMYpIn-onpaY+@19xWQJSQm gR+L&;Qk0mIs$U9J6`zt=lBn;Tk(jsn2J;S10L=6n`2YX_ delta 63 zcmZ1=Jwcl5G%qg~0}vd{-^jIsSSU)QrdsmkGG%qg~0}vee$F`CC6|Of#G^Dx S-#H^OFFrgqX|p!VCN2Pz DataFrame: + + # resample our dataframes + dataframe_5 = resample_to_interval(dataframe, self.get_ticker_indicator() * 5) + dataframe_15 = resample_to_interval(dataframe, self.get_ticker_indicator() * 15) + dataframe_30 = resample_to_interval(dataframe, self.get_ticker_indicator() * 30) + dataframe_60 = resample_to_interval(dataframe, self.get_ticker_indicator() * 60) + dataframe_4h = resample_to_interval(dataframe, self.get_ticker_indicator() * 240) + + #dataframe_1d = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='1d') + #dataframe_1w = resample_to_interval(dataframe_1d, self.get_ticker_indicator() * 10080) + #dataframe_1m = resample_to_interval(dataframe_1d, self.get_ticker_indicator() * 43200) + + dataframe_1d = resample_to_interval(dataframe, self.get_ticker_indicator() * 1440) + #dataframe_1w = resample_to_interval(dataframe, self.get_ticker_indicator() * 10080) + #dataframe_1m = resample_to_interval(dataframe, self.get_ticker_indicator() * 43200) + dataframe = self.add_indicators(dataframe) + dataframe_5 = self.add_indicators(dataframe_5) + dataframe_30 = self.add_indicators(dataframe_30) + dataframe_60 = self.add_indicators(dataframe_60) + dataframe_4h = self.add_indicators(dataframe_4h) + dataframe_1d = self.add_indicators(dataframe_1d) + #self.chan.plot_dual(dataframe_5, dataframe_30) + dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) + + state_list, fx_list = self.chan.get_klc_strength_list(dataframe_15) + dataframe_15['state'] = state_list + dataframe_15['fx'] = fx_list + klc_list = self.chan.get_klc_list(dataframe_15) + bi_list = self.chan.cal_bi_list(klc_list) + if self.last_time + timedelta(minutes=1) < datetime.now(): + print(state_list[-1], state_list[-2], state_list[-3], state_list[-4], state_list[-5]) + print(fx_list[-1], fx_list[-2], fx_list[-3], fx_list[-4], fx_list[-5]) + 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_15) + #dataframe = resampled_merge(dataframe, dataframe_30) + #dataframe = resampled_merge(dataframe, dataframe_60) + #dataframe = resampled_merge(dataframe, dataframe_4h) + return dataframe + + def add_indicators(self, df): + fast = 8 + slow = 16 + period = 6 + macd = ta.MACD(df, fastperiod=fast, slowperiod=slow, signalperiod=period) + df['macd'] = macd['macd'] + df['macdsignal'] = macd['macdsignal'] + df['macdhist'] = macd['macdhist'] + df['ma5'] = ta.MA(df, timeperiod=5) + df['ma10'] = ta.MA(df, timeperiod=10) + df['ma30'] = ta.EMA(df, timeperiod=30) + df['ma250'] = ta.MA(df, timeperiod=250) + df['rsi'] = ta.RSI(df, timeperiod=14) + df['volume_ratio'] = self.cal_volume_ratio(df) + return df + def cal_volume_ratio(self, dataframe, window=10): + df = dataframe.copy() + # 计算过去N根K线的平均成交量 + df['avg_volume'] = df['volume'].rolling(window=window).mean() + # 计算量比 + df['volume_ratio'] = df['volume'] / df['avg_volume'] + # 填充缺失值(前N根K线) + df['volume_ratio'] = df['volume_ratio'].fillna(1.0) + return df['volume_ratio'] + 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) + dataframe.loc[ + ( + #(dataframe['state'] == "-30") + (dataframe[state_str].shift(self.time5*2) > 1.0) & + (dataframe[fx_str].shift(self.time5*2) == -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") + #(qtpylib.crossed_above(dataframe['macd'], dataframe['macdsignal'])) + ), + ['enter_long', 'enter_tag']] = (1, 'long_signal_chan') + dataframe.loc[ + ( + #(dataframe['state'] == "-30") + (dataframe[state_str].shift(self.time5*2) > 1.0) & + (dataframe[fx_str].shift(self.time5*2) == 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") + #(qtpylib.crossed_above(dataframe['macd'], dataframe['macdsignal'])) + ), + ['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) + dataframe.loc[ + ( + #(dataframe['state']== "30") + (dataframe[state_str].shift(self.time5*2) > 1.0) & + (dataframe[fx_str].shift(self.time5*2) == 1) + #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") & + #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10") + ), + ['exit_long', 'exit_tag']] = (1, 'long_close_signal_chan') + dataframe.loc[ + ( + #(dataframe['state']== "30") + (dataframe[state_str].shift(self.time5*2) > 1.0) & + (dataframe[fx_str].shift(self.time5*2) == -1) + #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") & + #(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10") + ), + ['exit_short', 'exit_tag']] = (1, 'short_close_signal_chan') + return dataframe + def leverage(self, pair: str, current_time: datetime, current_rate: float, + proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], side: str, + **kwargs) -> float: + return self.lev + + def get_ticker_indicator(self): + return int(self.timeframe[:-1]) \ No newline at end of file