Ménage 2

This commit is contained in:
Jérôme Delacotte
2025-05-13 14:01:43 +02:00
parent e08e7099b1
commit 47851395fa

View File

@@ -76,15 +76,6 @@ class Zeus_8_3_2_B_4_2(IStrategy):
"sma20": { "sma20": {
"color": "yellow" "color": "yellow"
}, },
"sma20_smooth": {
"color": "green"
},
"sma20_smooth_2": {
"color": "red",
},
"sma20_smooth_3": {
"color": "blue",
},
"bb_lowerband": { "bb_lowerband": {
"color": "#da59a6"}, "color": "#da59a6"},
"bb_upperband": { "bb_upperband": {
@@ -218,14 +209,6 @@ class Zeus_8_3_2_B_4_2(IStrategy):
protection_fibo = IntParameter(1, 10, default=2, space='protection') protection_fibo = IntParameter(1, 10, default=2, space='protection')
sell_allow_decrease = DecimalParameter(0.005, 0.02, default=0.2, decimals=2, space='sell', optimize=True, load=True) sell_allow_decrease = DecimalParameter(0.005, 0.02, default=0.2, decimals=2, space='sell', optimize=True, load=True)
def min_max_scaling(self, series: pd.Series) -> pd.Series:
"""Normaliser les données en les ramenant entre 0 et 100."""
return 100 * (series - series.min()) / (series.max() - series.min())
def z_score_scaling(self, series: pd.Series) -> pd.Series:
"""Normaliser les données en utilisant Z-Score Scaling."""
return (series - series.mean()) / series.std()
def confirm_trade_entry(self, pair: str, order_type: str, amount: float, rate: float, time_in_force: str, def confirm_trade_entry(self, pair: str, order_type: str, amount: float, rate: float, time_in_force: str,
current_time: datetime, entry_tag: Optional[str], **kwargs) -> bool: current_time: datetime, entry_tag: Optional[str], **kwargs) -> bool:
@@ -515,9 +498,6 @@ class Zeus_8_3_2_B_4_2(IStrategy):
dataframe['sma10_diff'] = 100 * dataframe['sma10'].diff() / dataframe['sma10'] dataframe['sma10_diff'] = 100 * dataframe['sma10'].diff() / dataframe['sma10']
dataframe['sma20'] = talib.SMA(dataframe, timeperiod=20) dataframe['sma20'] = talib.SMA(dataframe, timeperiod=20)
dataframe['sma20_pct'] = 100 * dataframe['sma20'].diff() / dataframe['sma20'] dataframe['sma20_pct'] = 100 * dataframe['sma20'].diff() / dataframe['sma20']
dataframe['sma20_smooth'] = dataframe['sma20'].ewm(span=5).mean()
dataframe['sma20_smooth_2'] = dataframe['sma20'].rolling(window=5, center=True).median()
dataframe['sma20_smooth_3'] = self.smooth_series(dataframe['sma20'], alpha_low=0.05, alpha_high=0.3, threshold=0.2)
dataframe["percent"] = (dataframe["close"] - dataframe["open"]) / dataframe["open"] dataframe["percent"] = (dataframe["close"] - dataframe["open"]) / dataframe["open"]
dataframe["percent3"] = (dataframe["close"] - dataframe["open"].shift(3)) / dataframe["open"].shift(3) dataframe["percent3"] = (dataframe["close"] - dataframe["open"].shift(3)) / dataframe["open"].shift(3)
@@ -562,8 +542,6 @@ class Zeus_8_3_2_B_4_2(IStrategy):
# dataframe = self.apply_regression_derivatives(dataframe, column='mid', window=24, degree=3) # dataframe = self.apply_regression_derivatives(dataframe, column='mid', window=24, degree=3)
# Normaliser les données de 'close'
# normalized_close = self.min_max_scaling(dataframe['close'])
################### INFORMATIVE 1h ################### INFORMATIVE 1h
informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe="1h") informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe="1h")
heikinashi = qtpylib.heikinashi(informative) heikinashi = qtpylib.heikinashi(informative)
@@ -670,13 +648,13 @@ class Zeus_8_3_2_B_4_2(IStrategy):
def calculateTendency(self, dataframe, window=12): def calculateTendency(self, dataframe, window=12):
dataframe['mid'] = dataframe['open'] + (dataframe['close'] - dataframe['open']) / 2 dataframe['mid'] = dataframe['open'] + (dataframe['close'] - dataframe['open']) / 2
# 2. Calcul du lissage sur 200 bougies par moyenne mobile médiane # 2. Calcul du lissage par moyenne mobile médiane
dataframe['mid_smooth'] = dataframe['close'].rolling(window=window, center=True, min_periods=1).median().rolling( dataframe['mid_smooth'] = dataframe['close'].rolling(window=window, center=True, min_periods=1).median().rolling(
3).mean() 3).mean()
# 2. Dérivée première = différence entre deux bougies successives # 2. Dérivée première = différence entre deux bougies successives
dataframe['mid_smooth_deriv1'] = round(100 * dataframe['mid_smooth'].diff() / dataframe['mid_smooth'], 4) dataframe['mid_smooth_deriv1'] = round(100 * dataframe['mid_smooth'].diff() / dataframe['mid_smooth'], 4)
# 3. Dérivée seconde = différence de la dérivée première # 3. Dérivée seconde = différence de la dérivée première
dataframe['mid_smooth_deriv2'] = round(100 * dataframe['mid_smooth_deriv1'].diff().rolling(3).mean(), 4) dataframe['mid_smooth_deriv2'] = round(10 * dataframe['mid_smooth_deriv1'].diff(), 4)
dataframe = self.add_tendency_column(dataframe) dataframe = self.add_tendency_column(dataframe)
return dataframe return dataframe
@@ -721,6 +699,7 @@ class Zeus_8_3_2_B_4_2(IStrategy):
# (dataframe["bb_width"] > 0.01) # (dataframe["bb_width"] > 0.01)
(dataframe['down_count'].shift(1) < - 1) (dataframe['down_count'].shift(1) < - 1)
& (dataframe['down_count'] == 0) & (dataframe['down_count'] == 0)
# & (dataframe['mid_smooth_deriv1'] <= 0.01)
& (dataframe['mid_smooth_deriv1'] >= -0.01) & (dataframe['mid_smooth_deriv1'] >= -0.01)
# & (dataframe['tendency'] != "B--") # & (dataframe['tendency'] != "B--")
# & (dataframe['tendency'] != "B-") # & (dataframe['tendency'] != "B-")
@@ -742,6 +721,11 @@ class Zeus_8_3_2_B_4_2(IStrategy):
return dataframe return dataframe
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# dataframe.loc[
# (
# (dataframe['mid_smooth_deriv1'] == 0)
# & (dataframe['mid_smooth_deriv1'].shift(1) > 0)
# ), ['sell', 'exit_long']] = (1, 'sell_sma5_pct_1h')
return dataframe return dataframe
def adjust_trade_position(self, trade: Trade, current_time: datetime, def adjust_trade_position(self, trade: Trade, current_time: datetime,
@@ -870,25 +854,6 @@ class Zeus_8_3_2_B_4_2(IStrategy):
# f"Expected profit price={current_price:.4f} min_max={min_max:.4f} min_14={min_14_days:.4f} max_14={max_14_days:.4f} percent={percent:.4f} expected_profit={expected_profit:.4f}") # f"Expected profit price={current_price:.4f} min_max={min_max:.4f} min_14={min_14_days:.4f} max_14={max_14_days:.4f} percent={percent:.4f} expected_profit={expected_profit:.4f}")
return expected_profit return expected_profit
def smooth_series(self, series, alpha_low=0.1, alpha_high=0.5, threshold=0.2):
"""
Applique un lissage adaptatif sur une série Pandas.
- alpha_low : lissage fort (forte inertie, pour petites variations)
- alpha_high : lissage faible (rapide réaction, pour grandes variations)
- threshold : variation (%) à partir de laquelle on considère le mouvement significatif
"""
smoothed = [series.iloc[0]]
for i in range(1, len(series)):
prev = smoothed[-1]
current = series.iloc[i]
variation = abs(current - prev) / prev * 100 if prev != 0 else 0
alpha = alpha_high if variation > threshold else alpha_low
new_val = prev + alpha * (current - prev)
smoothed.append(new_val)
return pd.Series(smoothed, index=series.index)
def calculateUpDownPct(self, dataframe, key): def calculateUpDownPct(self, dataframe, key):
down_pct_values = np.full(len(dataframe), np.nan) down_pct_values = np.full(len(dataframe), np.nan)
# Remplir la colonne avec les bons calculs # Remplir la colonne avec les bons calculs
@@ -974,3 +939,47 @@ class Zeus_8_3_2_B_4_2(IStrategy):
return df return df
# @property
# def protections(self):
# return [
# {
# "method": "CooldownPeriod",
# "stop_duration_candles": 12
# }
# # {
# # "method": "MaxDrawdown",
# # "lookback_period_candles": self.lookback.value,
# # "trade_limit": self.trade_limit.value,
# # "stop_duration_candles": self.protection_stop.value,
# # "max_allowed_drawdown": self.protection_max_allowed_dd.value,
# # "only_per_pair": False
# # },
# # {
# # "method": "StoplossGuard",
# # "lookback_period_candles": 24,
# # "trade_limit": 4,
# # "stop_duration_candles": self.protection_stoploss_stop.value,
# # "only_per_pair": False
# # },
# # {
# # "method": "StoplossGuard",
# # "lookback_period_candles": 24,
# # "trade_limit": 4,
# # "stop_duration_candles": 2,
# # "only_per_pair": False
# # },
# # {
# # "method": "LowProfitPairs",
# # "lookback_period_candles": 6,
# # "trade_limit": 2,
# # "stop_duration_candles": 60,
# # "required_profit": 0.02
# # },
# # {
# # "method": "LowProfitPairs",
# # "lookback_period_candles": 24,
# # "trade_limit": 4,
# # "stop_duration_candles": 2,
# # "required_profit": 0.01
# # }
# ]