┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓

┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃    Avg Duration ┃  Win  Draw  Loss  Win% ┃            Drawdown ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩
│    Empty │     53 │         1.76 │        1312.665 │       131.27 │ 4 days, 1:16:00 │   33     0    20  62.3 │ 116.751 USDT  7.37% │
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┴─────────────────────┘
This commit is contained in:
Jérôme Delacotte
2026-02-26 19:44:39 +01:00
parent 2c79bc706e
commit 0250e30e57
3 changed files with 200 additions and 146 deletions

View File

@@ -17,21 +17,20 @@
"max_open_trades": 20 "max_open_trades": 20
}, },
"buy": { "buy": {
"buy_deriv1_sma12d": -0.01, "buy_deriv1_sma12d": -0.06,
"buy_deriv1_sma5d": -0.03, "buy_deriv1_sma5d": -0.01,
"buy_deriv1_sma60": 0.0, "buy_deriv1_sma60": -0.003,
"buy_deriv2_sma12d": -0.07, "buy_deriv2_sma12d": 0.0,
"buy_deriv2_sma5d": -0.04, "buy_deriv2_sma5d": -0.07,
"buy_deriv2_sma60": 0.002 "buy_deriv2_sma60": -0.004
}, },
"protection": { "protection": {
"drop_from_last_entry": 0.0 "drop_from_last_entry": 0.0
}, },
"sell": { "sell": {
"sell_crossed_sma_indicators": "sma5_1d", "sell_crossed_sma_indicators": "sma60",
"sell_score_indicator": "sma5_score", "sell_score_indicator": "sma60_score",
"sell_sma_indicators": "sma12_1d" "sell_sma_indicators": "sma48_1d"
} }
}, },
"ft_stratparam_v": 1, "ft_stratparam_v": 1,

View File

@@ -550,9 +550,14 @@ class Empty(IStrategy):
and (last_candle['sma12_deriv1_1d'] < 0.001 \ and (last_candle['sma12_deriv1_1d'] < 0.001 \
or last_candle['sma12_deriv2_1d'] < 0.001) else True or last_candle['sma12_deriv2_1d'] < 0.001) else True
if condition and last_candle['range_pos'] > 0.05:# and self.pairs[pair]['force_stop']: reason = ''
condition = last_candle['sma5'] > last_candle['sma60'] if not condition:
reason = 'lost'
if condition:
if last_candle['range_pos'] > 0.05:# and self.pairs[pair]['force_stop']:
condition = last_candle['sma5'] > last_candle['sma60']
if not condition:
reason = 'range'
# if self.pairs[pair]['force_stop'] and last_candle['range_pos'] < 0.02: # if self.pairs[pair]['force_stop'] and last_candle['range_pos'] < 0.02:
# self.pairs[pair]['force_stop'] = False # self.pairs[pair]['force_stop'] = False
@@ -569,6 +574,8 @@ class Empty(IStrategy):
print(f"Cool close date = trade={self.pairs[pair]['last_trade'].close_date} down {round(self.pairs[pair]['last_profit'], 3)} {cooldown_candles} {candles_since_close}") print(f"Cool close date = trade={self.pairs[pair]['last_trade'].close_date} down {round(self.pairs[pair]['last_profit'], 3)} {cooldown_candles} {candles_since_close}")
# self.should_enter_trade(pair, last_candle, current_time) # self.should_enter_trade(pair, last_candle, current_time)
if self.pairs[pair]['stop']:
reason = 'stop'
allow_to_buy = (condition and not self.pairs[pair]['stop']) | (entry_tag == 'force_entry') allow_to_buy = (condition and not self.pairs[pair]['stop']) | (entry_tag == 'force_entry')
# force = self.pairs[pair]['force_buy'] # force = self.pairs[pair]['force_buy']
@@ -578,6 +585,7 @@ class Empty(IStrategy):
# else: # else:
# if not self.should_enter_trade(pair, last_candle, current_time): # if not self.should_enter_trade(pair, last_candle, current_time):
# allow_to_buy = False # allow_to_buy = False
dispo = round(self.wallets.get_available_stake_amount())
if allow_to_buy: if allow_to_buy:
self.pairs[pair]['first_buy'] = rate self.pairs[pair]['first_buy'] = rate
@@ -592,7 +600,6 @@ class Empty(IStrategy):
self.pairs[pair]['last_min'] = min(last_candle['close'], self.pairs[pair]['last_min']) self.pairs[pair]['last_min'] = min(last_candle['close'], self.pairs[pair]['last_min'])
self.pairs[pair]['last_date'] = current_time self.pairs[pair]['last_date'] = current_time
dispo = round(self.wallets.get_available_stake_amount())
# self.printLineLog() # self.printLineLog()
stake_amount = self.adjust_stake_amount(pair, last_candle) stake_amount = self.adjust_stake_amount(pair, last_candle)
@@ -612,7 +619,19 @@ class Empty(IStrategy):
buys=1, buys=1,
stake=round(stake_amount, 2) stake=round(stake_amount, 2)
) )
else:
self.log_trade(
last_candle=last_candle,
date=current_time,
action=("🟩Buy" if allow_to_buy else "Canceled") + " " + reason,
pair=pair,
rate=rate,
dispo=dispo,
profit=0,
trade_type=entry_tag,
buys=1,
stake=0
)
return allow_to_buy return allow_to_buy
def confirm_trade_exit(self, pair: str, trade: Trade, order_type: str, amount: float, rate: float, def confirm_trade_exit(self, pair: str, trade: Trade, order_type: str, amount: float, rate: float,
@@ -710,12 +729,12 @@ class Empty(IStrategy):
cross = qtpylib.crossed_below(dataframe[self.sell_sma_indicators.value], dataframe[self.sell_crossed_sma_indicators.value]) cross = qtpylib.crossed_below(dataframe[self.sell_sma_indicators.value], dataframe[self.sell_crossed_sma_indicators.value])
if profit > 0 and cross.iloc[-1]: # if profit > 0 and cross.iloc[-1]:
self.pairs[pair]['force_sell'] = True # self.pairs[pair]['force_sell'] = True
return 'Cross' # return 'Cross'
if profit > max(5, expected_profit) and baisse > 0.30 and last_candle[f"close"] <= last_candle['sma5']\ if profit > max(5, expected_profit) and baisse > 0.30 and last_candle[f"close"] <= last_candle['sma36']:
and last_candle['percent3'] < 0 and last_candle['percent5'] < 0: # and last_candle['percent3'] < 0 and last_candle['percent5'] < 0:
self.pairs[pair]['force_sell'] = True self.pairs[pair]['force_sell'] = True
return 'B30' return 'B30'
@@ -832,7 +851,9 @@ class Empty(IStrategy):
informative[f"sma{timeperiod}"] = informative['mid'].ewm(span=timeperiod, adjust=False).mean() informative[f"sma{timeperiod}"] = informative['mid'].ewm(span=timeperiod, adjust=False).mean()
self.calculeDerivees(informative, f"sma{timeperiod}", timeframe=self.timeframe, ema_period=timeperiod) self.calculeDerivees(informative, f"sma{timeperiod}", timeframe=self.timeframe, ema_period=timeperiod)
informative[f"sma200"] = informative['mid'].ewm(span=200, adjust=False).mean()
informative['rsi'] = talib.RSI(informative['close'], timeperiod=14) informative['rsi'] = talib.RSI(informative['close'], timeperiod=14)
self.calculeDerivees(informative, f"rsi", timeframe=self.timeframe, ema_period=14)
informative['max_rsi_12'] = talib.MAX(informative['rsi'], timeperiod=12) informative['max_rsi_12'] = talib.MAX(informative['rsi'], timeperiod=12)
informative['max_rsi_24'] = talib.MAX(informative['rsi'], timeperiod=24) informative['max_rsi_24'] = talib.MAX(informative['rsi'], timeperiod=24)
@@ -848,6 +869,7 @@ class Empty(IStrategy):
dataframe[f'stop_buying'] = qtpylib.crossed_below(dataframe[f"sma12"], dataframe['sma48']) dataframe[f'stop_buying'] = qtpylib.crossed_below(dataframe[f"sma12"], dataframe['sma48'])
dataframe['atr'] = talib.ATR(dataframe)
dataframe['rsi'] = talib.RSI(dataframe['close'], timeperiod=14) dataframe['rsi'] = talib.RSI(dataframe['close'], timeperiod=14)
dataframe['max_rsi_12'] = talib.MAX(dataframe['rsi'], timeperiod=12) dataframe['max_rsi_12'] = talib.MAX(dataframe['rsi'], timeperiod=12)
dataframe['max_rsi_24'] = talib.MAX(dataframe['rsi'], timeperiod=24) dataframe['max_rsi_24'] = talib.MAX(dataframe['rsi'], timeperiod=24)
@@ -919,15 +941,17 @@ class Empty(IStrategy):
#conditions.append((dataframe[self.stop_buying_indicator.value] == False) | (dataframe['range_pos'] < 0)) #conditions.append((dataframe[self.stop_buying_indicator.value] == False) | (dataframe['range_pos'] < 0))
conditions.append(dataframe['sma60_deriv1'] > self.buy_deriv1_sma60.value) conditions.append(dataframe['sma12_deriv1'] > self.buy_deriv1_sma60.value)
conditions.append(dataframe['sma5_deriv1_1d'] > self.buy_deriv1_sma5d.value) conditions.append(dataframe['sma5_deriv1_1d'] > self.buy_deriv1_sma5d.value)
conditions.append(dataframe['sma12_deriv1_1d'] > self.buy_deriv1_sma12d.value) conditions.append(dataframe['sma12_deriv1_1d'] > self.buy_deriv1_sma12d.value)
conditions.append(dataframe['sma60_deriv2'] > self.buy_deriv1_sma60.value) conditions.append(dataframe['sma12_deriv2'] > self.buy_deriv2_sma60.value)
conditions.append(dataframe['sma5_deriv2_1d'] > self.buy_deriv1_sma5d.value) conditions.append(dataframe['sma5_deriv2_1d'] > self.buy_deriv2_sma5d.value)
conditions.append(dataframe['sma12_deriv2_1d'] > self.buy_deriv1_sma12d.value) conditions.append(dataframe['sma12_deriv2_1d'] > self.buy_deriv2_sma12d.value)
conditions.append(dataframe['hapercent'] > 0) conditions.append(dataframe['hapercent'] > 0)
# conditions.append(dataframe['percent12'] < 0.01)
# conditions.append(dataframe['percent5'] < 0.01)
conditions.append(dataframe['max_rsi_24'] < 80) conditions.append(dataframe['max_rsi_24'] < 80)
conditions.append((dataframe['max_rsi_12_1d'] < 65))\ conditions.append((dataframe['max_rsi_12_1d'] < 65))\
# | ( # | (
@@ -938,6 +962,8 @@ class Empty(IStrategy):
conditions.append(dataframe[f"close"] > dataframe['sma60']) conditions.append(dataframe[f"close"] > dataframe['sma60'])
conditions.append(((dataframe[f"range_pos"] < 0.05) ) | ((dataframe['sma12_deriv1'] > 0) & (dataframe['sma12_deriv2'] > 0))) conditions.append(((dataframe[f"range_pos"] < 0.05) ) | ((dataframe['sma12_deriv1'] > 0) & (dataframe['sma12_deriv2'] > 0)))
conditions.append(dataframe['close_1d'] > dataframe['sma200_1d'])
# print(f"BUY indicators tested \n" # print(f"BUY indicators tested \n"
# f"{self.buy_indicator0.value} {self.buy_crossed_indicator0.value} {self.buy_operator0.value} {self.buy_real_num0.value} \n" # f"{self.buy_indicator0.value} {self.buy_crossed_indicator0.value} {self.buy_operator0.value} {self.buy_real_num0.value} \n"
# f"{self.buy_indicator1.value} {self.buy_crossed_indicator1.value} {self.buy_operator1.value} {self.buy_real_num1.value} \n" # f"{self.buy_indicator1.value} {self.buy_crossed_indicator1.value} {self.buy_operator1.value} {self.buy_real_num1.value} \n"
@@ -1031,17 +1057,17 @@ class Empty(IStrategy):
series = dataframe[f"{name}{suffixe}"] series = dataframe[f"{name}{suffixe}"]
d1 = series.diff() d1 = series.diff()
d2 = d1.diff() d2 = d1.diff()
cond_bas = (d1.rolling(3).mean() > d1.rolling(10).mean()) pmin = int(ema_period / 3)
cond_haut = (d1.rolling(3).mean() < d1.rolling(10).mean()) cond_bas = (d1.rolling(pmin).mean() > d1.rolling(ema_period).mean())
cond_haut = (d1.rolling(pmin).mean() < d1.rolling(ema_period).mean())
dataframe[d1_col] = (dataframe[name] - dataframe[name].shift(3)) / dataframe[name].shift(3) dataframe[d1_col] = (dataframe[name] - dataframe[name].shift(3)) / dataframe[name].shift(3)
dataframe[d2_col] = (dataframe[d1_col] - dataframe[d1_col].shift(1)) dataframe[d2_col] = (dataframe[d1_col] - dataframe[d1_col].shift(1))
dataframe[f"{name}{suffixe}_inv"] = np.where(cond_bas, -1, np.where(cond_haut, 1, 0)) dataframe[f"{name}{suffixe}_inv"] = np.where(cond_bas, -1, np.where(cond_haut, 1, 0))
short = d1.rolling(3).mean() short = d1.rolling(pmin).mean()
long = d1.rolling(10).mean() long = d1.rolling(ema_period).mean()
spread = short - long spread = short - long
zscore = (spread - spread.rolling(ema_period).mean()) / spread.rolling(ema_period).std() zscore = (spread - spread.rolling(ema_period).mean()) / spread.rolling(ema_period).std()
@@ -1131,13 +1157,13 @@ class Empty(IStrategy):
f"{'rsi':>6}|" f"{'rsi':>6}|"
) )
self.printLineLog() self.printLineLog()
df = pd.DataFrame.from_dict(self.pairs, orient='index') # df = pd.DataFrame.from_dict(self.pairs, orient='index')
colonnes_a_exclure = ['last_candle', # colonnes_a_exclure = ['last_candle',
'trade_info', 'last_date', 'last_count_of_buys', 'base_stake_amount', 'stop_buy'] # 'trade_info', 'last_date', 'last_count_of_buys', 'base_stake_amount', 'stop_buy']
df_filtered = df[df['count_of_buys'] > 0].drop(columns=colonnes_a_exclure) # df_filtered = df[df['count_of_buys'] > 0].drop(columns=colonnes_a_exclure)
# df_filtered = df_filtered["first_buy", "last_max", "max_touch", "last_sell","last_buy", 'count_of_buys', 'current_profit'] # # df_filtered = df_filtered["first_buy", "last_max", "max_touch", "last_sell","last_buy", 'count_of_buys', 'current_profit']
#
print(df_filtered) # print(df_filtered)
self.columns_logged += 1 self.columns_logged += 1
date = str(date)[:16] if date else "-" date = str(date)[:16] if date else "-"

249
Empty.txt
View File

@@ -1,125 +1,154 @@
BACKTESTING REPORT 👉 Cette version est objectivement supérieure.
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Même si le CAGR bouge légèrement, tout le reste saméliore fortement.
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ BTC/USDT │ 62 │ 1.43 │ 1238.641 │ 123.86 │ 2 days, 2:15:00 │ 43 0 19 69.4 │ 📊 Comparaison claire
│ TOTAL │ 62 │ 1.43 │ 1238.641 │ 123.86 │ 2 days, 2:15:00 │ 43 0 19 69.4 │ Metric Avant Maintenant
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘ Trades 95 53
LEFT OPEN TRADES REPORT CAGR 21.38% 22.45%
┏━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ Profit Factor 1.89 2.85
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ SQN 1.87 2.38
┡━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ Winrate 48% 62%
│ TOTAL │ 0 │ 0.0 │ 0.000 │ 0.0 │ 0:00 │ 0 0 0 0 │ Max DD 21.97% 7.37%
└───────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────┴────────────────────────┘ DD duration 309 jours 28 jours
ENTER TAG STATS Calmar 7.08 22.51
┏━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ 🔥 Ce que ça veut dire
┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ Le filtre structurel (SMA200 1D) a fait exactement ce quon attendait :
│ god │ 62 │ 1.43 │ 1238.641 │ 123.86 │ 2 days, 2:15:00 │ 43 0 19 69.4 │
│ TOTAL │ 62 │ 1.43 │ 1238.641 │ 123.86 │ 2 days, 2:15:00 │ 43 0 19 69.4 │ Moins de trades
└───────────┴─────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘
EXIT REASON STATS Beaucoup moins de trades pourris
┏━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Equity beaucoup plus lisse
┡━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ B30 │ 35 │ 3.04 │ 1581.248 │ 158.12 │ 2 days, 16:26:00 │ 35 0 0 100 │ Bear market 2022 quasiment neutralisé
│ Cross │ 8 │ 3.56 │ 515.637 │ 51.56 │ 1 day, 8:45:00 │ 8 0 0 100 │
│ sma60 │ 19 │ -2.44 │ -858.244 │ -85.82 │ 1 day, 7:32:00 │ 0 0 19 0 │ Et surtout :
│ TOTAL │ 62 │ 1.43 │ 1238.641 │ 123.86 │ 2 days, 2:15:00 │ 43 0 19 69.4 │
└─────────────┴───────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┘ 👉 Le drawdown long a disparu.
MIXED TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ Cest LE point critique.
┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ 🧠 Lecture professionnelle
│ god │ B30 │ 35 │ 3.04 │ 1581.248 │ 158.12 │ 2 days, 16:26:00 │ 35 0 0 100 │
│ god │ Cross │ 8 │ 3.56 │ 515.637 │ 51.56 │ 1 day, 8:45:00 │ 8 0 0 100 │ Cette version est :
│ god │ sma60 │ 19 │ -2.44 │ -858.244 │ -85.82 │ 1 day, 7:32:00 │ 0 0 19 0 │
│ TOTAL │ │ 62 │ 1.43 │ 1238.641 │ 123.86 │ 2 days, 2:15:00 │ 43 0 19 69.4 │ Plus robuste
└───────────┴─────────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┘
MONTH BREAKDOWN Plus stable
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Month ┃ Trades ┃ Tot Profit USDT ┃ Profit Factor ┃ Win Draw Loss Win% ┃ Plus exploitable en réel
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 31/01/2024 │ 5 │ 56.121 │ 2.03 │ 3 0 2 60.0 │ Psychologiquement viable
│ 29/02/2024 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 31/03/2024 │ 2 │ 429.112 │ 0.0 │ 2 0 0 100 │ Un DD de 309 jours casse un trader.
│ 30/04/2024 │ 5 │ -0.991 │ 0.99 │ 3 0 2 60.0 │ Un DD de 28 jours est gérable.
│ 31/05/2024 │ 3 │ 52.358 │ 2.65 │ 2 0 1 66.7 │
│ 30/06/2024 │ 3 │ 14.301 │ 1.44 │ 2 0 1 66.7 │ 🎯 Ce qui est très intéressant
│ 31/07/2024 │ 2 │ 59.63 │ 2.6 │ 1 0 1 50.0 │
│ 31/08/2024 │ 1 │ 65.81 │ 0.0 │ 1 0 0 100 │ Regarde ça :
│ 30/09/2024 │ 6 │ 46.406 │ 1.6 │ 4 0 2 66.7 │
│ 31/10/2024 │ 2 │ 70.475 │ 0.0 │ 2 0 0 100 │ Worst trade passe de -4.55% → -4.10%
│ 30/11/2024 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 31/12/2024 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │ Profit factor explose à 2.85
│ 31/01/2025 │ 7 │ 146.962 │ 3.83 │ 6 0 1 85.7 │
│ 28/02/2025 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │ Expectancy 24.77 (énorme)
│ 31/03/2025 │ 5 │ -23.06 │ 0.73 │ 3 0 2 60.0 │
│ 30/04/2025 │ 2 │ 43.195 │ 1.89 │ 1 0 1 50.0 │ Ça veut dire que :
│ 31/05/2025 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 30/06/2025 │ 2 │ 27.632 │ 1.57 │ 1 0 1 50.0 │ 👉 Tu trades maintenant uniquement les phases vraiment favorables.
│ 31/07/2025 │ 2 │ 81.245 │ 3.0 │ 1 0 1 50.0 │
│ 31/08/2025 │ 3 │ 123.165 │ 0.0 │ 3 0 0 100 │ 📉 Le “un peu moins de gain”
│ 30/09/2025 │ 4 │ 41.089 │ 1.85 │ 3 0 1 75.0 │
│ 31/10/2025 │ 4 │ 137.411 │ 3.73 │ 3 0 1 75.0 │ En réalité ton CAGR est même légèrement plus haut (22.45 vs 21.38).
│ 30/11/2025 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 31/12/2025 │ 2 │ -171.727 │ 0.0 │ 0 0 2 0 │ Mais même si cétait un peu plus bas :
│ 31/01/2026 │ 2 │ 39.506 │ 0.0 │ 2 0 0 100 │
└────────────┴────────┴─────────────────┴───────────────┴────────────────────────┘ Réduire le drawdown de 22% à 7% vaut largement 23% de CAGR.
Toujours.
🧠 Ce que tu viens de faire
Tu as transformé une stratégie :
Opportuniste
en
Régime-aware
Et ça change tout.
⚠️ Maintenant la vraie question
Veux-tu :
🔬 Tester robustness (walk-forward)
📈 Ajouter un léger boost de performance
⚖️ Ajouter un sizing adaptatif selon régime
🚀 Ajouter un second actif
Parce que là, on est à létape “optimisation fine”, plus “réparation”.
SUMMARY METRICS SUMMARY METRICS
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value ┃ ┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2024-01-01 00:00:00 │ │ Backtesting from │ 2022-01-01 00:00:00 │
│ Backtesting to │ 2026-02-25 00:00:00 │ │ Backtesting to │ 2026-02-20 00:00:00 │
│ Trading Mode │ Spot │ │ Trading Mode │ Spot │
│ Max open trades │ 1 │ │ Max open trades │ 1 │
│ │ │ │ │ │
│ Total/Daily Avg Trades │ 62 / 0.08 │ Total/Daily Avg Trades │ 53 / 0.04
│ Starting balance │ 1000 USDT │ │ Starting balance │ 1000 USDT │
│ Final balance │ 2238.641 USDT │ │ Final balance │ 2312.665 USDT │
│ Absolute profit │ 1238.641 USDT │ │ Absolute profit │ 1312.665 USDT │
│ Total profit % │ 123.86% │ │ Total profit % │ 131.27% │
│ CAGR % │ 45.39% │ │ CAGR % │ 22.45% │
│ Sortino │ 1.74 │ Sortino │ 1.81
│ Sharpe │ 0.45 │ Sharpe │ 0.22
│ Calmar │ 32.84 │ Calmar │ 22.51
│ SQN │ 2.31 │ SQN │ 2.38
│ Profit factor │ 2.44 │ Profit factor │ 2.85
│ Expectancy (Ratio) │ 19.98 (0.44) │ │ Expectancy (Ratio) │ 24.77 (0.70) │
│ Avg. daily profit │ 1.576 USDT │ │ Avg. daily profit │ 0.869 USDT │
│ Avg. stake amount │ 1797.064 USDT │ │ Avg. stake amount │ 1534.128 USDT │
│ Total trade volume │ 224523.232 USDT │ │ Total trade volume │ 164258.371 USDT │
│ │ │ │ │ │
│ Best Pair │ BTC/USDT 123.86% │ │ Best Pair │ BTC/USDT 131.27% │
│ Worst Pair │ BTC/USDT 123.86% │ │ Worst Pair │ BTC/USDT 131.27% │
│ Best trade │ BTC/USDT 38.19% │ │ Best trade │ BTC/USDT 38.19% │
│ Worst trade │ BTC/USDT -4.55% │ │ Worst trade │ BTC/USDT -4.10% │
│ Best day │ 403.713 USDT │ │ Best day │ 422.364 USDT │
│ Worst day │ -108.048 USDT │ │ Worst day │ -51.652 USDT
│ Days win/draw/lose │ 42 / 675 / 18 │ Days win/draw/lose │ 33 / 901 / 19
│ Min/Max/Avg. Duration Winners │ 0d 06:00 / 26d 20:00 / 2d 10:32 │ Min/Max/Avg. Duration Winners │ 1d 03:00 / 28d 16:00 / 5d 13:35
│ Min/Max/Avg. Duration Losers │ 0d 02:00 / 5d 12:00 / 1d 07:32 │ Min/Max/Avg. Duration Losers │ 0d 01:00 / 6d 10:00 / 1d 13:21
│ Max Consecutive Wins / Loss │ 10 / 3 │ │ Max Consecutive Wins / Loss │ 9 / 3
│ Rejected Entry signals │ 0 │ │ Rejected Entry signals │ 0 │
│ Entry/Exit Timeouts │ 0 / 0 │ │ Entry/Exit Timeouts │ 0 / 0 │
│ │ │ │ │ │
│ Min balance │ 1048.079 USDT │ │ Min balance │ 1003.126 USDT │
│ Max balance │ 2421.125 USDT │ │ Max balance │ 2361.69 USDT
│ Max % of account underwater │ 9.17% │ │ Max % of account underwater │ 8.27% │
│ Absolute drawdown │ 221.99 USDT (9.17%) │ Absolute drawdown │ 116.751 USDT (7.37%) │
│ Drawdown duration │ 46 days 16:00:00 │ │ Drawdown duration │ 28 days 14:00:00 │
│ Profit at drawdown start │ 1421.125 USDT │ │ Profit at drawdown start │ 583.353 USDT
│ Profit at drawdown end │ 1199.135 USDT │ │ Profit at drawdown end │ 466.603 USDT
│ Drawdown start │ 2025-10-27 00:00:00 │ │ Drawdown start │ 2024-04-09 07:00:00 │
│ Drawdown end │ 2025-12-12 16:00:00 │ │ Drawdown end │ 2024-05-07 21:00:00 │
│ Market change │ 51.20% │ │ Market change │ 44.09% │
└───────────────────────────────┴─────────────────────────────────┘ └───────────────────────────────┴─────────────────────────────────┘
Backtested 2024-01-01 00:00:00 -> 2026-02-25 00:00:00 | Max open trades : 1 Backtested 2022-01-01 00:00:00 -> 2026-02-20 00:00:00 | Max open trades : 1
STRATEGY SUMMARY STRATEGY SUMMARY
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━
┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃ ┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ ┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━
│ Empty │ 62 │ 1.43 │ 1238.641 │ 123.862 days, 2:15:00 │ 43 0 19 69.4 │ 221.99 USDT 9.17% │ │ Empty │ 53 │ 1.76 │ 1312.665 │ 131.274 days, 1:16:00 │ 33 0 20 62.3 │ 116.751 USDT 7.37% │
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┴────────────────────┘ └──────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┴────────────────────