From fdf1918b58470b89c0ae8ac81d0dc89255630985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Delacotte?= Date: Wed, 22 Oct 2025 23:26:45 +0200 Subject: [PATCH] Zeus_8_3_2_B_4_2 20240101-20250714 1309 --- Zeus_8_3_2_B_4_2.py | 817 ++++++++++++++++++++----------------- Zeus_8_3_2_B_4_2_Bilan.txt | 471 ++++++++++++--------- 2 files changed, 715 insertions(+), 573 deletions(-) diff --git a/Zeus_8_3_2_B_4_2.py b/Zeus_8_3_2_B_4_2.py index f4ade2e..2d03fc5 100644 --- a/Zeus_8_3_2_B_4_2.py +++ b/Zeus_8_3_2_B_4_2.py @@ -54,7 +54,7 @@ def normalize(df): class Zeus_8_3_2_B_4_2(IStrategy): levels = [1, 2, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] - startup_candle_count = 12 * 24 * 2 + startup_candle_count = 12 * 24 * 5 # ROI table: minimal_roi = { @@ -81,15 +81,15 @@ class Zeus_8_3_2_B_4_2(IStrategy): plot_config = { "main_plot": { - "sma5_1h": { - "color": "white" + "sma24_1h": { + "color": "pink" }, "sma5_1d": { "color": "blue" }, - "sma20": { - "color": "yellow" - }, + # "sma24": { + # "color": "yellow" + # }, "sma60": { "color": "green" }, @@ -98,7 +98,10 @@ class Zeus_8_3_2_B_4_2(IStrategy): "bb_upperband": { "color": "#da59a6", }, - "sma10": { + # "sma12": { + # "color": "blue" + # }, + "mid_smooth_3_1h": { "color": "blue" } }, @@ -106,7 +109,10 @@ class Zeus_8_3_2_B_4_2(IStrategy): "Rsi": { "max_rsi_24": { "color": "blue" - } + }, + "max_rsi_24_1h": { + "color": "pink" + }, # "rsi_1h": { # "color": "red" # }, @@ -115,26 +121,46 @@ class Zeus_8_3_2_B_4_2(IStrategy): # } }, "Rsi_deriv1": { - # "rsi_deriv1_1h": { - # "color": "red" - # }, - # "rsi_deriv1_1d": { - # "color": "blue" - # }, + "sma24_deriv1_1h": { + "color": "pink" + }, + "sma24_deriv1": { + "color": "yellow" + }, + "sma5_deriv1_1d": { + "color": "blue" + }, "sma60_deriv1": { "color": "green" } }, "Rsi_deriv2": { - "rsi_deriv2_1h": { - "color": "red" + "sma24_deriv2_1h": { + "color": "pink" }, - "rsi_deriv2_1d": { + "sma24_deriv2": { + "color": "yellow" + }, + "sma5_deriv2_1d": { "color": "blue" }, "sma60_deriv2": { "color": "green" } + }, + "States": { + "sma24_state_1h": { + "color": "pink" + }, + "sma24_state": { + "color": "yellow" + }, + "sma5_state_1d": { + "color": "blue" + }, + "sma60_state": { + "color": "green" + } } } } @@ -151,15 +177,14 @@ class Zeus_8_3_2_B_4_2(IStrategy): 'count_of_buys': 0, 'current_profit': 0, 'expected_profit': 0, + 'previous_profit': 0, "last_candle": {}, - "last_trade": None, "last_count_of_buys": 0, 'base_stake_amount': 0, 'stop_buy': False, 'last_date': 0, 'stop': False, 'max_profit': 0, - 'last_palier_index': -1, 'total_amount': 0, 'has_gain': 0, 'force_sell': False, @@ -189,14 +214,14 @@ class Zeus_8_3_2_B_4_2(IStrategy): trades = list() max_profit_pairs = {} - # sma20_deriv1_1d_stop_protection = DecimalParameter(-0.2, 0.2, default=0.05, decimals=2, space='protection', + # sma24_deriv1_1d_stop_protection = DecimalParameter(-0.2, 0.2, default=0.05, decimals=2, space='protection', # optimize=True, load=True) sma5_deriv1_1d_stop_protection = DecimalParameter(-5, 0, default=0.5, decimals=1, space='protection', optimize=True, load=True) sma5_deriv2_1d_stop_protection = DecimalParameter(-5, 0, default=0.5, decimals=1, space='protection', optimize=True, load=True) - # sma20_deriv1_1d_start_protection = DecimalParameter(-0.2, 0.2, default=0.05, decimals=2, space='protection', + # sma24_deriv1_1d_start_protection = DecimalParameter(-0.2, 0.2, default=0.05, decimals=2, space='protection', # optimize=True, load=True) sma5_deriv1_1d_restart_protection = DecimalParameter(0, 5, default=0.5, decimals=1, space='protection', optimize=True, load=True) @@ -297,8 +322,8 @@ class Zeus_8_3_2_B_4_2(IStrategy): # val = self.getProbaHausse144(last_candle) # allow_to_buy = True #(not self.stop_all) #& (not self.all_down) - allow_to_buy = not self.pairs[pair][ - 'stop'] # and val > self.buy_val.value #not last_candle['tendency'] in ('B-', 'B--') # (rate <= float(limit)) | (entry_tag == 'force_entry') + # and val > self.buy_val.value #not last_candle['tendency'] in ('B-', 'B--') # (rate <= float(limit)) | (entry_tag == 'force_entry') + allow_to_buy = not self.pairs[pair]['stop'] | (entry_tag == 'force_entry') # if allow_to_buy: # poly_func, x_future, y_future, count = self.polynomial_forecast( @@ -325,7 +350,6 @@ class Zeus_8_3_2_B_4_2(IStrategy): self.pairs[pair]['last_candle'] = last_candle self.pairs[pair]['count_of_buys'] = 1 self.pairs[pair]['current_profit'] = 0 - self.pairs[pair]['last_palier_index'] = -1 self.pairs[pair]['last_max'] = max(last_candle['close'], self.pairs[pair]['last_max']) self.pairs[pair]['last_min'] = min(last_candle['close'], self.pairs[pair]['last_min']) @@ -359,7 +383,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): last_candle = dataframe.iloc[-1].squeeze() force = self.pairs[pair]['force_sell'] - allow_to_sell = (last_candle['percent'] < 0) # or force + allow_to_sell = (last_candle['hapercent'] < 0) or force or (exit_reason == 'force_exit') minutes = int(round((current_time - trade.date_last_filled_utc).total_seconds() / 60, 0)) @@ -367,9 +391,9 @@ class Zeus_8_3_2_B_4_2(IStrategy): self.trades = list() self.pairs[pair]['last_count_of_buys'] = trade.nr_of_successful_entries # self.pairs[pair]['count_of_buys'] self.pairs[pair]['last_sell'] = rate - self.pairs[pair]['last_trade'] = trade self.pairs[pair]['last_candle'] = last_candle self.pairs[pair]['max_profit'] = 0 + self.pairs[pair]['previous_profit'] = 0 self.trades = list() dispo = round(self.wallets.get_available_stake_amount()) # print(f"Sell {pair} {current_time} {exit_reason} dispo={dispo} amount={amount} rate={rate} open_rate={trade.open_rate}") @@ -391,8 +415,6 @@ class Zeus_8_3_2_B_4_2(IStrategy): self.pairs[pair]['max_touch'] = 0 self.pairs[pair]['last_buy'] = 0 self.pairs[pair]['last_date'] = current_time - self.pairs[pair]['last_palier_index'] = -1 - self.pairs[pair]['last_trade'] = trade self.pairs[pair]['current_trade'] = None return (allow_to_sell) | (exit_reason == 'force_exit') @@ -459,28 +481,42 @@ class Zeus_8_3_2_B_4_2(IStrategy): stake=0 ) - # if last_candle['mid_smooth_1h_deriv1'] > self.sma5_deriv1_1h_stop_sell.value \ - # and last_candle['mid_smooth_1h_deriv2'] > self.sma5_deriv2_1h_stop_sell.value: - # return None - # if (last_candle['mid_smooth_deriv1'] >= 0): # return None # if (last_candle['tendency'] in ('H++', 'H+')) and (last_candle['rsi'] < 80): # return None # - # if (last_candle['sma20_deriv1'] < 0 and before_last_candle['sma20_deriv1'] >= 0) and (current_profit > expected_profit): + # if (last_candle['sma24_deriv1'] < 0 and before_last_candle['sma24_deriv1'] >= 0) and (current_profit > expected_profit): # return 'Drv_' + str(count_of_buys) pair_name = self.getShortName(pair) # if (current_profit > expected_profit) and last_candle['can_sell']: # return 'Can_' + pair_name + '_' + str(count_of_buys) - # if self.pairs[pair]['force_sell']: - # self.pairs[pair]['force_sell'] = False - # return 'Force' + pair_name + '_' + str(count_of_buys) + '_' + str(self.pairs[pair]['has_gain']) + if last_candle['sma24_deriv2_1h'] > 0: + return None - if profit > 0.5 * count_of_buys and baisse > 0.15: + if last_candle['max_rsi_24'] > 85 and profit > max(5, expected_profit) and (last_candle['hapercent'] < 0) and last_candle['sma60_deriv1'] < 0.05: self.pairs[pair]['force_sell'] = False - return str(count_of_buys) + '_' + 'Bas_' + pair_name + '_' + str(self.pairs[pair]['has_gain']) + self.pairs[pair]['force_buy'] = (self.pairs[pair]['count_of_buys'] - self.pairs[pair]['has_gain'] > 3) + return str(count_of_buys) + '_' + 'Rsi85_' + pair_name + '_' + str(self.pairs[pair]['has_gain']) + + if self.pairs[pair]['force_sell']: + self.pairs[pair]['force_sell'] = False + self.pairs[pair]['force_buy'] = (self.pairs[pair]['count_of_buys'] - self.pairs[pair]['has_gain'] > 3) + return str(count_of_buys) + '_' + 'Frc_' + pair_name + '_' + str(self.pairs[pair]['has_gain']) + + if profit > max(5, expected_profit) and baisse > 0.30: + self.pairs[pair]['force_sell'] = False + self.pairs[pair]['force_buy'] = (self.pairs[pair]['count_of_buys'] - self.pairs[pair]['has_gain'] > 3) + return str(count_of_buys) + '_' + 'B30_' + pair_name + '_' + str(self.pairs[pair]['has_gain']) + + if max_profit > 0.5 * count_of_buys and baisse > 0.15 and last_candle['sma12_state'] <= 0 and last_candle['sma60_state'] <= - 1: + self.pairs[pair]['force_sell'] = False + self.pairs[pair]['force_buy'] = (self.pairs[pair]['count_of_buys'] - self.pairs[pair]['has_gain'] > 3) + return str(count_of_buys) + '_' + 'B15_' + pair_name + '_' + str(self.pairs[pair]['has_gain']) + + if (last_candle['sma5_1h'] - before_last_candle_12['sma5_1h']) / last_candle['sma5_1h'] > 0.0002: + return None factor = 1 if (self.getShortName(pair) == 'BTC'): @@ -493,7 +529,8 @@ class Zeus_8_3_2_B_4_2(IStrategy): # if 1 <= count_of_buys <= 3: if last_candle['max_rsi_24'] > 75 and profit > expected_profit and (last_candle['hapercent'] < 0) and last_candle['sma60_deriv1'] < 0: self.pairs[pair]['force_sell'] = False - return str(count_of_buys) + '_' + 'Rsi_' + pair_name + '_' + str(self.pairs[pair]['has_gain']) + return str(count_of_buys) + '_' + 'Rsi75_' + pair_name + '_' + str(self.pairs[pair]['has_gain']) + # if last_candle['mid_smooth_1h_deriv1'] < 0 and profit > expected_profit: # self.pairs[pair]['force_sell'] = False @@ -566,11 +603,11 @@ class Zeus_8_3_2_B_4_2(IStrategy): if self.columns_logged % 10 == 0: self.printLog( f"| {'Date':<16} | {'Action':<10} |{'Pair':<5}| {'Trade Type':<18} |{'Rate':>8} | {'Dispo':>6} | {'Profit':>8} | {'Pct':>6} | {'max_touch':>11} | {'last_lost':>12} | {'last_max':>7}| {'last_max':>7}|{'Buys':>5}| {'Stake':>5} |" - f"Tdc|{'rsi':>6}|Distmax|s201d|s5_1d|s5_2d|s51h|s52h|smt1h|smt2h|" + f"{'rsi':>6}|Distmax|s201d|s5_1d|s5_2d|s51h|s52h|smt1h|smt2h|" ) self.printLineLog() df = pd.DataFrame.from_dict(self.pairs, orient='index') - colonnes_a_exclure = ['last_candle', 'last_trade', 'last_palier_index', #'current_trade', + colonnes_a_exclure = ['last_candle', '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_filtered["first_buy", "last_max", "max_touch", "last_sell","last_buy", 'count_of_buys', 'current_profit'] @@ -629,7 +666,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): pct60 = round(100 * self.getPct60D(pair, last_candle), 2) color = GREEN if profit > 0 else RED - color_sma20 = GREEN if last_candle['sma20_deriv1_1d'] > 0 else RED + color_sma24 = GREEN if last_candle['sma24_deriv1_1d'] > 0 else RED color_sma5 = GREEN if last_candle['mid_smooth_5_deriv1_1d'] > 0 else RED color_sma5_2 = GREEN if last_candle['mid_smooth_5_deriv2_1d'] > 0 else RED color_sma5_1h = GREEN if last_candle['sma60_deriv1'] > 0 else RED @@ -649,20 +686,20 @@ class Zeus_8_3_2_B_4_2(IStrategy): # πŸ”΄ DΓ©rivΓ©e 1 < 0 et dΓ©rivΓ©e 2 < 0: tendance baissiΓ¨re qui s’accΓ©lΓ¨re. # 🟠 DΓ©rivΓ©e 1 < 0 et dΓ©rivΓ©e 2 > 0: tendance baissiΓ¨re qui ralentit β†’ possible bottom. - # tdc last_candle['tendency_12'] self.printLog( f"| {date:<16} |{action:<10} | {pair[0:3]:<3} | {trade_type or '-':<18} |{rate or '-':>9}| {dispo or '-':>6} " f"|{color}{profit or '-':>10}{RESET}| {pct_max or '-':>6} | {round(self.pairs[pair]['max_touch'], 2) or '-':>11} | {last_lost or '-':>12} " f"| {last_max or '-':>7} | {last_min or '-':>7} |{total_counts or '-':>5}|{stake or '-':>7}" - f"|{last_candle['tendency_12'] or '-':>3}|" # {last_candle['tendency_1h'] or '-':>3}|{last_candle['tendency_1d'] or '-':>3}" # f"|{round(last_candle['mid_smooth_24_deriv1'],3) or '-':>6}|{round(last_candle['mid_smooth_1h_deriv1'],3) or '-':>6}|{round(last_candle['mid_smooth_deriv1_1d'],3) or '-' :>6}|" # f"{round(last_candle['mid_smooth_24_deriv2'],3) or '-' :>6}|{round(last_candle['mid_smooth_1h_deriv2'],3) or '-':>6}|{round(last_candle['mid_smooth_deriv2_1d'],3) or '-':>6}|" f"{round(last_candle['max_rsi_24'], 1) or '-' :>6}|" - f"{dist_max:>7}|{color_sma20}{round(last_candle['sma20_deriv1_1d'], 2):>5}{RESET}" + f"{dist_max:>7}|{color_sma24}{round(last_candle['sma24_deriv1_1d'], 2):>5}{RESET}" f"|{color_sma5}{round(last_candle['mid_smooth_5_deriv1_1d'], 2):>5}{RESET}|{color_sma5_2}{round(last_candle['mid_smooth_5_deriv2_1d'], 2):>5}{RESET}" f"|{color_sma5_1h}{round(last_candle['sma60_deriv1'], 2):>5}{RESET}|{color_sma5_2h}{round(last_candle['sma60_deriv2'], 2):>5}{RESET}" f"|{color_smooth_1h}{round(last_candle['mid_smooth_1h_deriv1'], 2):>5}{RESET}|{color_smooth2_1h}{round(last_candle['mid_smooth_1h_deriv2'], 2):>5}{RESET}" # f"|{last_candle['min60_1d']}|{last_candle['max60_1d']}" + # f"|{last_candle['mid_smooth_tdc_5_1d'] or '-':>3}|{last_candle['mid_smooth_tdc_5_1h'] or '-':>3}|{last_candle['mid_smooth_tdc_5'] or '-':>3}" + f"|{last_candle['mid_smooth_5_state_1d'] or '-':>3}|{last_candle['mid_smooth_24_state_1h'] or '-':>3}|{last_candle['mid_smooth_5_state_1h'] or '-':>3}|{last_candle['mid_smooth_5_state'] or '-':>3}" ) def getLastLost(self, last_candle, pair): @@ -678,8 +715,6 @@ class Zeus_8_3_2_B_4_2(IStrategy): # f"sum1h|sum1d|Tdc|Tdh|Tdd| drv1 |drv_1h|drv_1d|" self.printLog( f"+{'-' * 18}+{'-' * 12}+{'-' * 5}+{'-' * 20}+{'-' * 9}+{'-' * 8}+{'-' * 12}+{'-' * 8}+{'-' * 13}+{'-' * 14}+{'-' * 9}{'-' * 9}+{'-' * 5}+{'-' * 7}+" - f"{'-' * 3}" - # "+{'-' * 3}+{'-' * 3} f"+{'-' * 6}+{'-' * 7}+{'-' * 5}+{'-' * 5}+{'-' * 5}+{'-' * 5}+{'-' * 5}+{'-' * 5}+" ) @@ -692,207 +727,73 @@ class Zeus_8_3_2_B_4_2(IStrategy): if not self.dp.runmode.value in ('hyperopt'): print(str) - def add_tendency_column(self, dataframe: pd.DataFrame, name, suffixe='') -> pd.DataFrame: + def add_tendency_column(self, dataframe: pd.DataFrame, name: str, suffixe: str = '', eps: float = 1e-3, + d1_lim_inf: float = -0.01, d1_lim_sup: float = 0.01) -> pd.DataFrame: + """ + Ajoute une colonne 'tendency' basΓ©e sur les dΓ©rivΓ©es 1 et 2 lissΓ©es et normalisΓ©es. + eps permet de dΓ©finir un seuil proche de zΓ©ro. + suffixe permet de gΓ©rer plusieurs indicateurs. + """ + def tag_by_derivatives(row): d1 = row[f"{name}{suffixe}_deriv1"] d2 = row[f"{name}{suffixe}_deriv2"] - d1_lim_inf = -0.01 - d1_lim_sup = 0.01 - if d1 >= d1_lim_inf and d1 <= d1_lim_sup: # and d2 >= d2_lim_inf and d2 <= d2_lim_sup: - return 'P' # Palier - if d1 == 0.0: - return 'DH' if d2 > 0 else 'DB' # Depart Hausse / DΓ©part Baisse + + # On considΓ¨re les petites valeurs comme zΓ©ro + if abs(d1) < eps: + return 'P' # Palier / neutre if d1 > d1_lim_sup: - return 'H++' if d2 > 0 else 'H+' # Acceleration Hausse / Ralentissement Hausse + return 'H++' if d2 > eps else 'H+' # Acceleration Hausse / Ralentissement Hausse if d1 < d1_lim_inf: - return 'B--' if d2 < 0 else 'B-' # AccΓ©leration Baisse / Ralentissement Baisse + return 'B--' if d2 < -eps else 'B-' # Acceleration Baisse / Ralentissement Baisse + if abs(d1) < eps: + return 'DH' if d2 > eps else 'DB' # Depart Hausse / Depart Baisse return 'Mid' - dataframe[f"tendency{suffixe}"] = dataframe.apply(tag_by_derivatives, axis=1) + print(f"{name}_tdc{suffixe}") + dataframe[f"{name}_tdc{suffixe}"] = dataframe.apply(tag_by_derivatives, axis=1) return dataframe + # def add_tendency_column(self, dataframe: pd.DataFrame, name, suffixe='') -> pd.DataFrame: + # def tag_by_derivatives(row): + # d1 = row[f"{name}{suffixe}_deriv1"] + # d2 = row[f"{name}{suffixe}_deriv2"] + # d1_lim_inf = -0.01 + # d1_lim_sup = 0.01 + # if d1 >= d1_lim_inf and d1 <= d1_lim_sup: # and d2 >= d2_lim_inf and d2 <= d2_lim_sup: + # return 'P' # Palier + # if d1 == 0.0: + # return 'DH' if d2 > 0 else 'DB' # Depart Hausse / DΓ©part Baisse + # if d1 > d1_lim_sup: + # return 'H++' if d2 > 0 else 'H+' # Acceleration Hausse / Ralentissement Hausse + # if d1 < d1_lim_inf: + # return 'B--' if d2 < 0 else 'B-' # AccΓ©leration Baisse / Ralentissement Baisse + # return 'Mid' + # + # dataframe[f"tendency{suffixe}"] = dataframe.apply(tag_by_derivatives, axis=1) + # return dataframe + def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # Add all ta features pair = metadata['pair'] - heikinashi = qtpylib.heikinashi(dataframe) - dataframe['haopen'] = heikinashi['open'] - dataframe['haclose'] = heikinashi['close'] - dataframe['hapercent'] = (dataframe['haclose'] - dataframe['haopen']) / dataframe['haclose'] - dataframe['hapercent3'] = (dataframe['haclose'] - dataframe['haopen'].shift(3)) / dataframe['haclose'].shift(3) - - dataframe['sma5'] = talib.SMA(dataframe, timeperiod=5) - dataframe['sma10'] = talib.SMA(dataframe, timeperiod=10) - self.calculeDerivees(dataframe, 'sma10', horizon=10) - dataframe['sma20'] = talib.SMA(dataframe, timeperiod=20) - self.calculeDerivees(dataframe, 'sma20', horizon=20) - dataframe['sma60'] = talib.SMA(dataframe, timeperiod=60) - self.calculeDerivees(dataframe, 'sma60', horizon=60) - dataframe['sma144'] = talib.SMA(dataframe, timeperiod=144) - self.calculeDerivees(dataframe, 'sma144') - - dataframe["percent"] = (dataframe["close"] - dataframe["open"]) / dataframe["open"] - dataframe["percent3"] = (dataframe["close"] - dataframe["open"].shift(3)) / dataframe["open"].shift(3) - dataframe["percent5"] = (dataframe["close"] - dataframe["open"].shift(5)) / dataframe["open"].shift(5) - dataframe["percent12"] = (dataframe["close"] - dataframe["open"].shift(12)) / dataframe["open"].shift(12) - - dataframe = self.calculateDerivation(dataframe, window=3, suffixe="_3") - # dataframe = self.calculateDerivation(dataframe, window=3, suffixe="_6") - - dataframe["mid_re_smooth_3"] = self.conditional_smoothing(dataframe['mid_smooth_3'].dropna(), - threshold=0.0005).dropna() - self.calculeDerivees(dataframe, "mid_re_smooth_3", horizon=3) - dataframe = self.calculateDerivation(dataframe, window=12, suffixe="_12") - dataframe = self.calculateDerivation(dataframe, window=24, suffixe="_24", factor_1=1000, factor_2=10) - - # print(metadata['pair']) - dataframe['rsi'] = talib.RSI(dataframe['close'], timeperiod=14) - dataframe['max_rsi_24'] = talib.MAX(dataframe['rsi'], timeperiod=24) - self.calculeDerivees(dataframe, 'rsi', horizon=12) - - dataframe['max48'] = talib.MAX(dataframe['close'], timeperiod=48) - dataframe['min36'] = talib.MIN(dataframe['close'], timeperiod=36) - dataframe['max36'] = talib.MAX(dataframe['close'], timeperiod=36) - dataframe['pct36'] = 100 * (dataframe['max36'] - dataframe['min36']) / dataframe['min36'] - dataframe['maxpct36'] = talib.MAX(dataframe['pct36'], timeperiod=36) - - # Bollinger Bands - bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) - dataframe['bb_lowerband'] = bollinger['lower'] - dataframe['bb_middleband'] = bollinger['mid'] - dataframe['bb_upperband'] = bollinger['upper'] - dataframe["bb_percent"] = ( - (dataframe["close"] - dataframe["bb_lowerband"]) / - (dataframe["bb_upperband"] - dataframe["bb_lowerband"]) - ) - dataframe["bb_width"] = ((dataframe["bb_upperband"] - dataframe["bb_lowerband"]) / dataframe["bb_upperband"]) - # Normalization - - dataframe['bb_upperband5'] = dataframe['bb_upperband'].rolling(window=5).mean() - dataframe['bb_lowerband5'] = dataframe['bb_lowerband'].rolling(window=5).mean() + dataframe = self.populateDataframe(dataframe, timeframe='5m') # dataframe = self.calculateRegression(dataframe, column='mid_smooth', window=24, degree=4, future_offset=12) # dataframe = self.calculateRegression(dataframe, column='mid_smooth_24', window=24, degree=4, future_offset=12) ################### INFORMATIVE 1h informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe="1h") - heikinashi = qtpylib.heikinashi(informative) - informative['haopen'] = heikinashi['open'] - informative['haclose'] = heikinashi['close'] - informative['hapercent'] = (informative['haclose'] - informative['haopen']) / informative['haclose'] - - # informative = self.calculateDerivation(informative, window=12) - - # informative = self.apply_regression_derivatives(informative, column='mid', window=5, degree=4) - informative['rsi'] = talib.RSI(informative['close']) # , timeperiod=7) - informative['rsi'] = informative['rsi'].rolling(5).mean() - self.calculeDerivees(informative, 'rsi', horizon=5) - - informative['sma5'] = talib.SMA(informative, timeperiod=5) - informative['sma24'] = talib.SMA(informative, timeperiod=24) - self.calculeDerivees(informative, 'sma5', horizon=5) - self.calculeDerivees(informative, 'sma24', horizon=24) - # informative["mid_re_smooth"] = self.conditional_smoothing(informative['mid_smooth'].dropna(), threshold=0.0005).dropna() - # self.calculeDerivees(informative, "mid_re_smooth") - # self.calculateDownAndUp(informative, limit=0.0012) - - # informative['futur_percent_3'] = 100 * ((informative['sma5'].shift(-3) - informative['sma5']) / informative['sma5']) - # if self.dp.runmode.value in ('backtest'): - # print("##################") - # print("# STAT HOUR") - # print("##################") - # self.calculateStats(informative, 'sma5_deriv1', 'futur_percent_3') - - # self.calculePlateaux(informative, 24, 0.01) - macd, macdsignal, macdhist = talib.MACD( - informative['close'], - fastperiod=12, - slowperiod=26, - signalperiod=9 - ) - - informative['macd'] = macd - informative['macdsignal'] = macdsignal - informative['macdhist'] = macdhist - + informative = self.populateDataframe(informative, timeframe='1h') dataframe = merge_informative_pair(dataframe, informative, self.timeframe, "1h", ffill=True) ################### INFORMATIVE 1d informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe="1d") - heikinashi = qtpylib.heikinashi(informative) - informative['haopen'] = heikinashi['open'] - informative['haclose'] = heikinashi['close'] - informative['hapercent'] = (informative['haclose'] - informative['haopen']) / informative['haclose'] - # informative = self.calculateDerivation(informative, window=5, factor_1=10000, factor_2=1000) - # informative['volatility'] = talib.STDDEV(informative['close'], timeperiod=14) / informative['close'] - # informative['atr'] = (talib.ATR(informative['high'], informative['low'], informative['close'], timeperiod=14)) / informative['close'] - - # informative = self.apply_regression_derivatives(informative, column='mid', window=5, degree=4) - period_1d = 60 - informative['max12'] = talib.MAX(informative['close'], timeperiod=12) - informative['max60'] = talib.MAX(informative['close'], timeperiod=period_1d) - informative['min12'] = talib.MIN(informative['close'], timeperiod=12) - informative['min60'] = talib.MIN(informative['close'], timeperiod=period_1d) - - informative["percent"] = (informative["close"] - informative["open"]) / informative["open"] - informative['rsi'] = talib.RSI(informative['close'], timeperiod=6) - informative['rsi'] = informative['rsi'].rolling(6).mean() - self.calculeDerivees(informative, 'rsi', horizon=6) - # - informative['sma5'] = talib.SMA(informative, timeperiod=5) - informative['sma20'] = talib.SMA(informative, timeperiod=20) - - self.calculeDerivees(informative, 'sma5', factor_1=10, factor_2=1, horizon=5) - self.calculeDerivees(informative, 'sma20', factor_1=10, factor_2=1, horizon=20) - - informative = self.add_tendency_column(informative, "", "sma5") - informative = self.add_tendency_column(informative, "", "sma20") - - # mid_smooth_5_deriv1_1d / mid_smooth_5_deriv2_1d - informative = self.calculateDerivation(informative, window=5, suffixe="_5") - - macd, macdsignal, macdhist = talib.MACD( - informative['close'], - fastperiod=12, - slowperiod=26, - signalperiod=9 - ) - - informative['macd'] = macd - informative['macdsignal'] = macdsignal - informative['macdhist'] = macdhist - - # informative['futur_percent_3'] = 100 * ((informative['sma5'].shift(-3) - informative['sma5']) / informative['sma5']) - - # if self.dp.runmode.value in ('backtest'): - # print("##################") - # print("# STAT DAY") - # print("##################") - # self.calculateStats(informative, 'sma5_deriv1', 'futur_percent_3') + informative = self.populateDataframe(informative, timeframe='1d') if self.dp.runmode.value in ('backtest'): informative['futur_percent'] = 100 * (informative['close'].shift(-1) - informative['close']) / informative[ 'close'] - # informative['futur_percent_3d'] = 100 * (informative['close'].shift(-3) - informative['close']) / informative['close'] - # - # self.calculateProbabilite2Index(informative, ['futur_percent_1d'], 'rsi_deriv1', 'rsi') - # # self.calculateProbabilite2Index(dataframe, ['futur_percent_3d'], 'rsi_deriv1', 'sma5') - - # informative['close_smooth'] = self.conditional_smoothing(informative['mid'].dropna(), threshold=0.0015).dropna() - # informative['smooth'], informative['deriv1'], informative['deriv2'] = self.smooth_and_derivatives(informative['close_smooth']) - # informative['deriv1'] = 100 * informative['deriv1'] / informative['mid'] - # informative['deriv2'] = 1000 * informative['deriv2'] / informative['mid'] - - # poly_func, x_future, y_future, count = self.polynomial_forecast(informative['sma5_deriv1_1d'], window=24, degree=4) - - # informative['futur_percent_3'] = 100 * ((informative['sma5'].shift(-1) - informative['sma5']) / informative['sma5']) - # futur_cols = ['futur_percent_3'] - # indic_1 = 'sma5_deriv1' - # indic_2 = 'sma5_deriv2' - - # self.calculateProbabilite2Index(informative, futur_cols, indic_1, indic_2) - - # self.calculePlateaux(informative, 14, 0.01) dataframe = merge_informative_pair(dataframe, informative, self.timeframe, "1d", ffill=True) dataframe['last_price'] = dataframe['close'] @@ -943,7 +844,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): dataframe["mid_smooth_5h_deriv2"] = 100 * dataframe["mid_smooth_5h_deriv1"].diff().rolling(window=60).mean() # Compter les baisses / hausses consΓ©cutives - self.calculateDownAndUp(dataframe, limit=0.0001) + # self.calculateDownAndUp(dataframe, limit=0.0001) # dataframe["mid_re_smooth_1h"] = self.conditional_smoothing(dataframe['mid_smooth_1h'].dropna(), threshold=0.0005).dropna() # self.calculeDerivees(dataframe, "mid_re_smooth_1h") @@ -1006,10 +907,6 @@ class Zeus_8_3_2_B_4_2(IStrategy): # # self.calculateProbabilite2Index(dataframe, ['futur_percent_1d'], 'sma24_deriv1_1h', 'sma5_1d') - dataframe['ema_volume'] = 20 * (dataframe['volume'] * dataframe['percent']) / ( - abs(dataframe['volume'].shift(1)) + abs(dataframe['volume'].shift(2))) - - self.calculeDerivees(dataframe, 'ema_volume', factor_1=10, factor_2=1, horizon=14) # if self.dp.runmode.value in ('backtest'): # print("##################") # print("# STAT DAY vs HOUR") @@ -1024,25 +921,65 @@ class Zeus_8_3_2_B_4_2(IStrategy): # indic_1 = 'mid_smooth_1h_deriv1' # indic_2 = 'mid_smooth_1h_deriv2' # self.calculateProbabilite2Index(dataframe, futur_cols, indic_1, indic_2) - dataframe['can_sell'] = np.where((dataframe['mid_smooth_3'].shift(1) > dataframe['mid_smooth_3']), - dataframe['close'], np.nan) - - dataframe['can_buy'] = np.where((dataframe['mid_smooth_3'].shift(1) < dataframe['mid_smooth_3']), - dataframe['close'], np.nan) - - dataframe['perte_02'] = np.where((dataframe['percent3'] * 100 < -0.2), dataframe['close'], np.nan) - - dataframe['mid_smooth_1h_deriv2_inv'] = np.where( - (dataframe['mid_smooth_1h_deriv2'].shift(2) >= dataframe['mid_smooth_1h_deriv2'].shift(1)) - & (dataframe['mid_smooth_1h_deriv2'].shift(1) <= dataframe['mid_smooth_1h_deriv2']), dataframe['close'], - np.nan) return dataframe - def calculeDerivees(self, dataframe, indic, factor_1=100, factor_2=10, horizon=5): - dataframe[f"{indic}_deriv1"] = (factor_1 * dataframe[f"{indic}"].diff() / dataframe[f"{indic}"]).rolling( - horizon).mean() - dataframe[f"{indic}_deriv2"] = (factor_2 * dataframe[f"{indic}_deriv1"].diff()).rolling(horizon).mean() + def populateDataframe(self, dataframe, timeframe='5m'): + heikinashi = qtpylib.heikinashi(dataframe) + dataframe['haopen'] = heikinashi['open'] + dataframe['haclose'] = heikinashi['close'] + dataframe['hapercent'] = (dataframe['haclose'] - dataframe['haopen']) / dataframe['haclose'] + dataframe['mid'] = dataframe['haopen'] + (dataframe['haclose'] - dataframe['haopen']) / 2 + + # dataframe['hapercent3'] = (dataframe['haclose'] - dataframe['haopen'].shift(3)) / dataframe['haclose'].shift(3) + dataframe['sma5'] = talib.SMA(dataframe, timeperiod=5) + self.calculeDerivees(dataframe, 'sma5', timeframe=timeframe, ema_period=5) + dataframe['sma12'] = talib.SMA(dataframe, timeperiod=12) + self.calculeDerivees(dataframe, 'sma12', timeframe=timeframe, ema_period=12) + dataframe['sma24'] = talib.SMA(dataframe, timeperiod=24) + self.calculeDerivees(dataframe, 'sma24', timeframe=timeframe, ema_period=24) + dataframe['sma60'] = talib.SMA(dataframe, timeperiod=60) + self.calculeDerivees(dataframe, 'sma60', timeframe=timeframe, ema_period=60) + + dataframe = self.calculateDerivation(dataframe, window=3, suffixe="_3",timeframe=timeframe) + dataframe = self.calculateDerivation(dataframe, window=5, suffixe="_5",timeframe=timeframe) + dataframe = self.calculateDerivation(dataframe, window=12, suffixe="_12",timeframe=timeframe) + dataframe = self.calculateDerivation(dataframe, window=24, suffixe="_24", timeframe=timeframe) + # print(metadata['pair']) + dataframe['rsi'] = talib.RSI(dataframe['close'], timeperiod=14) + dataframe['max_rsi_12'] = talib.MAX(dataframe['rsi'], timeperiod=12) + dataframe['max_rsi_24'] = talib.MAX(dataframe['rsi'], timeperiod=24) + self.calculeDerivees(dataframe, 'rsi', timeframe=timeframe, ema_period=12) + dataframe['max12'] = talib.MAX(dataframe['close'], timeperiod=12) + dataframe['max60'] = talib.MAX(dataframe['close'], timeperiod=60) + dataframe['min60'] = talib.MIN(dataframe['close'], timeperiod=60) + # dataframe['min36'] = talib.MIN(dataframe['close'], timeperiod=36) + # dataframe['max36'] = talib.MAX(dataframe['close'], timeperiod=36) + # dataframe['pct36'] = 100 * (dataframe['max36'] - dataframe['min36']) / dataframe['min36'] + # dataframe['maxpct36'] = talib.MAX(dataframe['pct36'], timeperiod=36) + # Bollinger Bands + bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) + dataframe['bb_lowerband'] = bollinger['lower'] + dataframe['bb_middleband'] = bollinger['mid'] + dataframe['bb_upperband'] = bollinger['upper'] + + # macd, macdsignal, macdhist = talib.MACD( + # dataframe['close'], + # fastperiod=12, + # slowperiod=26, + # signalperiod=9 + # ) + # + # dataframe['macd'] = macd + # dataframe['macdsignal'] = macdsignal + # dataframe['macdhist'] = macdhist + # + # dataframe['ema_volume'] = 20 * (dataframe['volume'] * dataframe['percent']) / ( + # abs(dataframe['volume'].shift(1)) + abs(dataframe['volume'].shift(2))) + # + # self.calculeDerivees(dataframe, 'ema_volume', factor_1=10, factor_2=1, timeframe=timeframe, ema_period=14) + + return dataframe def calculateDownAndUp(self, dataframe, limit=0.0001): dataframe['down'] = dataframe['mid_smooth_1h_deriv1'] < limit # dataframe['hapercent'] <= limit @@ -1055,21 +992,182 @@ class Zeus_8_3_2_B_4_2(IStrategy): dataframe['down_pct'] = self.calculateUpDownPct(dataframe, 'down_count') dataframe['up_pct'] = self.calculateUpDownPct(dataframe, 'up_count') - def calculateDerivation(self, dataframe, window=12, suffixe='', factor_1=100, factor_2=10): + def calculateDerivation(self, dataframe, window=12, suffixe='', timeframe='5m'): dataframe['mid'] = dataframe['haopen'] + (dataframe['haclose'] - dataframe['haopen']) / 2 - # 1. Calcul du lissage par moyenne mobile mΓ©diane - dataframe[f"mid_smooth{suffixe}"] = dataframe['haclose'].rolling(window=window).mean() - # 2. DΓ©rivΓ©e premiΓ¨re = diffΓ©rence entre deux bougies successives - dataframe[f"mid_smooth{suffixe}_deriv1"] = round( - factor_1 * dataframe[f"mid_smooth{suffixe}"].rolling(window=3).mean().diff() / dataframe[ - f"mid_smooth{suffixe}"], 4) - - # 3. DΓ©rivΓ©e seconde = diffΓ©rence de la dΓ©rivΓ©e premiΓ¨re - dataframe[f"mid_smooth{suffixe}_deriv2"] = round( - factor_2 * dataframe[f"mid_smooth{suffixe}_deriv1"].rolling(window=3).mean().diff(), 4) - dataframe = self.add_tendency_column(dataframe, "mid_smooth", suffixe) + dataframe[f"mid_smooth{suffixe}"] = dataframe['mid'] + dataframe = self.calculeDerivees(dataframe, f"mid_smooth{suffixe}", timeframe=timeframe, ema_period=window) return dataframe + def calculeDerivees( + self, + dataframe: pd.DataFrame, + name: str, + suffixe: str = '', + window: int = 100, + coef: float = 0.15, + ema_period: int = 10, + verbose: bool = True, + timeframe: str = '5m' + ) -> pd.DataFrame: + """ + Calcule deriv1/deriv2 (relative simple), applique EMA, calcule tendency + avec epsilon adaptatif basΓ© sur rolling percentiles. + """ + + d1_col = f"{name}{suffixe}_deriv1" + d2_col = f"{name}{suffixe}_deriv2" + # d1s_col = f"{name}{suffixe}_deriv1_smooth" + # d2s_col = f"{name}{suffixe}_deriv2_smooth" + tendency_col = f"{name}{suffixe}_state" + + factor1 = 100 * (ema_period / 5) + factor2 = 10 * (ema_period / 5) + + # dΓ©rivΓ©e relative simple + dataframe[d1_col] = (dataframe[name] - dataframe[name].shift(1)) / dataframe[name].shift(1) + # lissage EMA + dataframe[d1_col] = factor1 * dataframe[d1_col].ewm(span=ema_period, adjust=False).mean() + + # dataframe[d1_col] = dataframe[d1_col].rolling(window=ema_period, center=True).median() + + dataframe[d2_col] = dataframe[d1_col] - dataframe[d1_col].shift(1) + dataframe[d2_col] = factor2 * dataframe[d2_col].ewm(span=ema_period, adjust=False).mean() + + # epsilon adaptatif via rolling percentile + p_low_d1 = dataframe[d1_col].rolling(window=window, min_periods=1).quantile(0.05) + p_high_d1 = dataframe[d1_col].rolling(window=window, min_periods=1).quantile(0.95) + p_low_d2 = dataframe[d2_col].rolling(window=window, min_periods=1).quantile(0.05) + p_high_d2 = dataframe[d2_col].rolling(window=window, min_periods=1).quantile(0.95) + + eps_d1_series = ((p_low_d1.abs() + p_high_d1.abs()) / 2) * coef + eps_d2_series = ((p_low_d2.abs() + p_high_d2.abs()) / 2) * coef + + # fallback global eps + global_eps_d1 = (abs(dataframe[d1_col].quantile(0.05)) + abs(dataframe[d1_col].quantile(0.95))) / 2 * coef + global_eps_d2 = (abs(dataframe[d2_col].quantile(0.05)) + abs(dataframe[d2_col].quantile(0.95))) / 2 * coef + + eps_d1_series = eps_d1_series.fillna(global_eps_d1).replace(0, global_eps_d1) + eps_d2_series = eps_d2_series.fillna(global_eps_d2).replace(0, global_eps_d2) + + if verbose: + stats = dataframe[[d1_col, d2_col]].agg(['min', 'max']).T + stats['abs_max'] = dataframe[[d1_col, d2_col]].abs().max(axis=0) + print(f"---- Derivatives stats {timeframe}----") + print(stats) + print(f"rolling window = {window}, coef = {coef}, ema_period = {ema_period}") + print("---------------------------") + + # mapping tendency + def tag_by_derivatives(row): + idx = int(row.name) + d1v = float(row[d1_col]) + d2v = float(row[d2_col]) + eps1 = float(eps_d1_series.iloc[idx]) + eps2 = float(eps_d2_series.iloc[idx]) + + # # mapping Γ©tat β†’ codes 3 lettres explicites + # # | Ancien Γ©tat | Nouveau code 3 lettres | InterprΓ©tation | + # # | ----------- | ---------------------- | --------------------- | + # # | 4 | HAU | Hausse AccΓ©lΓ©rΓ©e | + # # | 3 | HSR | Hausse Ralentissement | + # # | 2 | HST | Hausse Stable | + # # | 1 | DHB | DΓ©part Hausse | + # # | 0 | PAL | Palier / neutre | + # # | -1 | DBD | DΓ©part Baisse | + # # | -2 | BSR | Baisse Ralentissement | + # # | -3 | BST | Baisse Stable | + # # | -4 | BAS | Baisse AccΓ©lΓ©rΓ©e | + + # Palier strict + if abs(d1v) <= eps1 and abs(d2v) <= eps2: + return 0 + # DΓ©part si d1 ~ 0 mais d2 signale direction + if abs(d1v) <= eps1: + return 1 if d2v > eps2 else -1 if d2v < -eps2 else 0 + # Hausse + if d1v > eps1: + return 4 if d2v > eps2 else 3 + # Baisse + if d1v < -eps1: + return -4 if d2v < -eps2 else -2 + return 0 + + dataframe[tendency_col] = dataframe.apply(tag_by_derivatives, axis=1) + + return dataframe + + # def compute_derivatives(self, df: pd.DataFrame, col: str, eps: float = 1e-4, smooth: int = 15) -> pd.DataFrame: + # """ + # Ajoute (col)_deriv1, (col)_deriv2, (col)_state avec un lissage (smooth) + # des dΓ©rivΓ©es pour Γ©viter les sauts / escaliers. + # eps = seuil neutre + # smooth = taille du rolling/ema appliquΓ© sur les dΓ©rivΓ©es + # """ + # + # d1_col = f"{col}_deriv1" + # d2_col = f"{col}_deriv2" + # d1s_col = f"{col}_deriv1s" + # d2s_col = f"{col}_deriv2s" + # state_col = f"{col}_state" + # + # # dΓ©rivΓ©e premiΓ¨re brute + # df[d1_col] = (df[col] - df[col].shift(1)) / df[col].shift(1) + # # lissage EMA (plus doux qu'un rolling, surtout en trading) + # df[d1_col] = df[d1_col].rolling(smooth).mean() + # + # # dΓ©rivΓ©e seconde brute + # df[d2_col] = df[d1_col] - df[d1_col].shift(1) + # df[d2_col] = df[d2_col].rolling(smooth).mean() + # + # print("---- Derivatives stats for", col, "----") + # print(df[[d1_col, d2_col]].agg(['min', 'max'])) + # print("---------------------------------------------") + # + # # lissage EMA (plus doux qu'un rolling, surtout en trading) + # # df[d1_col] = df[d1_col].ewm(span=smooth, adjust=False).mean() + # # df[d2_col] = df[d2_col].ewm(span=smooth, adjust=False).mean() + # + # # signe avec epsilon + # def sign_eps(x: float, eps: float) -> int: + # if x > eps: return 1 + # if x < -eps: return -1 + # return 0 + # + # df[d1s_col] = df[d1_col].apply(sign_eps, eps1) + # df[d2s_col] = df[d2_col].apply(sign_eps, eps2) + # + # # mapping Γ©tat β†’ codes 3 lettres explicites + # # | Ancien Γ©tat | Nouveau code 3 lettres | InterprΓ©tation | + # # | ----------- | ---------------------- | --------------------- | + # # | 1 | HAU | Hausse AccΓ©lΓ©rΓ©e | + # # | 2 | HSR | Hausse Ralentissement | + # # | 3 | HST | Hausse Stable | + # # | 4 | DHB | DΓ©part Hausse | + # # | 5 | PAL | Palier / neutre | + # # | 6 | DBD | DΓ©part Baisse | + # # | 7 | BSR | Baisse Ralentissement | + # # | 8 | BST | Baisse Stable | + # # | 9 | BAS | Baisse AccΓ©lΓ©rΓ©e | + # + # state_map = { + # (1, 1): 4, #"HAU", + # (1, 0): 3, #"HSR", + # (1, -1): 2, # "HST", + # (0, 1): 1, #"DHB", + # (0, 0): 0, #"PAL", + # (0, -1): -1, #"DBD", + # (-1, 1): -2, #"BSR", + # (-1, 0): -3, #"BST", + # (-1, -1): -4, # "BAS", + # } + # + # df[state_col] = list(map( + # lambda x: state_map.get((x[0], x[1]), "MID"), + # zip(df[d1s_col], df[d2s_col]) + # )) + # + # return df + def getOpenTrades(self): # if len(self.trades) == 0: self.trades = Trade.get_open_trades() @@ -1077,114 +1175,58 @@ class Zeus_8_3_2_B_4_2(IStrategy): def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: pair = metadata['pair'] - - # self.getOpenTrades() - # expected_profit = self.expectedProfit(pair, dataframe.iloc[-1]) - # self.getBinanceOrderBook(pair, dataframe) - - # Calcul de la pente (diffΓ©rence entre deux bougies consΓ©cutives) - dataframe['bb_ub_slope'] = dataframe['bb_upperband'].diff() - - # DΓ©tection d'une inversion (changement de signe de la pente) - # inversion = ( - # (dataframe['bb_ub_slope'].shift(1).rolling(5).apply( - # lambda x: any(x[i] > 0 and x[i + 1] < 0 for i in range(len(x) - 1)))) == 1 - # ) - # On regarde si la bande supΓ©rieure a atteint un maximum il y a k bougies - # lookback = 5 - # inversion = (dataframe['bb_upperband'] == dataframe['bb_upperband'].rolling(lookback).max()) - - # pente de la bb_upperband - dataframe['bb_ub_slope'] = dataframe['bb_upperband5'].diff() - - # Γ©vΓ¨nement "inversion vers le bas" (pente passe de >0 Γ  <=0) sur chaque bougie - cross_down = (dataframe['bb_ub_slope'].shift(1) > 0) & (dataframe['bb_ub_slope'] <= 0) - dataframe['bb_cross_down'] = 10000 * cross_down * dataframe['bb_width'] \ - * (dataframe['bb_lowerband'] - dataframe['bb_lowerband'].shift(1)) / dataframe[ - 'bb_lowerband'] - - # vrai si AU MOINS une inversion a eu lieu dans les 5 bougies *prΓ©cΓ©dentes* (on exclut l'actuelle) - inversion_last5 = cross_down.shift(1).rolling(5, min_periods=1).max().astype(bool) - dataframe['inversion_last5'] = inversion_last5 - - N = 24 # nombre minimum de bougies avant inversion - rise_threshold = 1.0 # % de hausse Γ  ne pas dΓ©passer - - # Calcul de la hausse minimale avant inversion - def compute_rise(idx): - if idx < N: - return 0 - low_before = dataframe['close'].iloc[idx - N:idx].min() # min des N bougies avant inversion - return (dataframe['close'].iloc[idx] / low_before - 1) * 100 - - rise = [compute_rise(i) for i in range(len(dataframe))] - dataframe['rise_before_inversion'] = rise - - # Filtre : inversion sans forte hausse avant - valid_inversion = inversion_last5 & (dataframe['rise_before_inversion'] <= rise_threshold) - - # dataframe.loc[ - # ( - # (dataframe['percent'] > 0) - # & (dataframe['mid_smooth_deriv1'] >= dataframe['mid_smooth_deriv1'].shift(1)) - # ), ['enter_long', 'enter_tag']] = (1, 'down') - factor = 1.01 - if (self.getShortName(pair) == 'BTC'): - factor = factor / 2 dataframe.loc[ ( - - # (valid_inversion & inversion_last5 ) (dataframe['mid_smooth_3'].shift(1) < dataframe['mid_smooth_3']) & (dataframe['hapercent'] > 0) - & (dataframe['max_rsi_24'] < 70) + & ((dataframe['max_rsi_24_1h'] < 70) | (dataframe['close'] < dataframe['close_1d'])) & (dataframe['open'] <= dataframe['bb_middleband']) - - # valid_inversion - # ((dataframe['bb_cross_down'] < - 0.1) - # | (dataframe['bb_cross_down'].shift(1) < - 0.1) - # | (dataframe['bb_cross_down'].shift(2) < - 0.1) - # | (dataframe['bb_cross_down'].shift(3) < - 0.1) - # ) - # & (dataframe['hapercent'] > 0) - # & (dataframe['close'] * factor < dataframe['bb_upperband5']) - # - # - & (dataframe['mid_smooth_1h_deriv1'] >= 0) - & (dataframe['mid_smooth_1h_deriv2'] >= 0) - # & (dataframe['mid_smooth_1h_deriv1'].shift(1) <= 0) - # & (dataframe['mid_smooth_1h_deriv1'] >= dataframe['mid_smooth_1h_deriv1'].shift(1)) + & (dataframe['sma60_deriv1'] >= 0) + & (dataframe['sma60_deriv2'] >= 0) ), ['enter_long', 'enter_tag']] = (1, 'smth') + dataframe.loc[ + ( + (dataframe['sma24_deriv2'].shift(1) < 0) + & (dataframe['sma24_deriv2'] > 0) + & ((dataframe['max_rsi_24_1h'] < 70) | (dataframe['close'] < dataframe['close_1d'])) + & (dataframe['sma60_deriv1'] >= 0) + & (dataframe['sma60_deriv2'] >= 0) + ), ['enter_long', 'enter_tag']] = (1, 'invert') + + dataframe.loc[ + ( + (dataframe['sma24_deriv1'] > 0) + & (dataframe['sma60_deriv1'].shift(1) < 0) + & (dataframe['sma60_deriv1'] > 0) + & ((dataframe['max_rsi_24_1h'] < 70) | (dataframe['close'] < dataframe['close_1d'])) + & (dataframe['sma60_deriv1'] >= 0) + & (dataframe['sma60_deriv2'] >= 0) + ), ['enter_long', 'enter_tag']] = (1, 'raise') + + dataframe.loc[ + ( + (dataframe['sma60_deriv1'].shift(1) < 0) + & (dataframe['sma24_deriv2'] > 0) + & ((dataframe['max_rsi_24_1h'] < 70) | (dataframe['close'] < dataframe['close_1d'])) + & (dataframe['sma60_deriv1'] >= 0) + & (dataframe['sma60_deriv2'] >= 0) + ), ['enter_long', 'enter_tag']] = (1, 'stg_inv') + + dataframe.loc[ + ( + (dataframe['mid_smooth_3_1h'].shift(24) >= dataframe['mid_smooth_3_1h'].shift(12)) + & (dataframe['mid_smooth_3_1h'].shift(12) <= dataframe['mid_smooth_3_1h']) + & ((dataframe['max_rsi_24_1h'] < 70) | (dataframe['close'] < dataframe['close_1d'])) + & (dataframe['sma60_deriv1'] >= 0) + & (dataframe['sma60_deriv2'] >= 0) + ), ['enter_long', 'enter_tag']] = (1, 'smth3_inv') + + dataframe['test'] = np.where(dataframe['enter_long'] == 1, dataframe['close'] * 1.01, np.nan) - # self.paliers = self.get_dca_stakes() - - # if self.dp.runmode.value in ('backtest'): - # today = datetime.now().strftime("%Y-%m-%d-%H:%M:%S") - # dataframe.to_feather(f"user_data/data/binance/{today}-{metadata['pair'].replace('/', '_')}_df.feather") - # dataframe.to_csv(f"user_data/data/binance/{today}-{metadata['pair'].replace('/', '_')}_df.csv") - # - # df = dataframe - # - # # Colonnes Γ  traiter - # # futur_cols = ['futur_percent_1h', 'futur_percent_3h', 'futur_percent_5h', 'futur_percent_12h'] - # futur_cols = ['futur_percent_1h'] - # - # # Tranches Γ©quitables par quantiles - # - # indic_1 = 'mid_smooth_24_deriv1' - # indic_2 = 'sma144_deriv1' - # #indic_2 = 'percent_with_max_hour' - # # indic_1 = 'mid_smooth_1h_deriv1' - # # indic_2 = 'sma5_deriv1_1d' - # - # self.calculateProbabilite2Index(df, futur_cols, indic_1, indic_2) - - # if (self.getShortName(pair) == 'BTC'): - # for pct in range(0, 75): - # factor = self.multi_step_interpolate(pct, self.thresholds, self.factors) - # print(f"{pct} => {factor}") + if self.dp.runmode.value in ('backtest'): + dataframe.to_feather(f"user_data/backtest_results/{metadata['pair'].replace('/', '_')}_df.feather") return dataframe @@ -1268,6 +1310,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): dataframe, _ = self.dp.get_analyzed_dataframe(trade.pair, self.timeframe) last_candle = dataframe.iloc[-1].squeeze() + before_last_candle = dataframe.iloc[-2].squeeze() before_last_candle_12 = dataframe.iloc[-13].squeeze() before_last_candle_24 = dataframe.iloc[-25].squeeze() last_candle_3 = dataframe.iloc[-4].squeeze() @@ -1284,7 +1327,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): open_date = trade.open_date.astimezone(timezone.utc) days_since_open = (current_time_utc - open_date).days pair = trade.pair - + profit = round(current_profit * trade.stake_amount, 1) pct_first = 0 total_counts = sum( @@ -1369,7 +1412,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): # # dΓ©clenche un achat en conditions d'achat standard # if ( # stake_amount - # and last_candle['close'] < last_candle['sma20'] + # and last_candle['close'] < last_candle['sma24'] # and last_candle['close'] < last_candle['open'] # and min_stake < stake_amount < max_stake # and (last_candle["sma24_deriv1_1h"] > - 0.02) @@ -1428,7 +1471,10 @@ class Zeus_8_3_2_B_4_2(IStrategy): # > - 0.03 ==>Avg. stake amount 253.535 USDT β”‚ Total trade volume 145312.936 USDT 284 β”‚ 1.19 β”‚ 1014.898 β”‚ 50.74| 1 day, 17:54:00 β”‚ 283 0 1 99.6 β”‚ 0.684 USDT 0.02% β”‚ # > - 0.015 ==>Avg. stake amount 249.107 USDT β”‚ Total trade volume 138186.861 USDT 275 β”‚ 1.20 β”‚ 901.976 β”‚ 45.1 β”‚ 1 day, 19:17:00 β”‚ 274 0 1 99.6 β”‚ 0.684 USDT 0.02% - condition = (last_candle['sma5_deriv1_1h'] > 0 or count_of_buys <= 5) # and \ + condition = (last_candle['sma24_deriv1'] > 0) # and \ + if (self.getShortName(pair) != 'BTC' and count_of_buys > 3): + condition = before_last_candle_24['mid_smooth_3_1h'] > before_last_candle_12['mid_smooth_3_1h'] and before_last_candle_12['mid_smooth_3_1h'] < last_candle['mid_smooth_3_1h'] #and last_candle['mid_smooth_3_deriv1_1h'] < -1.5 + # (last_candle['mid_smooth_1h_deriv1'] > 0 and last_candle['mid_smooth_1h_deriv1']) # last_candle['mid_smooth_1h_deriv1'] > - 0.05 #(last_candle['mid_smooth_3_deriv1'] > self.buy_mid_smooth_3_deriv1.value) and (last_candle['mid_smooth_24_deriv1'] > self.buy_mid_smooth_24_deriv1.value) # (last_candle['enter_long'] == 1 & (count_of_buys < 3)) \ @@ -1439,8 +1485,9 @@ class Zeus_8_3_2_B_4_2(IStrategy): if (count_of_buys < limit_buy) and condition and (pct_max < lim): try: - if self.pairs[pair]['has_gain']: + if self.pairs[pair]['has_gain'] and profit > 0: self.pairs[pair]['force_sell'] = True + return None # if 6 <= count_of_buys: # if not ((before_last_candle_24['sma24_deriv1_1h'] > before_last_candle_12['sma24_deriv1_1h']) @@ -1487,7 +1534,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): self.pairs[trade.pair]['last_candle'] = last_candle # df = pd.DataFrame.from_dict(self.pairs, orient='index') - # colonnes_a_exclure = ['last_candle', 'last_trade', 'last_palier_index', 'stop', + # colonnes_a_exclure = ['last_candle', 'stop', # 'trade_info', 'last_date', 'expected_profit', '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_filtered["first_buy", "last_max", "max_touch", "last_sell","last_buy", 'count_of_buys', 'current_profit'] @@ -1519,16 +1566,17 @@ class Zeus_8_3_2_B_4_2(IStrategy): last_lost = self.getLastLost(last_candle, pair) - if (current_profit > 0 and hours > 6 + if (profit > self.pairs[pair]['previous_profit'] and profit > self.pairs[pair]['expected_profit'] and hours > 6 # and last_candle['sma60_deriv1'] > 0 - and last_candle['rsi_1h'] < 65 - and last_candle['rsi_deriv1_1h'] > 0 - and last_candle['mid_smooth_5_deriv1_1d'] > 0 + and last_candle['max_rsi_12_1h'] < 75 + # and last_candle['rsi_deriv1_1h'] > 0 + # and last_candle['mid_smooth_5_deriv1_1d'] > 0 and last_candle['sma60_deriv1'] > 0 and last_candle['sma60_deriv2'] > 0 ): try: - stake_amount = self.pairs[pair]['first_amount'] / 2 + self.pairs[pair]['previous_profit'] = profit + stake_amount = self.pairs[pair]['first_amount'] if self.wallets.get_available_stake_amount() > stake_amount: self.pairs[pair]['has_gain'] += 1 @@ -1622,8 +1670,11 @@ class Zeus_8_3_2_B_4_2(IStrategy): # factors = [1, 1.2, 1.3, 1.4] if self.pairs[pair]['count_of_buys'] == 0: # pctClose60 = self.getPctClose60D(pair, last_candle) - dist_max = self.getDistMax(last_candle, pair) - factor = self.multi_step_interpolate(dist_max, self.thresholds, self.factors) + # dist_max = self.getDistMax(last_candle, pair) + # factor = self.multi_step_interpolate(dist_max, self.thresholds, self.factors) + factor = 0.5 + if last_candle['sma60_deriv1'] > 0 and last_candle['sma24_deriv1_1h'] > 0: + factor = 1.5 adjusted_stake_amount = max(base_stake_amount / 5, base_stake_amount * factor) else: @@ -2229,7 +2280,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): # print(pivot_mean.round(2)) def should_enter_trade(self, pair: str, last_candle, current_time) -> bool: - + return True limit = 3 # 🟒 DΓ©rivΓ©e 1 > 0 et dΓ©rivΓ©e 2 > 0: tendance haussiΓ¨re qui s’accΓ©lΓ¨re. @@ -2240,8 +2291,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): # if not pair.startswith('BTC'): dispo = round(self.wallets.get_available_stake_amount()) - if self.pairs[pair]['stop'] and last_candle['mid_smooth_5_deriv1_1d'] > -0.9 and last_candle[ - 'sma5_deriv1_1d'] > 0 and last_candle['sma5_deriv2_1d'] > 0: + if self.pairs[pair]['stop'] and (last_candle['sma60_deriv1'] > 0.0 and last_candle['sma60_deriv2'] > 0): self.pairs[pair]['stop'] = False self.log_trade( last_candle=last_candle, @@ -2256,8 +2306,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): stake=0 ) else: - if self.pairs[pair]['stop'] == False and ( - last_candle['sma5_deriv1_1d'] < -0.2 or last_candle['sma5_deriv2_1d'] < -3): + if self.pairs[pair]['stop'] == False and (last_candle['sma60_deriv1'] < -0.01 and last_candle['sma60_deriv2'] < 0): self.pairs[pair]['stop'] = True # if self.pairs[pair]['current_profit'] > 0: # self.pairs[pair]['force_sell'] = True @@ -2277,23 +2326,23 @@ class Zeus_8_3_2_B_4_2(IStrategy): if self.pairs[pair]['stop']: return False - if last_candle['sma5_deriv1_1h'] < -0.02: - return False - - if last_candle['mid_smooth_1h_deriv2'] < -2 or last_candle['sma5_deriv2_1h'] < -2: - return False - - if last_candle['sma5_deriv1_1h'] < 0.0 and last_candle['sma5_deriv2_1h'] < -0.0: - return False - - if last_candle['mid_smooth_1h_deriv1'] < 0.0 and last_candle['mid_smooth_1h_deriv2'] < -0.0 and last_candle[ - 'sma5_deriv2_1h'] < 0: - return False + # if last_candle['sma5_deriv1_1h'] < -0.02: + # return False + # + # if last_candle['mid_smooth_1h_deriv2'] < -2 or last_candle['sma5_deriv2_1h'] < -2: + # return False + # + # if last_candle['sma5_deriv1_1h'] < 0.0 and last_candle['sma5_deriv2_1h'] < -0.0: + # return False + # + # if last_candle['mid_smooth_1h_deriv1'] < 0.0 and last_candle['mid_smooth_1h_deriv2'] < -0.0 and last_candle[ + # 'sma5_deriv2_1h'] < 0: + # return False # if pair.startswith('BTC'): # return True # BTC toujours autorisΓ© - # return True + return True # Filtrer les paires non-BTC non_btc_pairs = [p for p in self.pairs if not p.startswith('BTC')] @@ -2336,7 +2385,7 @@ class Zeus_8_3_2_B_4_2(IStrategy): return False # if self.pairs[pair]['count_of_buys'] >= 3: - # if (last_candle['sma20_deriv1_1d'] < self.sma20_deriv1_1d_protection.value + # if (last_candle['sma24_deriv1_1d'] < self.sma24_deriv1_1d_protection.value # and last_candle['sma5_deriv1_1d'] < self.sma5_deriv1_1d_protection.value \ # and last_candle['sma5_deriv2_1d'] < -0.05): # # or (last_candle['sma5_deriv1_1d'] < -0.1 and last_candle['sma24_deriv1_1h'] < -0.1): diff --git a/Zeus_8_3_2_B_4_2_Bilan.txt b/Zeus_8_3_2_B_4_2_Bilan.txt index 8a6d5e6..191aa35 100644 --- a/Zeus_8_3_2_B_4_2_Bilan.txt +++ b/Zeus_8_3_2_B_4_2_Bilan.txt @@ -1,192 +1,285 @@ - BACKTESTING REPORT -┏━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ -┑━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ -β”‚ XRP/USDT β”‚ 15 β”‚ 7.15 β”‚ 178.814 β”‚ 5.96 β”‚ 12 days, 6:08:00 β”‚ 15 0 0 100 β”‚ -β”‚ ETH/USDT β”‚ 9 β”‚ 5.13 β”‚ 99.378 β”‚ 3.31 β”‚ 21 days, 1:27:00 β”‚ 9 0 0 100 β”‚ -β”‚ DOGE/USDT β”‚ 7 β”‚ 5.22 β”‚ 89.752 β”‚ 2.99 β”‚ 27 days, 7:43:00 β”‚ 6 0 1 85.7 β”‚ -β”‚ BTC/USDT β”‚ 15 β”‚ 3.35 β”‚ 54.723 β”‚ 1.82 β”‚ 12 days, 8:52:00 β”‚ 15 0 0 100 β”‚ -β”‚ SOL/USDT β”‚ 5 β”‚ 5.95 β”‚ -74.167 β”‚ -2.47 β”‚ 38 days, 12:00:00 β”‚ 4 0 1 80.0 β”‚ -β”‚ TOTAL β”‚ 51 β”‚ 5.29 β”‚ 348.501 β”‚ 11.62 β”‚ 18 days, 11:36:00 β”‚ 49 0 2 96.1 β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - LEFT OPEN TRADES REPORT -┏━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ -┑━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ -β”‚ ETH/USDT β”‚ 1 β”‚ 5.62 β”‚ 2.812 β”‚ 0.09 β”‚ 3 days, 7:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ XRP/USDT β”‚ 1 β”‚ 2.24 β”‚ 1.118 β”‚ 0.04 β”‚ 20:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ BTC/USDT β”‚ 1 β”‚ 1.04 β”‚ 0.517 β”‚ 0.02 β”‚ 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ DOGE/USDT β”‚ 1 β”‚ -0.09 β”‚ -0.047 β”‚ -0.0 β”‚ 22:00:00 β”‚ 0 0 1 0 β”‚ -β”‚ SOL/USDT β”‚ 1 β”‚ -10.67 β”‚ -114.313 β”‚ -3.81 β”‚ 175 days, 3:00:00 β”‚ 0 0 1 0 β”‚ -β”‚ TOTAL β”‚ 5 β”‚ -0.37 β”‚ -109.914 β”‚ -3.66 β”‚ 36 days, 5:00:00 β”‚ 3 0 2 60.0 β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + BACKTESTING REPORT +┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ +┑━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ +β”‚ BTC/USDT β”‚ 70 β”‚ 2.0 β”‚ 1309.119 β”‚ 43.64 β”‚ 7 days, 13:32:00 β”‚ 70 0 0 100 β”‚ +β”‚ TOTAL β”‚ 70 β”‚ 2.0 β”‚ 1309.119 β”‚ 43.64 β”‚ 7 days, 13:32:00 β”‚ 70 0 0 100 β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + LEFT OPEN TRADES REPORT +┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ +┑━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ +β”‚ BTC/USDT β”‚ 1 β”‚ 0.84 β”‚ 2.513 β”‚ 0.08 β”‚ 1 day, 1:20:00 β”‚ 1 0 0 100 β”‚ +β”‚ TOTAL β”‚ 1 β”‚ 0.84 β”‚ 2.513 β”‚ 0.08 β”‚ 1 day, 1:20:00 β”‚ 1 0 0 100 β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ENTER TAG STATS -┏━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ -┑━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ -β”‚ smth_12 β”‚ 51 β”‚ 5.29 β”‚ 348.501 β”‚ 11.62 β”‚ 18 days, 11:36:00 β”‚ 49 0 2 96.1 β”‚ -β”‚ TOTAL β”‚ 51 β”‚ 5.29 β”‚ 348.501 β”‚ 11.62 β”‚ 18 days, 11:36:00 β”‚ 49 0 2 96.1 β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - EXIT REASON STATS -┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ -┑━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ -β”‚ Drv3_XRP_5_0_16.31 β”‚ 1 β”‚ 23.4 β”‚ 73.520 β”‚ 2.45 β”‚ 57 days, 4:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_8_0_38.18 β”‚ 1 β”‚ 7.76 β”‚ 65.196 β”‚ 2.17 β”‚ 126 days, 19:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_DOGE_7_0_50.8 β”‚ 1 β”‚ 7.99 β”‚ 48.996 β”‚ 1.63 β”‚ 50 days, 19:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_SOL_2_0_22.44 β”‚ 1 β”‚ 27.31 β”‚ 28.009 β”‚ 0.93 β”‚ 3 days, 8:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_2_0_20.51 β”‚ 1 β”‚ 26.94 β”‚ 27.916 β”‚ 0.93 β”‚ 5 days, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_DOGE_8_0_62.66 β”‚ 1 β”‚ 2.81 β”‚ 23.933 β”‚ 0.8 β”‚ 122 days, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_2_0_10.47 β”‚ 1 β”‚ 15.01 β”‚ 15.373 β”‚ 0.51 β”‚ 3 days, 2:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_3_0_25.38 β”‚ 1 β”‚ 8.72 β”‚ 14.706 β”‚ 0.49 β”‚ 6 days, 12:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_3_0_33.33 β”‚ 1 β”‚ 6.89 β”‚ 13.860 β”‚ 0.46 β”‚ 50 days, 22:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_9_0_36.61 β”‚ 1 β”‚ 1.75 β”‚ 11.596 β”‚ 0.39 β”‚ 93 days, 18:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_2_0_29.32 β”‚ 1 β”‚ 6.7 β”‚ 9.383 β”‚ 0.31 β”‚ 7 days, 7:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_3_0_27.56 β”‚ 1 β”‚ 5.68 β”‚ 9.199 β”‚ 0.31 β”‚ 13 days, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_2_0_8.99 β”‚ 1 β”‚ 7.84 β”‚ 8.075 β”‚ 0.27 β”‚ 5 days, 16:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_DOGE_1_0_24.51 β”‚ 1 β”‚ 12.4 β”‚ 7.724 β”‚ 0.26 β”‚ 2 days, 0:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_4_0_21.52 β”‚ 1 β”‚ 2.86 β”‚ 6.208 β”‚ 0.21 β”‚ 17 days, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_4_0_17.57 β”‚ 1 β”‚ 2.6 β”‚ 6.105 β”‚ 0.2 β”‚ 14 days, 19:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_3_0_43.52 β”‚ 1 β”‚ 3.04 β”‚ 6.100 β”‚ 0.2 β”‚ 17 days, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_4_0_50.43 β”‚ 1 β”‚ 2.2 β”‚ 5.726 β”‚ 0.19 β”‚ 22 days, 16:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_SOL_4_0_59.29 β”‚ 1 β”‚ 2.18 β”‚ 5.714 β”‚ 0.19 β”‚ 10 days, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_2_0_32.91 β”‚ 1 β”‚ 5.13 β”‚ 5.261 β”‚ 0.18 β”‚ 11 days, 17:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_SOL_1_0_12.73 β”‚ 1 β”‚ 7.72 β”‚ 4.819 β”‚ 0.16 β”‚ 1 day, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_2_0_65.15 β”‚ 1 β”‚ 2.99 β”‚ 4.605 β”‚ 0.15 β”‚ 1 day, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_3_0_59.82 β”‚ 1 β”‚ 2.33 β”‚ 4.554 β”‚ 0.15 β”‚ 13 days, 4:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_1_0_6.25 β”‚ 1 β”‚ 8.94 β”‚ 4.460 β”‚ 0.15 β”‚ 2 days, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_1_0_8.7 β”‚ 1 β”‚ 8.37 β”‚ 4.169 β”‚ 0.14 β”‚ 4 days, 8:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_5_0_95.13 β”‚ 1 β”‚ 1.08 β”‚ 3.727 β”‚ 0.12 β”‚ 18 days, 18:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_1_0_10.0 β”‚ 1 β”‚ 7.12 β”‚ 3.554 β”‚ 0.12 β”‚ 2 days, 13:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_DOGE_1_0_61.18 β”‚ 1 β”‚ 6.58 β”‚ 3.290 β”‚ 0.11 β”‚ 3 days, 18:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_DOGE_3_0_64.44 β”‚ 1 β”‚ 1.62 β”‚ 3.241 β”‚ 0.11 β”‚ 9 days, 7:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_1_0_30.43 β”‚ 1 β”‚ 5.08 β”‚ 3.177 β”‚ 0.11 β”‚ 2 days, 12:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_1_0_26.32 β”‚ 1 β”‚ 4.54 β”‚ 2.831 β”‚ 0.09 β”‚ 7 days, 3:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_DOGE_1_0_31.58 β”‚ 1 β”‚ 5.24 β”‚ 2.615 β”‚ 0.09 β”‚ 1 day, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_2_0_31.43 β”‚ 1 β”‚ 2.35 β”‚ 2.370 β”‚ 0.08 β”‚ 6 days, 0:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_2_0_71.95 β”‚ 1 β”‚ 1.7 β”‚ 2.341 β”‚ 0.08 β”‚ 4 days, 2:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_2_0_84.09 β”‚ 1 β”‚ 1.21 β”‚ 2.085 β”‚ 0.07 β”‚ 2 days, 2:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_1_0_13.04 β”‚ 1 β”‚ 4.04 β”‚ 2.013 β”‚ 0.07 β”‚ 3 days, 13:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_1_0_45.16 β”‚ 1 β”‚ 3.37 β”‚ 1.686 β”‚ 0.06 β”‚ 3 days, 5:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_1_0_54.29 β”‚ 1 β”‚ 4.51 β”‚ 1.651 β”‚ 0.06 β”‚ 3 days, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_SOL_1_0_33.33 β”‚ 1 β”‚ 3.21 β”‚ 1.605 β”‚ 0.05 β”‚ 2 days, 5:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_1_0_64.86 β”‚ 1 β”‚ 1.79 β”‚ 1.346 β”‚ 0.04 β”‚ 1 day, 9:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_1_0_18.75 β”‚ 1 β”‚ 2.54 β”‚ 1.271 β”‚ 0.04 β”‚ 1 day, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_1_0_21.43 β”‚ 1 β”‚ 1.84 β”‚ 1.146 β”‚ 0.04 β”‚ 2 days, 0:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_XRP_2_0_57.69 β”‚ 1 β”‚ 1.06 β”‚ 1.082 β”‚ 0.04 β”‚ 3 days, 5:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_1_0_50.0 β”‚ 1 β”‚ 1.22 β”‚ 0.758 β”‚ 0.03 β”‚ 10 days, 22:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_BTC_2_0_53.33 β”‚ 1 β”‚ 0.71 β”‚ 0.717 β”‚ 0.02 β”‚ 2 days, 3:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ Drv3_ETH_1_0_46.15 β”‚ 1 β”‚ 1.4 β”‚ 0.700 β”‚ 0.02 β”‚ 2 days, 7:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ force_exit β”‚ 5 β”‚ -0.37 β”‚ -109.914 β”‚ -3.66 β”‚ 36 days, 5:00:00 β”‚ 3 0 2 60.0 β”‚ -β”‚ TOTAL β”‚ 51 β”‚ 5.29 β”‚ 348.501 β”‚ 11.62 β”‚ 18 days, 11:36:00 β”‚ 49 0 2 96.1 β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - MIXED TAG STATS -┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ -┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ -β”‚ ('smth_12', 'Drv3_XRP_5_0_16.31') β”‚ β”‚ 1 β”‚ 23.4 β”‚ 73.520 β”‚ 2.45 β”‚ 57 days, 4:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_8_0_38.18') β”‚ β”‚ 1 β”‚ 7.76 β”‚ 65.196 β”‚ 2.17 β”‚ 126 days, 19:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_DOGE_7_0_50.8') β”‚ β”‚ 1 β”‚ 7.99 β”‚ 48.996 β”‚ 1.63 β”‚ 50 days, 19:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_SOL_2_0_22.44') β”‚ β”‚ 1 β”‚ 27.31 β”‚ 28.009 β”‚ 0.93 β”‚ 3 days, 8:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_2_0_20.51') β”‚ β”‚ 1 β”‚ 26.94 β”‚ 27.916 β”‚ 0.93 β”‚ 5 days, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_DOGE_8_0_62.66') β”‚ β”‚ 1 β”‚ 2.81 β”‚ 23.933 β”‚ 0.8 β”‚ 122 days, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_2_0_10.47') β”‚ β”‚ 1 β”‚ 15.01 β”‚ 15.373 β”‚ 0.51 β”‚ 3 days, 2:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_3_0_25.38') β”‚ β”‚ 1 β”‚ 8.72 β”‚ 14.706 β”‚ 0.49 β”‚ 6 days, 12:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_3_0_33.33') β”‚ β”‚ 1 β”‚ 6.89 β”‚ 13.860 β”‚ 0.46 β”‚ 50 days, 22:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_9_0_36.61') β”‚ β”‚ 1 β”‚ 1.75 β”‚ 11.596 β”‚ 0.39 β”‚ 93 days, 18:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_2_0_29.32') β”‚ β”‚ 1 β”‚ 6.7 β”‚ 9.383 β”‚ 0.31 β”‚ 7 days, 7:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_3_0_27.56') β”‚ β”‚ 1 β”‚ 5.68 β”‚ 9.199 β”‚ 0.31 β”‚ 13 days, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_2_0_8.99') β”‚ β”‚ 1 β”‚ 7.84 β”‚ 8.075 β”‚ 0.27 β”‚ 5 days, 16:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_DOGE_1_0_24.51') β”‚ β”‚ 1 β”‚ 12.4 β”‚ 7.724 β”‚ 0.26 β”‚ 2 days, 0:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_4_0_21.52') β”‚ β”‚ 1 β”‚ 2.86 β”‚ 6.208 β”‚ 0.21 β”‚ 17 days, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_4_0_17.57') β”‚ β”‚ 1 β”‚ 2.6 β”‚ 6.105 β”‚ 0.2 β”‚ 14 days, 19:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_3_0_43.52') β”‚ β”‚ 1 β”‚ 3.04 β”‚ 6.100 β”‚ 0.2 β”‚ 17 days, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_4_0_50.43') β”‚ β”‚ 1 β”‚ 2.2 β”‚ 5.726 β”‚ 0.19 β”‚ 22 days, 16:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_SOL_4_0_59.29') β”‚ β”‚ 1 β”‚ 2.18 β”‚ 5.714 β”‚ 0.19 β”‚ 10 days, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_2_0_32.91') β”‚ β”‚ 1 β”‚ 5.13 β”‚ 5.261 β”‚ 0.18 β”‚ 11 days, 17:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_SOL_1_0_12.73') β”‚ β”‚ 1 β”‚ 7.72 β”‚ 4.819 β”‚ 0.16 β”‚ 1 day, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_2_0_65.15') β”‚ β”‚ 1 β”‚ 2.99 β”‚ 4.605 β”‚ 0.15 β”‚ 1 day, 21:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_3_0_59.82') β”‚ β”‚ 1 β”‚ 2.33 β”‚ 4.554 β”‚ 0.15 β”‚ 13 days, 4:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_1_0_6.25') β”‚ β”‚ 1 β”‚ 8.94 β”‚ 4.460 β”‚ 0.15 β”‚ 2 days, 10:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_1_0_8.7') β”‚ β”‚ 1 β”‚ 8.37 β”‚ 4.169 β”‚ 0.14 β”‚ 4 days, 8:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_5_0_95.13') β”‚ β”‚ 1 β”‚ 1.08 β”‚ 3.727 β”‚ 0.12 β”‚ 18 days, 18:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_1_0_10.0') β”‚ β”‚ 1 β”‚ 7.12 β”‚ 3.554 β”‚ 0.12 β”‚ 2 days, 13:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_DOGE_1_0_61.18') β”‚ β”‚ 1 β”‚ 6.58 β”‚ 3.290 β”‚ 0.11 β”‚ 3 days, 18:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_DOGE_3_0_64.44') β”‚ β”‚ 1 β”‚ 1.62 β”‚ 3.241 β”‚ 0.11 β”‚ 9 days, 7:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_1_0_30.43') β”‚ β”‚ 1 β”‚ 5.08 β”‚ 3.177 β”‚ 0.11 β”‚ 2 days, 12:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_1_0_26.32') β”‚ β”‚ 1 β”‚ 4.54 β”‚ 2.831 β”‚ 0.09 β”‚ 7 days, 3:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_DOGE_1_0_31.58') β”‚ β”‚ 1 β”‚ 5.24 β”‚ 2.615 β”‚ 0.09 β”‚ 1 day, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_2_0_31.43') β”‚ β”‚ 1 β”‚ 2.35 β”‚ 2.370 β”‚ 0.08 β”‚ 6 days, 0:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_2_0_71.95') β”‚ β”‚ 1 β”‚ 1.7 β”‚ 2.341 β”‚ 0.08 β”‚ 4 days, 2:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_2_0_84.09') β”‚ β”‚ 1 β”‚ 1.21 β”‚ 2.085 β”‚ 0.07 β”‚ 2 days, 2:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_1_0_13.04') β”‚ β”‚ 1 β”‚ 4.04 β”‚ 2.013 β”‚ 0.07 β”‚ 3 days, 13:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_1_0_45.16') β”‚ β”‚ 1 β”‚ 3.37 β”‚ 1.686 β”‚ 0.06 β”‚ 3 days, 5:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_1_0_54.29') β”‚ β”‚ 1 β”‚ 4.51 β”‚ 1.651 β”‚ 0.06 β”‚ 3 days, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_SOL_1_0_33.33') β”‚ β”‚ 1 β”‚ 3.21 β”‚ 1.605 β”‚ 0.05 β”‚ 2 days, 5:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_1_0_64.86') β”‚ β”‚ 1 β”‚ 1.79 β”‚ 1.346 β”‚ 0.04 β”‚ 1 day, 9:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_1_0_18.75') β”‚ β”‚ 1 β”‚ 2.54 β”‚ 1.271 β”‚ 0.04 β”‚ 1 day, 15:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_1_0_21.43') β”‚ β”‚ 1 β”‚ 1.84 β”‚ 1.146 β”‚ 0.04 β”‚ 2 days, 0:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_XRP_2_0_57.69') β”‚ β”‚ 1 β”‚ 1.06 β”‚ 1.082 β”‚ 0.04 β”‚ 3 days, 5:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_1_0_50.0') β”‚ β”‚ 1 β”‚ 1.22 β”‚ 0.758 β”‚ 0.03 β”‚ 10 days, 22:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_BTC_2_0_53.33') β”‚ β”‚ 1 β”‚ 0.71 β”‚ 0.717 β”‚ 0.02 β”‚ 2 days, 3:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'Drv3_ETH_1_0_46.15') β”‚ β”‚ 1 β”‚ 1.4 β”‚ 0.700 β”‚ 0.02 β”‚ 2 days, 7:00:00 β”‚ 1 0 0 100 β”‚ -β”‚ ('smth_12', 'force_exit') β”‚ β”‚ 5 β”‚ -0.37 β”‚ -109.914 β”‚ -3.66 β”‚ 36 days, 5:00:00 β”‚ 3 0 2 60.0 β”‚ -β”‚ TOTAL β”‚ β”‚ 51 β”‚ 5.29 β”‚ 348.501 β”‚ 11.62 β”‚ 18 days, 11:36:00 β”‚ 49 0 2 96.1 β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - SUMMARY METRICS -┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓ -┃ Metric ┃ Value ┃ -┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩ -β”‚ Backtesting from β”‚ 2025-01-01 00:00:00 β”‚ -β”‚ Backtesting to β”‚ 2025-07-14 00:00:00 β”‚ -β”‚ Trading Mode β”‚ Spot β”‚ -β”‚ Max open trades β”‚ 5 β”‚ -β”‚ β”‚ β”‚ -β”‚ Total/Daily Avg Trades β”‚ 51 / 0.26 β”‚ -β”‚ Starting balance β”‚ 3000 USDT β”‚ -β”‚ Final balance β”‚ 3348.501 USDT β”‚ -β”‚ Absolute profit β”‚ 348.501 USDT β”‚ -β”‚ Total profit % β”‚ 11.62% β”‚ -β”‚ CAGR % β”‚ 22.97% β”‚ -β”‚ Sortino β”‚ 0.60 β”‚ -β”‚ Sharpe β”‚ 1.51 β”‚ -β”‚ Calmar β”‚ 34.64 β”‚ -β”‚ SQN β”‚ 2.12 β”‚ -β”‚ Profit factor β”‚ 4.05 β”‚ -β”‚ Expectancy (Ratio) β”‚ 6.83 (0.12) β”‚ -β”‚ Avg. daily profit % β”‚ 0.06% β”‚ -β”‚ Avg. stake amount β”‚ 184.308 USDT β”‚ -β”‚ Total trade volume β”‚ 19186.241 USDT β”‚ -β”‚ β”‚ β”‚ -β”‚ Best Pair β”‚ XRP/USDT 5.96% β”‚ -β”‚ Worst Pair β”‚ SOL/USDT -2.47% β”‚ -β”‚ Best trade β”‚ SOL/USDT 27.31% β”‚ -β”‚ Worst trade β”‚ SOL/USDT -10.67% β”‚ -β”‚ Best day β”‚ 126.686 USDT β”‚ -β”‚ Worst day β”‚ -109.914 USDT β”‚ -β”‚ Days win/draw/lose β”‚ 33 / 160 / 1 β”‚ -β”‚ Avg. Duration Winners β”‚ 15 days, 15:29:00 β”‚ -β”‚ Avg. Duration Loser β”‚ 88 days, 0:30:00 β”‚ -β”‚ Max Consecutive Wins / Loss β”‚ 48 / 1 β”‚ -β”‚ Rejected Entry signals β”‚ 0 β”‚ -β”‚ Entry/Exit Timeouts β”‚ 0 / 0 β”‚ -β”‚ β”‚ β”‚ -β”‚ Min balance β”‚ 3004.819 USDT β”‚ -β”‚ Max balance β”‚ 3461.743 USDT β”‚ -β”‚ Max % of account underwater β”‚ 3.30% β”‚ -β”‚ Absolute Drawdown (Account) β”‚ 3.30% β”‚ -β”‚ Absolute Drawdown β”‚ 114.313 USDT β”‚ -β”‚ Drawdown high β”‚ 461.743 USDT β”‚ -β”‚ Drawdown low β”‚ 347.43 USDT β”‚ -β”‚ Drawdown Start β”‚ 2025-07-14 00:00:00 β”‚ -β”‚ Drawdown End β”‚ 2025-07-14 00:00:00 β”‚ -β”‚ Market change β”‚ -17.01% β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +┏━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ +┑━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ +β”‚ stg_inv β”‚ 28 β”‚ 2.57 β”‚ 683.702 β”‚ 22.79 β”‚ 7 days, 8:30:00 β”‚ 28 0 0 100 β”‚ +β”‚ smth β”‚ 21 β”‚ 1.65 β”‚ 301.376 β”‚ 10.05 β”‚ 9 days, 10:31:00 β”‚ 21 0 0 100 β”‚ +β”‚ smth3_inv β”‚ 11 β”‚ 1.17 β”‚ 120.437 β”‚ 4.01 β”‚ 7 days, 6:04:00 β”‚ 11 0 0 100 β”‚ +β”‚ raise β”‚ 6 β”‚ 1.71 β”‚ 111.293 β”‚ 3.71 β”‚ 5 days, 11:56:00 β”‚ 6 0 0 100 β”‚ +β”‚ invert β”‚ 4 β”‚ 2.68 β”‚ 92.311 β”‚ 3.08 β”‚ 3 days, 3:42:00 β”‚ 4 0 0 100 β”‚ +β”‚ TOTAL β”‚ 70 β”‚ 2.0 β”‚ 1309.119 β”‚ 43.64 β”‚ 7 days, 13:32:00 β”‚ 70 0 0 100 β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + EXIT REASON STATS +┏━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ +┑━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ +β”‚ 10_B15_BTC_7 β”‚ 1 β”‚ 15.83 β”‚ 238.082 β”‚ 7.94 β”‚ 13 days, 14:05:00 β”‚ 1 0 0 100 β”‚ +β”‚ 13_B30_BTC_5 β”‚ 2 β”‚ 2.96 β”‚ 103.477 β”‚ 3.45 β”‚ 16 days, 7:10:00 β”‚ 2 0 0 100 β”‚ +β”‚ 11_B15_BTC_9 β”‚ 1 β”‚ 5.1 β”‚ 83.824 β”‚ 2.79 β”‚ 5 days, 3:20:00 β”‚ 1 0 0 100 β”‚ +β”‚ 8_B30_BTC_3 β”‚ 2 β”‚ 4.43 β”‚ 76.704 β”‚ 2.56 β”‚ 8 days, 14:12:00 β”‚ 2 0 0 100 β”‚ +β”‚ 8_B15_BTC_4 β”‚ 2 β”‚ 3.11 β”‚ 74.181 β”‚ 2.47 β”‚ 8 days, 7:35:00 β”‚ 2 0 0 100 β”‚ +β”‚ 5_B15_BTC_4 β”‚ 1 β”‚ 9.79 β”‚ 73.161 β”‚ 2.44 β”‚ 4 days, 17:30:00 β”‚ 1 0 0 100 β”‚ +β”‚ 15_B15_BTC_6 β”‚ 1 β”‚ 8.11 β”‚ 69.576 β”‚ 2.32 β”‚ 30 days, 14:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ 6_B30_BTC_3 β”‚ 3 β”‚ 2.84 β”‚ 66.528 β”‚ 2.22 β”‚ 4 days, 3:20:00 β”‚ 3 0 0 100 β”‚ +β”‚ 6_B15_BTC_4 β”‚ 1 β”‚ 5.45 β”‚ 49.011 β”‚ 1.63 β”‚ 8 days, 2:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ 5_B30_BTC_4 β”‚ 5 β”‚ 1.29 β”‚ 48.445 β”‚ 1.61 β”‚ 3 days, 1:46:00 β”‚ 5 0 0 100 β”‚ +β”‚ 5_B15_BTC_2 β”‚ 2 β”‚ 3.18 β”‚ 47.310 β”‚ 1.58 β”‚ 5 days, 1:42:00 β”‚ 2 0 0 100 β”‚ +β”‚ 7_B30_BTC_3 β”‚ 2 β”‚ 1.42 β”‚ 30.187 β”‚ 1.01 β”‚ 6 days, 6:20:00 β”‚ 2 0 0 100 β”‚ +β”‚ 4_B30_BTC_2 β”‚ 2 β”‚ 2.48 β”‚ 29.786 β”‚ 0.99 β”‚ 1 day, 20:25:00 β”‚ 2 0 0 100 β”‚ +β”‚ 6_B15_BTC_3 β”‚ 1 β”‚ 2.82 β”‚ 25.361 β”‚ 0.85 β”‚ 4 days, 8:15:00 β”‚ 1 0 0 100 β”‚ +β”‚ 8_B30_BTC_1 β”‚ 1 β”‚ 1.95 β”‚ 24.771 β”‚ 0.83 β”‚ 11 days, 6:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ 13_B30_BTC_6 β”‚ 1 β”‚ 1.06 β”‚ 20.856 β”‚ 0.7 β”‚ 13 days, 7:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ 3_B30_BTC_2 β”‚ 2 β”‚ 2.32 β”‚ 20.822 β”‚ 0.69 β”‚ 1 day, 18:45:00 β”‚ 2 0 0 100 β”‚ +β”‚ 13_B30_BTC_2 β”‚ 1 β”‚ 0.96 β”‚ 20.535 β”‚ 0.68 β”‚ 40 days, 4:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ 4_B30_BTC_1 β”‚ 1 β”‚ 2.65 β”‚ 16.032 β”‚ 0.53 β”‚ 17:45:00 β”‚ 1 0 0 100 β”‚ +β”‚ 10_B30_BTC_3 β”‚ 1 β”‚ 0.98 β”‚ 15.534 β”‚ 0.52 β”‚ 27 days, 8:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ 2_B30_BTC_0 β”‚ 2 β”‚ 2.3 β”‚ 13.900 β”‚ 0.46 β”‚ 7:42:00 β”‚ 2 0 0 100 β”‚ +β”‚ 7_B30_BTC_2 β”‚ 1 β”‚ 1.26 β”‚ 13.672 β”‚ 0.46 β”‚ 15 days, 10:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ 7_B30_BTC_5 β”‚ 1 β”‚ 3.88 β”‚ 13.570 β”‚ 0.45 β”‚ 3 days, 6:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ 23_B30_BTC_9 β”‚ 1 β”‚ 0.96 β”‚ 13.295 β”‚ 0.44 β”‚ 102 days, 8:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ 9_B30_BTC_2 β”‚ 1 β”‚ 0.87 β”‚ 12.113 β”‚ 0.4 β”‚ 18 days, 6:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ 5_B30_BTC_3 β”‚ 1 β”‚ 1.58 β”‚ 11.940 β”‚ 0.4 β”‚ 2 days, 21:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ 11_B30_BTC_3 β”‚ 1 β”‚ 0.66 β”‚ 11.527 β”‚ 0.38 β”‚ 20 days, 17:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ 3_B30_BTC_1 β”‚ 1 β”‚ 2.25 β”‚ 10.349 β”‚ 0.34 β”‚ 16:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ 6_B30_BTC_4 β”‚ 1 β”‚ 1.07 β”‚ 9.647 β”‚ 0.32 β”‚ 7 days, 0:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ 9_B30_BTC_8 β”‚ 1 β”‚ 2.07 β”‚ 9.189 β”‚ 0.31 β”‚ 3 days, 9:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ 6_Frc_BTC_5 β”‚ 1 β”‚ 0.8 β”‚ 7.186 β”‚ 0.24 β”‚ 2 days, 18:15:00 β”‚ 1 0 0 100 β”‚ +β”‚ 4_B30_BTC_3 β”‚ 1 β”‚ 1.1 β”‚ 6.560 β”‚ 0.22 β”‚ 1 day, 2:05:00 β”‚ 1 0 0 100 β”‚ +β”‚ 2_B30_BTC_1 β”‚ 1 β”‚ 2.19 β”‚ 6.557 β”‚ 0.22 β”‚ 13:30:00 β”‚ 1 0 0 100 β”‚ +β”‚ 8_B30_BTC_2 β”‚ 1 β”‚ 0.52 β”‚ 6.412 β”‚ 0.21 β”‚ 14 days, 6:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ 5_B30_BTC_2 β”‚ 1 β”‚ 0.75 β”‚ 5.692 β”‚ 0.19 β”‚ 5 days, 14:45:00 β”‚ 1 0 0 100 β”‚ +β”‚ 5_Rsi85_BTC_4 β”‚ 1 β”‚ 0.76 β”‚ 5.673 β”‚ 0.19 β”‚ 2 days, 10:00:00 β”‚ 1 0 0 100 β”‚ +β”‚ 2_B15_BTC_1 β”‚ 5 β”‚ 0.18 β”‚ 2.724 β”‚ 0.09 β”‚ 16:01:00 β”‚ 5 0 0 100 β”‚ +β”‚ force_exit β”‚ 1 β”‚ 0.84 β”‚ 2.513 β”‚ 0.08 β”‚ 1 day, 1:20:00 β”‚ 1 0 0 100 β”‚ +β”‚ 5_B15_BTC_3 β”‚ 1 β”‚ 0.88 β”‚ 2.196 β”‚ 0.07 β”‚ 2 days, 12:30:00 β”‚ 1 0 0 100 β”‚ +β”‚ 4_B15_BTC_3 β”‚ 4 β”‚ 0.15 β”‚ 2.164 β”‚ 0.07 β”‚ 1 day, 18:30:00 β”‚ 4 0 0 100 β”‚ +β”‚ 3_B15_BTC_2 β”‚ 3 β”‚ 0.17 β”‚ 2.106 β”‚ 0.07 β”‚ 1 day, 7:10:00 β”‚ 3 0 0 100 β”‚ +β”‚ 8_B15_BTC_2 β”‚ 1 β”‚ 0.4 β”‚ 1.775 β”‚ 0.06 β”‚ 7 days, 18:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ 1_B15_BTC_0 β”‚ 2 β”‚ 0.46 β”‚ 1.364 β”‚ 0.05 β”‚ 17:18:00 β”‚ 2 0 0 100 β”‚ +β”‚ 8_B15_BTC_5 β”‚ 1 β”‚ 0.34 β”‚ 1.359 β”‚ 0.05 β”‚ 6 days, 21:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ 5_Frc_BTC_2 β”‚ 1 β”‚ 0.15 β”‚ 1.115 β”‚ 0.04 β”‚ 3 days, 19:00:00 β”‚ 1 0 0 100 β”‚ +β”‚ 8_B15_BTC_3 β”‚ 1 β”‚ 0.03 β”‚ 0.339 β”‚ 0.01 β”‚ 6 days, 16:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ TOTAL β”‚ 70 β”‚ 2.0 β”‚ 1309.119 β”‚ 43.64 β”‚ 7 days, 13:32:00 β”‚ 70 0 0 100 β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + MIXED TAG STATS +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ +┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ +β”‚ ('stg_inv', '10_B15_BTC_7') β”‚ β”‚ 1 β”‚ 15.83 β”‚ 238.082 β”‚ 7.94 β”‚ 13 days, 14:05:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '13_B30_BTC_5') β”‚ β”‚ 1 β”‚ 4.51 β”‚ 93.315 β”‚ 3.11 β”‚ 12 days, 11:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('raise', '11_B15_BTC_9') β”‚ β”‚ 1 β”‚ 5.1 β”‚ 83.824 β”‚ 2.79 β”‚ 5 days, 3:20:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '8_B15_BTC_4') β”‚ β”‚ 1 β”‚ 6.11 β”‚ 73.794 β”‚ 2.46 β”‚ 10 days, 9:45:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '5_B15_BTC_4') β”‚ β”‚ 1 β”‚ 9.79 β”‚ 73.161 β”‚ 2.44 β”‚ 4 days, 17:30:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '15_B15_BTC_6') β”‚ β”‚ 1 β”‚ 8.11 β”‚ 69.576 β”‚ 2.32 β”‚ 30 days, 14:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('invert', '8_B30_BTC_3') β”‚ β”‚ 1 β”‚ 4.9 β”‚ 60.012 β”‚ 2.0 β”‚ 7 days, 20:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '6_B30_BTC_3') β”‚ β”‚ 1 β”‚ 6.13 β”‚ 55.266 β”‚ 1.84 β”‚ 3 days, 19:00:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '6_B15_BTC_4') β”‚ β”‚ 1 β”‚ 5.45 β”‚ 49.011 β”‚ 1.63 β”‚ 8 days, 2:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '5_B15_BTC_2') β”‚ β”‚ 1 β”‚ 6.2 β”‚ 46.918 β”‚ 1.56 β”‚ 6 days, 23:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('invert', '4_B30_BTC_2') β”‚ β”‚ 2 β”‚ 2.48 β”‚ 29.786 β”‚ 0.99 β”‚ 1 day, 20:25:00 β”‚ 2 0 0 100 β”‚ +β”‚ ('smth3_inv', '6_B15_BTC_3') β”‚ β”‚ 1 β”‚ 2.82 β”‚ 25.361 β”‚ 0.85 β”‚ 4 days, 8:15:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth3_inv', '5_B30_BTC_4') β”‚ β”‚ 2 β”‚ 1.68 β”‚ 25.224 β”‚ 0.84 β”‚ 2 days, 19:12:00 β”‚ 2 0 0 100 β”‚ +β”‚ ('smth3_inv', '8_B30_BTC_1') β”‚ β”‚ 1 β”‚ 1.95 β”‚ 24.771 β”‚ 0.83 β”‚ 11 days, 6:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '7_B30_BTC_3') β”‚ β”‚ 1 β”‚ 2.31 β”‚ 24.616 β”‚ 0.82 β”‚ 5 days, 3:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '5_B30_BTC_4') β”‚ β”‚ 3 β”‚ 1.03 β”‚ 23.221 β”‚ 0.77 β”‚ 3 days, 6:08:00 β”‚ 3 0 0 100 β”‚ +β”‚ ('stg_inv', '13_B30_BTC_6') β”‚ β”‚ 1 β”‚ 1.06 β”‚ 20.856 β”‚ 0.7 β”‚ 13 days, 7:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '3_B30_BTC_2') β”‚ β”‚ 2 β”‚ 2.32 β”‚ 20.822 β”‚ 0.69 β”‚ 1 day, 18:45:00 β”‚ 2 0 0 100 β”‚ +β”‚ ('smth3_inv', '13_B30_BTC_2') β”‚ β”‚ 1 β”‚ 0.96 β”‚ 20.535 β”‚ 0.68 β”‚ 40 days, 4:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '8_B30_BTC_3') β”‚ β”‚ 1 β”‚ 3.95 β”‚ 16.692 β”‚ 0.56 β”‚ 9 days, 7:45:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth3_inv', '4_B30_BTC_1') β”‚ β”‚ 1 β”‚ 2.65 β”‚ 16.032 β”‚ 0.53 β”‚ 17:45:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '10_B30_BTC_3') β”‚ β”‚ 1 β”‚ 0.98 β”‚ 15.534 β”‚ 0.52 β”‚ 27 days, 8:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '7_B30_BTC_2') β”‚ β”‚ 1 β”‚ 1.26 β”‚ 13.672 β”‚ 0.46 β”‚ 15 days, 10:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '7_B30_BTC_5') β”‚ β”‚ 1 β”‚ 3.88 β”‚ 13.570 β”‚ 0.45 β”‚ 3 days, 6:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '23_B30_BTC_9') β”‚ β”‚ 1 β”‚ 0.96 β”‚ 13.295 β”‚ 0.44 β”‚ 102 days, 8:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('raise', '9_B30_BTC_2') β”‚ β”‚ 1 β”‚ 0.87 β”‚ 12.113 β”‚ 0.4 β”‚ 18 days, 6:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '5_B30_BTC_3') β”‚ β”‚ 1 β”‚ 1.58 β”‚ 11.940 β”‚ 0.4 β”‚ 2 days, 21:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '11_B30_BTC_3') β”‚ β”‚ 1 β”‚ 0.66 β”‚ 11.527 β”‚ 0.38 β”‚ 20 days, 17:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '3_B30_BTC_1') β”‚ β”‚ 1 β”‚ 2.25 β”‚ 10.349 β”‚ 0.34 β”‚ 16:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '13_B30_BTC_5') β”‚ β”‚ 1 β”‚ 1.4 β”‚ 10.162 β”‚ 0.34 β”‚ 20 days, 3:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '6_B30_BTC_4') β”‚ β”‚ 1 β”‚ 1.07 β”‚ 9.647 β”‚ 0.32 β”‚ 7 days, 0:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '9_B30_BTC_8') β”‚ β”‚ 1 β”‚ 2.07 β”‚ 9.189 β”‚ 0.31 β”‚ 3 days, 9:10:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '2_B30_BTC_0') β”‚ β”‚ 1 β”‚ 2.68 β”‚ 8.072 β”‚ 0.27 β”‚ 6:45:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '6_Frc_BTC_5') β”‚ β”‚ 1 β”‚ 0.8 β”‚ 7.186 β”‚ 0.24 β”‚ 2 days, 18:15:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '4_B30_BTC_3') β”‚ β”‚ 1 β”‚ 1.1 β”‚ 6.560 β”‚ 0.22 β”‚ 1 day, 2:05:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '2_B30_BTC_1') β”‚ β”‚ 1 β”‚ 2.19 β”‚ 6.557 β”‚ 0.22 β”‚ 13:30:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '8_B30_BTC_2') β”‚ β”‚ 1 β”‚ 0.52 β”‚ 6.412 β”‚ 0.21 β”‚ 14 days, 6:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('raise', '6_B30_BTC_3') β”‚ β”‚ 1 β”‚ 0.68 β”‚ 6.144 β”‚ 0.2 β”‚ 6 days, 5:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('raise', '2_B30_BTC_0') β”‚ β”‚ 1 β”‚ 1.93 β”‚ 5.828 β”‚ 0.19 β”‚ 8:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '5_B30_BTC_2') β”‚ β”‚ 1 β”‚ 0.75 β”‚ 5.692 β”‚ 0.19 β”‚ 5 days, 14:45:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '5_Rsi85_BTC_4') β”‚ β”‚ 1 β”‚ 0.76 β”‚ 5.673 β”‚ 0.19 β”‚ 2 days, 10:00:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth3_inv', '7_B30_BTC_3') β”‚ β”‚ 1 β”‚ 0.53 β”‚ 5.572 β”‚ 0.19 β”‚ 7 days, 9:00:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '6_B30_BTC_3') β”‚ β”‚ 1 β”‚ 1.69 β”‚ 5.119 β”‚ 0.17 β”‚ 2 days, 9:05:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('invert', 'force_exit') β”‚ β”‚ 1 β”‚ 0.84 β”‚ 2.513 β”‚ 0.08 β”‚ 1 day, 1:20:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '2_B15_BTC_1') β”‚ β”‚ 3 β”‚ 0.27 β”‚ 2.383 β”‚ 0.08 β”‚ 17:32:00 β”‚ 3 0 0 100 β”‚ +β”‚ ('raise', '5_B15_BTC_3') β”‚ β”‚ 1 β”‚ 0.88 β”‚ 2.196 β”‚ 0.07 β”‚ 2 days, 12:30:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '8_B15_BTC_2') β”‚ β”‚ 1 β”‚ 0.4 β”‚ 1.775 β”‚ 0.06 β”‚ 7 days, 18:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth3_inv', '4_B15_BTC_3') β”‚ β”‚ 2 β”‚ 0.12 β”‚ 1.435 β”‚ 0.05 β”‚ 1 day, 16:02:00 β”‚ 2 0 0 100 β”‚ +β”‚ ('stg_inv', '8_B15_BTC_5') β”‚ β”‚ 1 β”‚ 0.34 β”‚ 1.359 β”‚ 0.05 β”‚ 6 days, 21:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '3_B15_BTC_2') β”‚ β”‚ 2 β”‚ 0.17 β”‚ 1.352 β”‚ 0.05 β”‚ 1 day, 7:18:00 β”‚ 2 0 0 100 β”‚ +β”‚ ('raise', '1_B15_BTC_0') β”‚ β”‚ 1 β”‚ 0.79 β”‚ 1.188 β”‚ 0.04 β”‚ 10:30:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth3_inv', '5_Frc_BTC_2') β”‚ β”‚ 1 β”‚ 0.15 β”‚ 1.115 β”‚ 0.04 β”‚ 3 days, 19:00:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '3_B15_BTC_2') β”‚ β”‚ 1 β”‚ 0.17 β”‚ 0.753 β”‚ 0.03 β”‚ 1 day, 6:55:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '4_B15_BTC_3') β”‚ β”‚ 1 β”‚ 0.34 β”‚ 0.668 β”‚ 0.02 β”‚ 1 day, 11:40:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth3_inv', '5_B15_BTC_2') β”‚ β”‚ 1 β”‚ 0.15 β”‚ 0.393 β”‚ 0.01 β”‚ 3 days, 3:50:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('smth', '8_B15_BTC_4') β”‚ β”‚ 1 β”‚ 0.1 β”‚ 0.388 β”‚ 0.01 β”‚ 6 days, 5:25:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '2_B15_BTC_1') β”‚ β”‚ 2 β”‚ 0.06 β”‚ 0.341 β”‚ 0.01 β”‚ 13:45:00 β”‚ 2 0 0 100 β”‚ +β”‚ ('stg_inv', '8_B15_BTC_3') β”‚ β”‚ 1 β”‚ 0.03 β”‚ 0.339 β”‚ 0.01 β”‚ 6 days, 16:35:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '1_B15_BTC_0') β”‚ β”‚ 1 β”‚ 0.12 β”‚ 0.176 β”‚ 0.01 β”‚ 1 day, 0:05:00 β”‚ 1 0 0 100 β”‚ +β”‚ ('stg_inv', '4_B15_BTC_3') β”‚ β”‚ 1 β”‚ 0.03 β”‚ 0.061 β”‚ 0.0 β”‚ 2 days, 6:15:00 β”‚ 1 0 0 100 β”‚ +β”‚ TOTAL β”‚ β”‚ 70 β”‚ 2.0 β”‚ 1309.119 β”‚ 43.64 β”‚ 7 days, 13:32:00 β”‚ 70 0 0 100 β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + WEEK BREAKDOWN +┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━━┓ +┃ Week ┃ Tot Profit USDT ┃ Wins ┃ Draws ┃ Losses ┃ +┑━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━━┩ +β”‚ 08/01/2024 β”‚ 13.668 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 15/01/2024 β”‚ 13.57 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 22/01/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 29/01/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 05/02/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 12/02/2024 β”‚ 69.576 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 19/02/2024 β”‚ 13.743 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 26/02/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 04/03/2024 β”‚ 238.289 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 11/03/2024 β”‚ 70.733 β”‚ 3 β”‚ 0 β”‚ 0 β”‚ +β”‚ 18/03/2024 β”‚ 26.414 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 25/03/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 01/04/2024 β”‚ 93.315 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 08/04/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 15/04/2024 β”‚ 23.052 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 22/04/2024 β”‚ 1.775 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 29/04/2024 β”‚ 5.454 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 06/05/2024 β”‚ 31.331 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 13/05/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 20/05/2024 β”‚ 17.895 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 27/05/2024 β”‚ 28.057 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 03/06/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 10/06/2024 β”‚ 2.112 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 17/06/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 24/06/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 01/07/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 08/07/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 15/07/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 22/07/2024 β”‚ 46.029 β”‚ 3 β”‚ 0 β”‚ 0 β”‚ +β”‚ 29/07/2024 β”‚ 24.616 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 05/08/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 12/08/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 19/08/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 26/08/2024 β”‚ 15.534 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 02/09/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 09/09/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 16/09/2024 β”‚ 11.527 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 23/09/2024 β”‚ 9.187 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 30/09/2024 β”‚ 5.775 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 07/10/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 14/10/2024 β”‚ 13.672 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 21/10/2024 β”‚ 6.176 β”‚ 3 β”‚ 0 β”‚ 0 β”‚ +β”‚ 28/10/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 04/11/2024 β”‚ 73.794 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 11/11/2024 β”‚ 62.114 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 18/11/2024 β”‚ 74.448 β”‚ 3 β”‚ 0 β”‚ 0 β”‚ +β”‚ 25/11/2024 β”‚ 83.824 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 02/12/2024 β”‚ 0.339 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 09/12/2024 β”‚ 6.144 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 16/12/2024 β”‚ 6.619 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 23/12/2024 β”‚ 12.66 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 30/12/2024 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 06/01/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 13/01/2025 β”‚ 10.555 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 20/01/2025 β”‚ 36.617 β”‚ 5 β”‚ 0 β”‚ 0 β”‚ +β”‚ 27/01/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 03/02/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 10/02/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 17/02/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 24/02/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 03/03/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 10/03/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 17/03/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 24/03/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 31/03/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 07/04/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 14/04/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 21/04/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 28/04/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 05/05/2025 β”‚ 13.295 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 12/05/2025 β”‚ 52.59 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 19/05/2025 β”‚ 5.572 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 26/05/2025 β”‚ 9.189 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 02/06/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 09/06/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 16/06/2025 β”‚ 12.113 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 23/06/2025 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ 0 β”‚ +β”‚ 30/06/2025 β”‚ 6.576 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β”‚ 07/07/2025 β”‚ 9.647 β”‚ 1 β”‚ 0 β”‚ 0 β”‚ +β”‚ 14/07/2025 β”‚ 51.524 β”‚ 2 β”‚ 0 β”‚ 0 β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + SUMMARY METRICS +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Metric ┃ Value ┃ +┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ +β”‚ Backtesting from β”‚ 2024-01-01 00:00:00 β”‚ +β”‚ Backtesting to β”‚ 2025-07-14 00:00:00 β”‚ +β”‚ Trading Mode β”‚ Spot β”‚ +β”‚ Max open trades β”‚ 1 β”‚ +β”‚ β”‚ β”‚ +β”‚ Total/Daily Avg Trades β”‚ 70 / 0.12 β”‚ +β”‚ Starting balance β”‚ 3000 USDT β”‚ +β”‚ Final balance β”‚ 4309.119 USDT β”‚ +β”‚ Absolute profit β”‚ 1309.119 USDT β”‚ +β”‚ Total profit % β”‚ 43.64% β”‚ +β”‚ CAGR % β”‚ 26.62% β”‚ +β”‚ Sortino β”‚ -100.00 β”‚ +β”‚ Sharpe β”‚ 1.31 β”‚ +β”‚ Calmar β”‚ -100.00 β”‚ +β”‚ SQN β”‚ 4.55 β”‚ +β”‚ Profit factor β”‚ 0.00 β”‚ +β”‚ Expectancy (Ratio) β”‚ 18.70 (100.00) β”‚ +β”‚ Avg. daily profit % β”‚ 0.08% β”‚ +β”‚ Avg. stake amount β”‚ 752.629 USDT β”‚ +β”‚ Total trade volume β”‚ 106890.678 USDT β”‚ +β”‚ β”‚ β”‚ +β”‚ Best Pair β”‚ BTC/USDT 43.64% β”‚ +β”‚ Worst Pair β”‚ BTC/USDT 43.64% β”‚ +β”‚ Best trade β”‚ BTC/USDT 15.83% β”‚ +β”‚ Worst trade β”‚ BTC/USDT 0.03% β”‚ +β”‚ Best day β”‚ 238.082 USDT β”‚ +β”‚ Worst day β”‚ 0 USDT β”‚ +β”‚ Days win/draw/lose β”‚ 69 / 490 / 0 β”‚ +β”‚ Avg. Duration Winners β”‚ 7 days, 13:32:00 β”‚ +β”‚ Avg. Duration Loser β”‚ 0:00:00 β”‚ +β”‚ Max Consecutive Wins / Loss β”‚ 70 / 0 β”‚ +β”‚ Rejected Entry signals β”‚ 0 β”‚ +β”‚ Entry/Exit Timeouts β”‚ 0 / 0 β”‚ +β”‚ β”‚ β”‚ +β”‚ Min balance β”‚ 0 USDT β”‚ +β”‚ Max balance β”‚ 0 USDT β”‚ +β”‚ Max % of account underwater β”‚ 0.00% β”‚ +β”‚ Absolute Drawdown (Account) β”‚ 0.00% β”‚ +β”‚ Absolute Drawdown β”‚ 0 USDT β”‚ +β”‚ Drawdown high β”‚ 0 USDT β”‚ +β”‚ Drawdown low β”‚ 0 USDT β”‚ +β”‚ Drawdown Start β”‚ 1970-01-01 00:00:00+00:00 β”‚ +β”‚ Drawdown End β”‚ 1970-01-01 00:00:00+00:00 β”‚ +β”‚ Market change β”‚ 180.15% β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ -Backtested 2025-01-01 00:00:00 -> 2025-07-14 00:00:00 | Max open trades : 5 +Backtested 2024-01-01 00:00:00 -> 2025-07-14 00:00:00 | Max open trades : 1 STRATEGY SUMMARY -┏━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓ -┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃ -┑━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩ -β”‚ Zeus_8_1d β”‚ 51 β”‚ 5.29 β”‚ 348.501 β”‚ 11.62 β”‚ 18 days, 11:36:00 β”‚ 49 0 2 96.1 β”‚ 114.313 USDT 3.30% β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃ +┑━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +β”‚ Zeus_8_3_2_B_4_2 β”‚ 70 β”‚ 2.00 β”‚ 1309.119 β”‚ 43.64 β”‚ 7 days, 13:32:00 β”‚ 70 0 0 100 β”‚ 0 USDT 0.00% β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜