┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
┃ 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:
19
Empty.json
19
Empty.json
@@ -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,
|
||||||
|
|||||||
76
Empty.py
76
Empty.py
@@ -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 = ''
|
||||||
|
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']
|
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 "-"
|
||||||
|
|||||||
245
Empty.txt
245
Empty.txt
@@ -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 s’amé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 qu’on 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
|
|
||||||
┏━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
|
C’est 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 2–3% 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.86 │ 2 days, 2:15:00 │ 43 0 19 69.4 │ 221.99 USDT 9.17% │
|
│ Empty │ 53 │ 1.76 │ 1312.665 │ 131.27 │ 4 days, 1:16:00 │ 33 0 20 62.3 │ 116.751 USDT 7.37% │
|
||||||
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┴────────────────────┘
|
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┴─────────────────────┘
|
||||||
|
|||||||
Reference in New Issue
Block a user