coding macd

This commit is contained in:
jackyu66git
2025-08-30 01:07:03 +08:00
parent bb903a11cf
commit bfbf1781ec
8 changed files with 185 additions and 93 deletions
+36 -41
View File
@@ -6,7 +6,6 @@ import os
# 添加父目录到系统路径
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 technical.util import resample_to_interval, resampled_merge
@@ -21,7 +20,7 @@ logger = logging.getLogger(__name__)
# freqtrade plot-dataframe --strategy ChanLun_BTC_30 --datadir user_data/data/binance -c ./user_data/ChanLun_SOL_30.json --timerange=20250309-
# freqtrade trade -c ./user_data/Chan/config/ChanLun_BTC_30.json --strategy ChanLun_BTC_30 --strategy-path ./user_data/Chan/strategies
# freqtrade backtesting -c ./user_data/Chan/config/ChanLun_BTC_30.json --strategy ChanLun_BTC_30 --strategy-path ./user_data/Chan/strategies --timerange=20250712-
# freqtrade backtesting -c ./user_data/Chan/config/ChanLun_BTC_30.json --strategy ChanLun_BTC_30 --strategy-path ./user_data/Chan/strategies --timerange=20250820-
# freqtrade download-data -c ./user_data/Chan/config/ChanLun_BTC_30.json -t 1m --pairs BTC/USDT:USDT --timerange=20250405-
# freqtrade hyperopt --hyperopt-loss SharpeHyperOptLossDaily --spaces roi stoploss --strategy ChanLun_BTC_30 --strategy-path ./user_data/Chan/strategies -c ./user_data/Chan/config/ChanLun_BTC_30.json -e 200 --timerange=20250201-20250401
@@ -76,16 +75,16 @@ class ChanLun_BTC_30(IStrategy):
# 关闭分批止盈/仓位调整
position_adjustment_enable = False
startup_candle_count = 2880
time3 = 3
time5 = 5
time15 = 15
time30 = 30
time60 = 60
time2h = 120
time4h = 240
time30 = 15
time1d = 1440
last_time = datetime.now()
chan = ChanLun()
classifier = ChanLunClassifier(None)
last_order = None
last_trade = None
@@ -97,6 +96,7 @@ class ChanLun_BTC_30(IStrategy):
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_2h = resample_to_interval(dataframe, self.get_ticker_indicator() * 120)
dataframe_4h = resample_to_interval(dataframe, self.get_ticker_indicator() * 240)
#dataframe_1d = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='1d')
@@ -112,11 +112,14 @@ class ChanLun_BTC_30(IStrategy):
dataframe_15 = self.add_indicators(dataframe_15)
dataframe_30 = self.add_indicators(dataframe_30)
dataframe_60 = self.add_indicators(dataframe_60)
dataframe_2h = self.add_indicators(dataframe_2h)
dataframe_4h = self.add_indicators(dataframe_4h)
dataframe_1d = self.add_indicators(dataframe_1d)
#self.chan.plot_dual(dataframe_5, dataframe_30)
#chanpy_state = self.chanpy.get_bsp_state(dataframe_5)
#dataframe_5['chanpy_state'] = chanpy_state
state_list = self.chan.get_klc_state_list(dataframe_3)
dataframe_3['state'] = state_list
state_list = self.chan.get_klc_state_list(dataframe_5)
dataframe_5['state'] = state_list
state_list = self.chan.get_klc_state_list(dataframe_15)
@@ -125,6 +128,12 @@ class ChanLun_BTC_30(IStrategy):
dataframe_30['state'] = state_list
state_list = self.chan.get_klc_state_list(dataframe_60)
dataframe_60['state'] = state_list
state_list = self.chan.get_klc_state_list(dataframe_2h)
dataframe_2h['state'] = state_list
state_list = self.chan.get_klc_state_list(dataframe_4h)
dataframe_4h['state'] = state_list
state_list = self.chan.get_klc_state_list(dataframe_1d)
dataframe_1d['state'] = state_list
#bi_list_1 = self.chan.get_bi_list(dataframe)
#bi_list_5 = self.chan.get_bi_list(dataframe_5)
#bi_list_15 = self.chan.get_bi_list(dataframe_15)
@@ -142,9 +151,11 @@ class ChanLun_BTC_30(IStrategy):
dataframe = resampled_merge(dataframe, dataframe_3)
dataframe = resampled_merge(dataframe, dataframe_5)
dataframe = resampled_merge(dataframe, dataframe_15)
#dataframe = resampled_merge(dataframe, dataframe_30)
dataframe = resampled_merge(dataframe, dataframe_30)
dataframe = resampled_merge(dataframe, dataframe_60)
#dataframe = resampled_merge(dataframe, dataframe_4h)
dataframe = resampled_merge(dataframe, dataframe_2h)
dataframe = resampled_merge(dataframe, dataframe_4h)
dataframe = resampled_merge(dataframe, dataframe_1d)
return dataframe
def print_seg(self, dataframe):
klc_list = self.chan.get_klc_list(dataframe)
@@ -313,60 +324,44 @@ class ChanLun_BTC_30(IStrategy):
logger.info(f"保存开仓时ATR值: {entry_atr}")
return None
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time15)
shift_time = self.time15
dataframe.loc[
(
(dataframe[state_str].shift(shift_time) == "-20")
),
['enter_long', 'enter_tag']] = (1, 'long_15')
dataframe.loc[
(
(dataframe[state_str].shift(shift_time) == "20")
),
['enter_short', 'enter_tag']] = (1, 'short_15')
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_str].shift(shift_time) == "-20")
#(dataframe['state'] == "-30")
#(dataframe[state_str].shift(shift_time) == "-10")
#(dataframe[fx_str].shift(shift_time) == -1)
#(dataframe[chanpy_state_str].shift(shift_time+30) == 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')
['enter_long', 'enter_tag']] = (1, 'long_30')
dataframe.loc[
(
(dataframe[state_str].shift(shift_time) == "20")
#(dataframe[fx_str].shift(shift_time) == 1)
#(dataframe[chanpy_state_str].shift(shift_time+30) == -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')
['enter_short', 'enter_tag']] = (1, 'short_30')
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
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
state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time15)
shift_time = self.time15
dataframe.loc[
(
#(dataframe['state']== "30")
(dataframe[state_str].shift(shift_time) == "10")
#(dataframe[fx_str].shift(shift_time) == 1)
#(dataframe[chanpy_state_str].shift(shift_time+30) == -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')
['exit_long', 'exit_tag']] = (1, 'long_close_15')
dataframe.loc[
(
#(dataframe['state']== "30")
(dataframe[state_str].shift(shift_time) == "-10")
#(dataframe[fx_str].shift(shift_time) == -1)
#(dataframe[chanpy_state_str].shift(shift_time+30) == 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')
['exit_short', 'exit_tag']] = (1, 'short_close_15')
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,