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

┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃     Avg Duration ┃  Win  Draw  Loss  Win% ┃             Drawdown ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩
│    Empty │     49 │         2.64 │         680.535 │        68.05 │ 14 days, 0:38:00 │   44     0     5  89.8 │ 629.763 USDT  27.26% │
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┴──────────────────────┘
This commit is contained in:
Jérôme Delacotte
2026-02-21 18:40:21 +01:00
parent a228e56172
commit 60ed27529a
3 changed files with 178 additions and 159 deletions

View File

@@ -30,15 +30,16 @@
"buy_real_num1": 1.0,
"buy_real_num2": -0.4
},
"protection": {
"stop_buying_indicator": "stop_buying12_1d",
"stoploss_indicator": "stop_buying12_1d",
"stoploss_timeperiod": "12"
},
"sell": {
"sell_score_indicator": "sma48_score"
},
"protection": {
"range_pos_stoploss": 0.1,
"stop_buying_indicator": "stop_buying60_1d",
"stoploss_force": -0.01,
"stoploss_indicator": "sma3_deriv2"
}
},
"ft_stratparam_v": 1,
"export_time": "2026-02-20 20:19:59.741160+00:00"
"export_time": "2026-02-21 17:38:15.366827+00:00"
}

117
Empty.py
View File

@@ -266,7 +266,7 @@ class Empty(IStrategy):
# trailing_only_offset_is_reached = False
position_adjustment_enable = True
use_custom_stoploss = False
use_custom_stoploss = True
#max_open_trades = 3
@@ -385,9 +385,11 @@ class Empty(IStrategy):
sell_score_indicator = CategoricalParameter(score_indicators, default="sma24_score", space='sell')
stoploss_indicator = CategoricalParameter(stoploss_indicators, default="stop_buying12_1d", space='protection')
range_pos_stoploss = DecimalParameter(0, 0.1, decimals=2, default=0.05, space='protection')
stoploss_force = DecimalParameter(-0.2, 0, decimals=2, default=-0.05, space='protection')
stoploss_indicator = CategoricalParameter(god_genes_with_timeperiod, default="stop_buying12_1d", space='protection')
stop_buying_indicator = CategoricalParameter(stoploss_indicators, default="stop_buying12_1d", space='protection')
stoploss_timeperiod = CategoricalParameter(timeperiods, default="12", space='protection')
# stoploss_timeperiod = CategoricalParameter(timeperiods, default="12", space='protection')
def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float,
proposed_stake: float, min_stake: float, max_stake: float,
@@ -409,8 +411,8 @@ class Empty(IStrategy):
# range_pos = (last_candle['close'] - range_min) / (range_max - range_min)
range_pos = last_candle[f"range_pos"]
sl_min = self.wallets.get_available_stake_amount() / 2
sl_max = self.wallets.get_available_stake_amount() / 6
sl_min = self.wallets.get_available_stake_amount() / 6
sl_max = self.wallets.get_available_stake_amount() / 2
amount = sl_min + (1 - range_pos) * (sl_max - sl_min)
# amount = self.wallets.get_available_stake_amount() / 8
@@ -470,13 +472,18 @@ class Empty(IStrategy):
last_buy = max(filled_buys, key=lambda o: o.order_date)
last_entry_price = last_buy.price
drop_from_last_entry = (current_rate - last_entry_price) / last_entry_price
if last_entry_price:
drop_from_last_entry = (current_rate - last_entry_price) / last_entry_price
if drop_from_last_entry <= -0.025 and last_candle['min60'] == last_candle_3['min60']:
# stake_amount = trade.stake_amount
print(f"adjust {current_time} {stake_amount}")
print(f"adjust {pair} {current_time} dispo={dispo} amount={stake_amount} rate={current_rate}")
return stake_amount
if drop_from_last_entry <= -0.025 and last_candle['min60'] == last_candle_3['min60'] \
and last_candle[self.stop_buying_indicator.value] == False\
and ((last_candle['stop_buying5_1d'] == False) or (last_candle['range_pos'] < 0)) \
and last_candle['range_pos'] <= -0.01:
# stake_amount = trade.stake_amount
self.pairs[trade.pair]['last_buy'] = current_rate
print(f"adjust {current_time} {stake_amount}")
print(f"adjust {pair} {current_time} dispo={dispo} amount={stake_amount} rate={current_rate}")
return stake_amount
return None
@@ -494,7 +501,8 @@ class Empty(IStrategy):
condition = True
if self.pairs[pair]['last_trade'] and self.pairs[pair]['last_trade'].close_date:
if False and self.pairs[pair]['last_trade'].close_date is not None:
# base cooldown = n bougies / cooldown proportionnel au profit
# bougies de plus par %
cooldown_candles = 12 + 6 * (int(self.pairs[pair]['last_profit'] / 0.01)) # réglable
@@ -504,7 +512,7 @@ class Empty(IStrategy):
condition = (candles_since_close >= cooldown_candles)
print(f"Cool 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)
allow_to_buy = (condition and not self.pairs[pair]['stop']) | (entry_tag == 'force_entry')
@@ -530,6 +538,7 @@ class Empty(IStrategy):
self.pairs[pair]['last_min'] = min(last_candle['close'], self.pairs[pair]['last_min'])
self.pairs[pair]['last_date'] = current_time
dispo = round(self.wallets.get_available_stake_amount())
# self.printLineLog()
@@ -563,7 +572,7 @@ class Empty(IStrategy):
profit = trade.calc_profit(rate)
force = self.pairs[pair]['force_sell']
allow_to_sell = (last_candle['hapercent'] < 0 and profit > 0) or force or (exit_reason == 'force_exit') or (exit_reason == 'stop_loss') or (exit_reason == 'trailing_stop_loss')
allow_to_sell = (last_candle['hapercent'] < 0 and profit > 0) or force or (exit_reason == 'god') or (exit_reason == 'force_exit') or (exit_reason == 'stop_loss') or (exit_reason == 'trailing_stop_loss')
minutes = int(round((current_time - trade.date_last_filled_utc).total_seconds() / 60, 0))
@@ -594,7 +603,7 @@ class Empty(IStrategy):
self.pairs[pair]['max_touch'] = 0
self.pairs[pair]['last_buy'] = 0
self.pairs[pair]['last_date'] = current_time
self.pairs[pair]['last_trade'] = self.pairs[pair]['current_trade']
self.pairs[pair]['last_trade'] = trade
self.pairs[pair]['current_trade'] = None
else:
print(f"{current_time} STOP triggered for {pair} ({exit_reason}) but condition blocked", "warning")
@@ -620,36 +629,41 @@ class Empty(IStrategy):
return None
# def custom_stoploss(self, pair, trade, current_time, current_rate, current_profit, **kwargs):
# dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
# last_candle = dataframe.iloc[-1]
# profit = trade.calc_profit(current_rate)
#
# # print(f'test stop loss {self.stoploss} {last_candle["stop_buying12_1d"]}')
# if last_candle[self.stoploss_indicator.value] and (trade.nr_of_successful_entries >= 4 or self.wallets.get_available_stake_amount() < 300): # and profit < - 30 :
# range_min = last_candle[f"min{self.stoploss_timeperiod.value}_1d"]
# range_max = last_candle[f"max{self.stoploss_timeperiod.value}_1d"]
#
# if range_max == range_min:
# print(f'ranges={range_min}')
# return -0.1 # sécurité
#
# range_pos = (current_rate - range_min) / (range_max - range_min)
#
# if (range_pos > 1):
# return -1
#
# sl_min = -0.02
# sl_max = -0.1 #self.stoploss
#
# dynamic_sl = (sl_min + (1 - range_pos) * (sl_max - sl_min))
#
# print(f'{current_time} Loss ranges={round(range_min,0)} {round(range_max, 0)} range_pos={round(range_pos, 3)} dynamic_sl={round(dynamic_sl, 3)} '
# f'profit={profit} current={current_profit} {self.stoploss_indicator.value} {self.stoploss_timeperiod.value} {last_candle[self.stoploss_indicator.value]}')
#
# return dynamic_sl
#
# return -1
def custom_stoploss(self, pair, trade, current_time, current_rate, current_profit, **kwargs):
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
last_candle = dataframe.iloc[-1]
profit = trade.calc_profit(current_rate)
candle_at_buy = self.pairs[pair]['last_candle']
if candle_at_buy['range_pos'] > self.range_pos_stoploss.value and candle_at_buy[self.stoploss_indicator.value] < 0:
return self.stoploss_force.value
# # print(f'test stop loss {self.stoploss} {last_candle["stop_buying12_1d"]}')
# if last_candle[self.stoploss_indicator.value] and (trade.nr_of_successful_entries >= 4 or self.wallets.get_available_stake_amount() < 300): # and profit < - 30 :
# range_min = last_candle[f"min{self.stoploss_timeperiod.value}_1d"]
# range_max = last_candle[f"max{self.stoploss_timeperiod.value}_1d"]
#
# if range_max == range_min:
# print(f'ranges={range_min}')
# return -0.1 # sécurité
#
# range_pos = (current_rate - range_min) / (range_max - range_min)
#
# if (range_pos > 1):
# return -1
#
# sl_min = -0.02
# sl_max = -0.1 #self.stoploss
#
# dynamic_sl = (sl_min + (1 - range_pos) * (sl_max - sl_min))
#
# print(f'{current_time} Loss ranges={round(range_min,0)} {round(range_max, 0)} range_pos={round(range_pos, 3)} dynamic_sl={round(dynamic_sl, 3)} '
# f'profit={profit} current={current_profit} {self.stoploss_indicator.value} {self.stoploss_timeperiod.value} {last_candle[self.stoploss_indicator.value]}')
#
# return dynamic_sl
return -1
def informative_pairs(self):
# get access to all pairs available in whitelist.
@@ -725,7 +739,7 @@ class Empty(IStrategy):
range_min = dataframe[f"min12_1d"]
range_max = dataframe[f"max48"]
dataframe[f"range_pos"] = (dataframe['close'] - range_min) / (range_max - range_min)
dataframe[f"range_pos"] = ((dataframe['mid'] - range_min) / (range_max)).rolling(5).mean()
# récupérer le dernier trade fermé
@@ -791,11 +805,11 @@ class Empty(IStrategy):
# buy_real_num
# )
# conditions.append(condition)
conditions.append((dataframe[self.stop_buying_indicator.value] == False))
conditions.append((dataframe[self.stop_buying_indicator.value] == False) | (dataframe['range_pos'] < 0))
# conditions.append(dataframe['hapercent'] > 0)
conditions.append(dataframe['hapercent'] > 0)
# # conditions.append(dataframe[f"range_pos"] <= 0.5)
# conditions.append(dataframe[f"sma5_deriv1"] > 0)
# conditions.append((dataframe[f"range_pos"] < 0.01) | ((dataframe[f"sma5_deriv1"] > 0) & (dataframe[f"sma12_deriv1"] > 0) & (dataframe[f"sma24_deriv1"] > 0)))
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"
@@ -812,7 +826,7 @@ class Empty(IStrategy):
return dataframe
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# conditions = list()
conditions = list()
# # TODO: Its not dry code!
# sell_indicator = self.sell_indicator0.value
# sell_crossed_indicator = self.sell_crossed_indicator0.value
@@ -861,6 +875,9 @@ class Empty(IStrategy):
# )
#
#
# conditions.append(qtpylib.crossed_below(dataframe['mid'], dataframe['sma24']))
# conditions.append((dataframe['range_pos'] > 0.04))
#
# if conditions:
# dataframe.loc[reduce(lambda x, y: x & y, conditions), ['exit_long', 'exit_tag']] = (1, 'god')
return dataframe

207
Empty.txt
View File

@@ -1,126 +1,127 @@
BACKTESTING REPORT
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDC ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ BTC/USDC │ 453.05903.53390.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │
│ TOTAL │ 453.05903.53390.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │
│ BTC/USDT │ 492.64680.53568.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │
│ TOTAL │ 492.64680.53568.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┘
LEFT OPEN TRADES REPORT
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDC ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ BTC/USDC │ 1 │ -40.58-1300.800-130.08 │ 129 days, 4:00:00 │ 0 0 1 0 │
│ TOTAL │ 1 │ -40.58 │ -1300.800-130.08 │ 129 days, 4:00:00 │ 0 0 1 0 │
│ BTC/USDT │ 1 │ -27.24 -629.763 -62.98 │ 98 days, 12:00:00 │ 0 0 1 0 │
│ TOTAL │ 1 │ -27.24 -629.763 -62.98 │ 98 days, 12:00:00 │ 0 0 1 0 │
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴───────────────────┴────────────────────────┘
ENTER TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit USDC ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ god │ 453.05903.53390.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │
│ TOTAL │ 453.05903.53390.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │
│ god │ 492.64680.53568.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │
│ TOTAL │ 492.64680.53568.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │
└───────────┴─────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┘
EXIT REASON STATS
┏━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit USDC ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ momentum_drop │ 444.042204.333220.4312 days, 11:29:00 │ 44 0 0 100 │
force_exit1 │ -40.58 │ -1300.800 │ -130.08 │ 129 days, 4:00:00 │ 0 0 1 0
TOTAL45 3.05 903.533 │ 90.35 │ 15 days, 1:43:00 │ 44 0 1 97.8
└───────────────┴───────┴──────────────┴─────────────────┴──────────────┴───────────────────┴────────────────────────┘
MIXED TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDC ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ god │ momentum_drop │ 44 │ 4.04 │ 2204.333 │ 220.43 │ 12 days, 11:29:00 │ 44 0 0 100 │
│ god │ force_exit 1 │ -40.58-1300.800 │ -130.08 │ 129 days, 4:00:00 │ 0 0 1 0 │
TOTAL │ 453.05 903.53390.35 │ 15 days, 1:43:00 │ 44 0 1 97.8
└───────────┴───────────────┴────────┴──────────────┴─────────────────┴──────────────┴───────────────────┴────────────────────────┘
EXIT REASON STATS
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
momentum_drop │ 423.771324.780132.48 14 days, 0:14:00 │ 42 0 0 100 │
trailing_stop_loss6 -0.28 │ -14.483 │ -1.45 │ 1:30:00 │ 2 0 4 33.3
force_exit 1-27.24-629.763 │ -62.98 │ 98 days, 12:00:00 │ 0 0 1 0
│ TOTAL │ 49 │ 2.64 │ 680.535 │ 68.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │
└────────────────────┴───────┴──────────────┴─────────────────┴──────────────┴───────────────────┴────────────────────────┘
MIXED TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ god │ momentum_drop42 │ 3.77 1324.780 │ 132.48 │ 14 days, 0:14:00 │ 42 0 0 100 │
god │ trailing_stop_loss │ 6 │ -0.28-14.483-1.45 1:30:00 │ 2 0 4 33.3
│ god │ force_exit │ 1 │ -27.24 │ -629.763 │ -62.98 │ 98 days, 12:00:00 │ 0 0 1 0 │
│ TOTAL │ │ 49 │ 2.64 │ 680.535 │ 68.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │
└───────────┴────────────────────┴────────┴──────────────┴─────────────────┴──────────────┴───────────────────┴────────────────────────┘
MONTH BREAKDOWN
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Month ┃ Trades ┃ Tot Profit USDC ┃ Profit Factor ┃ Win Draw Loss Win% ┃
┃ Month ┃ Trades ┃ Tot Profit USDT ┃ Profit Factor ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 31/01/2024 │ 3101.297 │ 0.0 │ 3 0 0 100 │
│ 29/02/2024 │ 5 │ 123.805 │ 0.0 │ 5 0 0 100 │
│ 31/03/2024 │ 4 │ 119.449 0.04 0 0 100
│ 30/04/2024 │ 248.352 │ 0.0 │ 2 0 0 100 │
│ 31/05/2024 │ 3102.779 │ 0.0 │ 3 0 0 100 │
│ 30/06/2024 │ 140.932 │ 0.0 │ 1 0 0 100 │
│ 31/07/2024 │ 4163.017 │ 0.0 │ 4 0 0 100 │
│ 31/01/2024 │ 2 30.559 │ 0.0 │ 2 0 0 100 │
│ 29/02/2024 │ 7 │ 155.223 │ 0.0 │ 7 0 0 100 │
│ 31/03/2024 │ 6 │ 130.89833.945 0 1 83.3
│ 30/04/2024 │ 114.465 │ 0.0 │ 1 0 0 100 │
│ 31/05/2024 │ 1 77.139 │ 0.0 │ 1 0 0 100 │
│ 30/06/2024 │ 0 0 │ 0.0 │ 0 0 0 0 │
│ 31/07/2024 │ 1 21.35 │ 0.0 │ 1 0 0 100 │
│ 31/08/2024 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 30/09/2024 │ 0 0 │ 0.0 │ 0 0 0 0 │
│ 31/10/2024 │ 2 84.227 0.02 0 0 100 │
│ 30/11/2024 │ 5301.166 0.05 0 0 100 │
│ 31/12/2024 │ 196.283 │ 0.0 │ 1 0 0 100 │
│ 31/01/2025 │ 3 │ 160.102 │ 0.0 │ 3 0 0 100 │
│ 30/09/2024 │ 116.997 │ 0.0 │ 1 0 0 100 │
│ 31/10/2024 │ 4122.33218.653 0 1 75.0 │
│ 30/11/2024 │ 8178.68512.586 0 2 75.0 │
│ 31/12/2024 │ 361.642 │ 0.0 │ 3 0 0 100 │
│ 31/01/2025 │ 2 │ 100.148 │ 0.0 │ 2 0 0 100 │
│ 28/02/2025 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 31/03/2025 │ 162.274 │ 0.0 │ 1 0 0 100 │
│ 30/04/2025 │ 1192.722 │ 0.0 │ 1 0 0 100 │
│ 31/05/2025 │ 3 │ 138.491 │ 0.0 │ 3 0 0 100 │
│ 30/06/2025 │ 0 0 │ 0.0 │ 0 0 0 0 │
│ 31/07/2025 │ 2 │ 210.269 │ 0.0 │ 2 0 0 100 │
│ 31/08/2025 │ 2 │ 72.441 │ 0.0 │ 2 0 0 100 │
│ 30/09/2025 │ 161.018 │ 0.0 │ 1 0 0 100 │
│ 31/10/2025 │ 1125.709 │ 0.0 │ 1 0 0 100 │
│ 31/03/2025 │ 0 0 │ 0.0 │ 0 0 0 0 │
│ 30/04/2025 │ 0 0 │ 0.0 │ 0 0 0 0 │
│ 31/05/2025 │ 3 │ 71.136 │ 0.0 │ 3 0 0 100 │
│ 30/06/2025 │ 292.872 │ 0.0 │ 2 0 0 100 │
│ 31/07/2025 │ 2 │ 82.561 │ 0.0 │ 2 0 0 100 │
│ 31/08/2025 │ 2 │ 68.278 │ 0.0 │ 2 0 0 100 │
│ 30/09/2025 │ 0 0 │ 0.0 │ 0 0 0 0 │
│ 31/10/2025 │ 3 86.012 │ 0.0 │ 3 0 0 100 │
│ 30/11/2025 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 31/12/2025 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 31/01/2026 │ 0 │ 0 │ 0.0 │ 0 0 0 0 │
│ 28/02/2026 │ 1 │ -1300.8 │ 0.0 │ 0 0 1 0 │
│ 28/02/2026 │ 1 │ -629.763 │ 0.0 │ 0 0 1 0 │
└────────────┴────────┴─────────────────┴───────────────┴────────────────────────┘
SUMMARY METRICS
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ Metric ┃ Value
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
│ Backtesting from │ 2024-01-01 00:00:00
│ Backtesting to │ 2026-02-10 00:00:00
│ Trading Mode │ Spot
│ Max open trades │ 1
│ │
│ Total/Daily Avg Trades │ 45 / 0.06
│ Starting balance │ 1000 USDC
│ Final balance │ 1903.533 USDC
│ Absolute profit │ 903.533 USDC
│ Total profit % │ 90.35%
│ CAGR % │ 35.63%
│ Sortino │ -100.00
│ Sharpe │ 0.11
│ Calmar │ 5.52
│ SQN │ 0.66
│ Profit factor │ 1.69
│ Expectancy (Ratio) │ 20.08 (0.02)
│ Avg. daily profit │ 1.172 USDC
│ Avg. stake amount │ 1314.959 USDC
│ Total trade volume │ 119488.585 USDC
│ │
│ Best Pair │ BTC/USDC 90.35%
│ Worst Pair │ BTC/USDC 90.35%
│ Best trade │ BTC/USDC 9.64%
│ Worst trade │ BTC/USDC -40.58%
│ Best day │ 192.722 USDC
│ Worst day │ -1300.8 USDC
│ Days win/draw/lose │ 44 / 726 / 1
│ Min/Max/Avg. Duration Winners │ 0d 16:00 / 85d 14:00 / 12d 11:29
│ Min/Max/Avg. Duration Losers │ 129d 04:00 / 129d 04:00 / 129d 04:00
│ Max Consecutive Wins / Loss │ 44 / 1
│ Rejected Entry signals │ 0
│ Entry/Exit Timeouts │ 0 / 0
│ │
│ Min balance │ 1029.974 USDC
│ Max balance │ 3204.333 USDC
│ Max % of account underwater │ 40.60%
│ Absolute drawdown │ 1300.8 USDC (40.60%)
│ Drawdown duration │ 129 days 23:00:00
│ Profit at drawdown start │ 2204.333 USDC
│ Profit at drawdown end │ 903.533 USDC
│ Drawdown start │ 2025-10-03 01:00:00
│ Drawdown end │ 2026-02-10 00:00:00
│ Market change │ 64.37%
└───────────────────────────────┴──────────────────────────────────────
SUMMARY METRICS
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2024-01-01 00:00:00 │
│ Backtesting to │ 2026-02-10 00:00:00 │
│ Trading Mode │ Spot │
│ Max open trades │ 1 │
│ │ │
│ Total/Daily Avg Trades │ 49 / 0.06 │
│ Starting balance │ 1000 USDT
│ Final balance │ 1680.535 USDT
│ Absolute profit │ 680.535 USDT
│ Total profit % │ 68.05%
│ CAGR % │ 27.86%
│ Sortino │ 0.07
│ Sharpe │ 0.18
│ Calmar │ 6.19
│ SQN │ 1.02
│ Profit factor │ 2.04
│ Expectancy (Ratio) │ 13.89 (0.11)
│ Avg. daily profit │ 0.883 USDT
│ Avg. stake amount │ 879.203 USDT
│ Total trade volume │ 87016.262 USDT
│ │ │
│ Best Pair │ BTC/USDT 68.05%
│ Worst Pair │ BTC/USDT 68.05%
│ Best trade │ BTC/USDT 8.49%
│ Worst trade │ BTC/USDT -27.24%
│ Best day │ 77.139 USDT
│ Worst day │ -629.763 USDT
│ Days win/draw/lose │ 44 / 723 / 4
│ Min/Max/Avg. Duration Winners │ 0d 01:00 / 96d 06:00 / 13d 09:00
│ Min/Max/Avg. Duration Losers │ 0d 00:00 / 98d 12:00 / 19d 18:12
│ Max Consecutive Wins / Loss │ 18 / 1 │
│ Rejected Entry signals │ 0 │
│ Entry/Exit Timeouts │ 0 / 0 │
│ │ │
│ Min balance │ 1019.449 USDT
│ Max balance │ 2310.297 USDT
│ Max % of account underwater │ 27.26%
│ Absolute drawdown │ 629.763 USDT (27.26%)
│ Drawdown duration │ 107 days 09:00:00 │
│ Profit at drawdown start │ 1310.297 USDT
│ Profit at drawdown end │ 680.535 USDT
│ Drawdown start │ 2025-10-25 15:00:00 │
│ Drawdown end │ 2026-02-10 00:00:00 │
│ Market change │ 64.40%
└───────────────────────────────┴──────────────────────────────────┘
Backtested 2024-01-01 00:00:00 -> 2026-02-10 00:00:00 | Max open trades : 1
STRATEGY SUMMARY
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDC ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩
│ Empty │ 453.05903.53390.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │ 1300.8 USDC 40.60% │
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┴─────────────────────┘
STRATEGY SUMMARY
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━
┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━
│ Empty │ 492.64680.53568.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │ 629.763 USDT 27.26% │
└──────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┴─────────────────────