From 60ed27529aa9c49a1d277292c5ede8bba22f224b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Delacotte?= Date: Sat, 21 Feb 2026 18:40:21 +0100 Subject: [PATCH] =?UTF-8?q?=E2=94=8F=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=B3?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=B3=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=B3=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=B3?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=B3=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=B3=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=B3=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=93=20=E2=94=83=20Str?= =?UTF-8?q?ategy=20=E2=94=83=20Trades=20=E2=94=83=20Avg=20Profit=20%=20?= =?UTF-8?q?=E2=94=83=20Tot=20Profit=20USDT=20=E2=94=83=20Tot=20Profit=20%?= =?UTF-8?q?=20=E2=94=83=20=20=20=20=20Avg=20Duration=20=E2=94=83=20=20Win?= =?UTF-8?q?=20=20Draw=20=20Loss=20=20Win%=20=E2=94=83=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20Drawdown=20=E2=94=83=20=E2=94=A1=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=95=87=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=95=87=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=95=87=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=95=87=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=95=87=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=95=87=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=95=87=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81?= =?UTF-8?q?=E2=94=A9=20=E2=94=82=20=20=20=20Empty=20=E2=94=82=20=20=20=20?= =?UTF-8?q?=2049=20=E2=94=82=20=20=20=20=20=20=20=20=202.64=20=E2=94=82=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20680.535=20=E2=94=82=20=20=20=20=20=20?= =?UTF-8?q?=20=2068.05=20=E2=94=82=2014=20days,=200:38:00=20=E2=94=82=20?= =?UTF-8?q?=20=2044=20=20=20=20=200=20=20=20=20=205=20=2089.8=20=E2=94=82?= =?UTF-8?q?=20629.763=20USDT=20=2027.26%=20=E2=94=82=20=E2=94=94=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=B4=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=B4=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=B4=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=B4=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=B4=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=B4=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=B4=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80?= =?UTF-8?q?=E2=94=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Empty.json | 13 ++-- Empty.py | 117 +++++++++++++++++------------- Empty.txt | 207 +++++++++++++++++++++++++++-------------------------- 3 files changed, 178 insertions(+), 159 deletions(-) diff --git a/Empty.json b/Empty.json index 9925e50..a999f22 100644 --- a/Empty.json +++ b/Empty.json @@ -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" } \ No newline at end of file diff --git a/Empty.py b/Empty.py index 8f41af7..26d771f 100644 --- a/Empty.py +++ b/Empty.py @@ -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 diff --git a/Empty.txt b/Empty.txt index 1e31e5d..3c4af31 100644 --- a/Empty.txt +++ b/Empty.txt @@ -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 │ 45 │ 3.05 │ 903.533 │ 90.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │ -│ TOTAL │ 45 │ 3.05 │ 903.533 │ 90.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │ +│ BTC/USDT │ 49 │ 2.64 │ 680.535 │ 68.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │ +│ TOTAL │ 49 │ 2.64 │ 680.535 │ 68.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 │ 45 │ 3.05 │ 903.533 │ 90.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │ -│ TOTAL │ 45 │ 3.05 │ 903.533 │ 90.35 │ 15 days, 1:43:00 │ 44 0 1 97.8 │ +│ god │ 49 │ 2.64 │ 680.535 │ 68.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │ +│ TOTAL │ 49 │ 2.64 │ 680.535 │ 68.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 │ 44 │ 4.04 │ 2204.333 │ 220.43 │ 12 days, 11:29:00 │ 44 0 0 100 │ -│ force_exit │ 1 │ -40.58 │ -1300.800 │ -130.08 │ 129 days, 4:00:00 │ 0 0 1 0 │ -│ TOTAL │ 45 │ 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 │ │ 45 │ 3.05 │ 903.533 │ 90.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 │ 42 │ 3.77 │ 1324.780 │ 132.48 │ 14 days, 0:14:00 │ 42 0 0 100 │ +│ trailing_stop_loss │ 6 │ -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_drop │ 42 │ 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 │ 3 │ 101.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.0 │ 4 0 0 100 │ -│ 30/04/2024 │ 2 │ 48.352 │ 0.0 │ 2 0 0 100 │ -│ 31/05/2024 │ 3 │ 102.779 │ 0.0 │ 3 0 0 100 │ -│ 30/06/2024 │ 1 │ 40.932 │ 0.0 │ 1 0 0 100 │ -│ 31/07/2024 │ 4 │ 163.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.898 │ 33.94 │ 5 0 1 83.3 │ +│ 30/04/2024 │ 1 │ 14.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.0 │ 2 0 0 100 │ -│ 30/11/2024 │ 5 │ 301.166 │ 0.0 │ 5 0 0 100 │ -│ 31/12/2024 │ 1 │ 96.283 │ 0.0 │ 1 0 0 100 │ -│ 31/01/2025 │ 3 │ 160.102 │ 0.0 │ 3 0 0 100 │ +│ 30/09/2024 │ 1 │ 16.997 │ 0.0 │ 1 0 0 100 │ +│ 31/10/2024 │ 4 │ 122.332 │ 18.65 │ 3 0 1 75.0 │ +│ 30/11/2024 │ 8 │ 178.685 │ 12.58 │ 6 0 2 75.0 │ +│ 31/12/2024 │ 3 │ 61.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 │ 1 │ 62.274 │ 0.0 │ 1 0 0 100 │ -│ 30/04/2025 │ 1 │ 192.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 │ 1 │ 61.018 │ 0.0 │ 1 0 0 100 │ -│ 31/10/2025 │ 1 │ 125.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 │ 2 │ 92.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 │ 45 │ 3.05 │ 903.533 │ 90.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 │ 49 │ 2.64 │ 680.535 │ 68.05 │ 14 days, 0:38:00 │ 44 0 5 89.8 │ 629.763 USDT 27.26% │ +└──────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┴──────────────────────┘