Frictrade

This commit is contained in:
Jérôme Delacotte
2025-11-27 20:17:50 +01:00
parent 682528444f
commit 340c651a8a

View File

@@ -378,6 +378,10 @@ class Frictrade(IStrategy):
dataframe['mid'] = dataframe['open'] + (dataframe['close'] - dataframe['open']) / 2 dataframe['mid'] = dataframe['open'] + (dataframe['close'] - dataframe['open']) / 2
dataframe['sma5'] = dataframe['mid'].ewm(span=5, adjust=False).mean() #dataframe["mid"].rolling(window=5).mean() dataframe['sma5'] = dataframe['mid'].ewm(span=5, adjust=False).mean() #dataframe["mid"].rolling(window=5).mean()
dataframe['sma5_deriv1'] = 1000 * (dataframe['sma5'] - dataframe['sma5'].shift(1)) / dataframe['sma5'].shift(1) dataframe['sma5_deriv1'] = 1000 * (dataframe['sma5'] - dataframe['sma5'].shift(1)) / dataframe['sma5'].shift(1)
dataframe['sma24'] = dataframe['mid'].ewm(span=24, adjust=False).mean()
dataframe['sma24_deriv1'] = 1000 * (dataframe['sma24'] - dataframe['sma24'].shift(1)) / dataframe['sma24'].shift(1)
dataframe['sma60'] = dataframe['mid'].ewm(span=60, adjust=False).mean() dataframe['sma60'] = dataframe['mid'].ewm(span=60, adjust=False).mean()
dataframe['sma60_deriv1'] = 1000 * (dataframe['sma60'] - dataframe['sma60'].shift(1)) / dataframe['sma60'].shift(1) dataframe['sma60_deriv1'] = 1000 * (dataframe['sma60'] - dataframe['sma60'].shift(1)) / dataframe['sma60'].shift(1)
@@ -386,7 +390,7 @@ class Frictrade(IStrategy):
dataframe["sma5_sqrt"] = ( dataframe["sma5_sqrt"] = (
np.sqrt(np.abs(dataframe["sma5"] - dataframe["sma5"].shift(1))) np.sqrt(np.abs(dataframe["sma5"] - dataframe["sma5"].shift(1)))
+ np.sqrt(np.abs(dataframe["sma5"].shift(2) - dataframe["sma5"].shift(1))) + np.sqrt(np.abs(dataframe["sma5"].shift(3) - dataframe["sma5"].shift(1)))
) )
dataframe["sma5_inv"] = ( dataframe["sma5_inv"] = (
(dataframe["sma5"].shift(2) >= dataframe["sma5"].shift(1)) (dataframe["sma5"].shift(2) >= dataframe["sma5"].shift(1))
@@ -405,6 +409,9 @@ class Frictrade(IStrategy):
dataframe['max5'] = talib.MAX(dataframe['mid'], timeperiod=5) dataframe['max5'] = talib.MAX(dataframe['mid'], timeperiod=5)
dataframe['min180'] = talib.MIN(dataframe['mid'], timeperiod=180) dataframe['min180'] = talib.MIN(dataframe['mid'], timeperiod=180)
dataframe['max180'] = talib.MAX(dataframe['mid'], timeperiod=180) dataframe['max180'] = talib.MAX(dataframe['mid'], timeperiod=180)
dataframe['pct180'] = ((dataframe["mid"] - dataframe['min180'] ) / (dataframe['max180'] - dataframe['min180'] ))
dataframe = self.rsi_trend_probability(dataframe)
# ################### 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')
@@ -493,8 +500,9 @@ class Frictrade(IStrategy):
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[ dataframe.loc[
( (
(dataframe['sma5_inv'] == 1) # (dataframe['sma5_inv'] == 1)
# & (dataframe['max_rsi_24'] < 80) ((dataframe['pct180'] < 0.5) | (dataframe['close'] < dataframe['sma60']))
& (dataframe['hapercent'] > 0)
# & ( # & (
# (dataframe['percent3'] <= -0.003) # (dataframe['percent3'] <= -0.003)
# | (dataframe['percent12'] <= -0.003) # | (dataframe['percent12'] <= -0.003)
@@ -653,11 +661,10 @@ class Frictrade(IStrategy):
self.printLog(exception) self.printLog(exception)
return None return None
if current_profit > dca_threshold and (increase >= dca_threshold and self.wallets.get_available_stake_amount() > 0) \ if current_profit > dca_threshold and (increase >= dca_threshold and self.wallets.get_available_stake_amount() > 0):
and (last_candle['max_rsi_24'] < 80):
try: try:
self.pairs[pair]['previous_profit'] = profit self.pairs[pair]['previous_profit'] = profit
stake_amount = min(self.wallets.get_available_stake_amount(), self.adjust_stake_amount(pair, last_candle)) stake_amount = max(20, min(self.wallets.get_available_stake_amount(), self.adjust_stake_amount(pair, last_candle)))
if stake_amount > 0: if stake_amount > 0:
self.pairs[pair]['has_gain'] += 1 self.pairs[pair]['has_gain'] += 1
@@ -751,13 +758,16 @@ class Frictrade(IStrategy):
zone = int(position * 3) # 0 à 2 zone = int(position * 3) # 0 à 2
if zone == 0: if zone == 0:
current_trailing_stop_positive = True current_trailing_stop_positive = self.trailing_stop_positive
current_trailing_stop_positive_offset = self.trailing_stop_positive_offset * 2 current_trailing_stop_positive_offset = self.trailing_stop_positive_offset * 2
# if zone == 1: # if zone == 1:
if last_candle['sma24_deriv1'] > 0: # and last_candle['sma5_deriv1'] > -0.15:
return None
# ----- 5) Calcul du trailing stop dynamique ----- # ----- 5) Calcul du trailing stop dynamique -----
# Exemple : offset=0.321 => stop à +24.8% # Exemple : offset=0.321 => stop à +24.8%
trailing_stop = max_profit * (1.0 - current_trailing_stop_positive) trailing_stop = max_profit * (1.0 - current_trailing_stop_positive)
baisse = 0 baisse = 0
if max_profit: if max_profit:
@@ -781,12 +791,12 @@ class Frictrade(IStrategy):
if current_trailing_only_offset_is_reached: if current_trailing_only_offset_is_reached:
# Max profit pas atteint ET perte < 2 * current_trailing_stop_positive # Max profit pas atteint ET perte < 2 * current_trailing_stop_positive
if max_profit < min(2, current_trailing_stop_positive_offset * (count_of_buys - self.pairs[pair]['has_gain']))\ if max_profit < min(2, current_trailing_stop_positive_offset * (count_of_buys - self.pairs[pair]['has_gain']))\
and (baisse < 0.5 and max_profit > current_trailing_stop_positive_offset): #2 * current_trailing_stop_positive: and (max_profit > current_trailing_stop_positive_offset): #2 * current_trailing_stop_positive:
return None # ne pas activer le trailing encore return None # ne pas activer le trailing encore
# Sinon : trailing actif dès le début # Sinon : trailing actif dès le début
# ----- 6) Condition de vente ----- # ----- 6) Condition de vente -----
if profit > 0 and profit <= trailing_stop: if profit > 0 and profit <= trailing_stop and last_candle['mid'] < last_candle['sma5']:
return f"stop_{count_of_buys}" return f"stop_{count_of_buys}"
return None return None