FrictradeLearning.py corrections diverses
This commit is contained in:
@@ -107,19 +107,6 @@ class FrictradeLearning(IStrategy):
|
||||
"minimal_roi": {"0": 0.10}
|
||||
}
|
||||
|
||||
dca_levels = {
|
||||
0: 0.00,
|
||||
-2: 0.05,
|
||||
-4: 0.07,
|
||||
-6: 0.10,
|
||||
-8: 0.12,
|
||||
-10: 0.15,
|
||||
-12: 0.18,
|
||||
-14: 0.22,
|
||||
-16: 0.26,
|
||||
-18: 0.30,
|
||||
}
|
||||
|
||||
allow_decrease_rate = DecimalParameter(0.1, 0.8, decimals=1, default=0.4, space='protection')
|
||||
first_adjust_param = DecimalParameter(0.001, 0.01, decimals=3, default=0.003, space='protection')
|
||||
max_steps = IntParameter(10, 50, default=40, space='protection', optimize=True, load=True)
|
||||
@@ -254,7 +241,7 @@ class FrictradeLearning(IStrategy):
|
||||
# d = n / (p * (p - 1)) # incrément
|
||||
# return [round(a + i * d, 3) for i in range(p)]
|
||||
def progressive_parts(total, n, first):
|
||||
|
||||
print('In part')
|
||||
# conditions impossibles → on évite le solveur
|
||||
if total <= 0 or first <= 0 or n <= 1:
|
||||
return [0] * n
|
||||
@@ -282,7 +269,9 @@ class FrictradeLearning(IStrategy):
|
||||
self.pairs[pair]['dca_thresholds'] = progressive_parts(
|
||||
(last_candle['mid'] - (self.pairs[pair]['last_ath'] * (1 - self.allow_decrease_rate.value))) / last_candle['mid'],
|
||||
steps, self.first_adjust_param.value)
|
||||
print(f"val={last_candle['mid']} steps={steps} pct={(last_candle['mid'] - (self.pairs[pair]['last_ath'] * (1 - self.allow_decrease_rate.value))) / last_candle['mid']}")
|
||||
print(f"val={last_candle['mid']} lim={self.pairs[pair]['last_ath'] * (1 - self.allow_decrease_rate.value)}"
|
||||
f"steps={steps} "
|
||||
f"pct={(round(last_candle['mid'] - (self.pairs[pair]['last_ath'] * (1 - self.allow_decrease_rate.value))) / last_candle['mid'], 4)}")
|
||||
print(self.pairs[pair]['dca_thresholds'])
|
||||
|
||||
def confirm_trade_exit(self, pair: str, trade: Trade, order_type: str, amount: float, rate: float,
|
||||
@@ -1095,30 +1084,30 @@ class FrictradeLearning(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 = dataframe.iloc[-2].squeeze()
|
||||
# prépare les données
|
||||
current_time = current_time.astimezone(timezone.utc)
|
||||
open_date = trade.open_date.astimezone(timezone.utc)
|
||||
# open_date = trade.open_date.astimezone(timezone.utc)
|
||||
dispo = round(self.wallets.get_available_stake_amount())
|
||||
hours_since_first_buy = (current_time - trade.open_date_utc).seconds / 3600.0
|
||||
days_since_first_buy = (current_time - trade.open_date_utc).days
|
||||
# hours_since_first_buy = (current_time - trade.open_date_utc).seconds / 3600.0
|
||||
# days_since_first_buy = (current_time - trade.open_date_utc).days
|
||||
hours = (current_time - trade.date_last_filled_utc).total_seconds() / 3600.0
|
||||
minutes = (current_time - trade.date_last_filled_utc).total_seconds() / 60.0
|
||||
# minutes = (current_time - trade.date_last_filled_utc).total_seconds() / 60.0
|
||||
|
||||
count_of_buys = trade.nr_of_successful_entries
|
||||
current_time_utc = current_time.astimezone(timezone.utc)
|
||||
open_date = trade.open_date.astimezone(timezone.utc)
|
||||
days_since_open = (current_time_utc - open_date).days
|
||||
# current_time_utc = current_time.astimezone(timezone.utc)
|
||||
# open_date = trade.open_date.astimezone(timezone.utc)
|
||||
# days_since_open = (current_time_utc - open_date).days
|
||||
pair = trade.pair
|
||||
profit = trade.calc_profit(current_rate) #round(current_profit * trade.stake_amount, 1)
|
||||
last_lost = self.getLastLost(last_candle, pair)
|
||||
# last_lost = self.getLastLost(last_candle, pair)
|
||||
pct_first = 0
|
||||
|
||||
total_counts = sum(
|
||||
pair_data['count_of_buys'] for pair_data in self.pairs.values() if not self.getShortName(pair) == 'BTC')
|
||||
|
||||
if self.pairs[pair]['first_buy']:
|
||||
pct_first = self.getPctFirstBuy(pair, last_candle)
|
||||
# total_counts = sum(
|
||||
# pair_data['count_of_buys'] for pair_data in self.pairs.values() if not self.getShortName(pair) == 'BTC')
|
||||
#
|
||||
# if self.pairs[pair]['first_buy']:
|
||||
# pct_first = self.getPctFirstBuy(pair, last_candle)
|
||||
|
||||
if profit > - self.pairs[pair]['first_amount'] \
|
||||
and self.wallets.get_available_stake_amount() < self.pairs[pair]['first_amount'] \
|
||||
@@ -1309,16 +1298,16 @@ class FrictradeLearning(IStrategy):
|
||||
|
||||
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
|
||||
last_candle = dataframe.iloc[-1].squeeze()
|
||||
last_candle_1h = dataframe.iloc[-13].squeeze()
|
||||
before_last_candle = dataframe.iloc[-2].squeeze()
|
||||
before_last_candle_2 = dataframe.iloc[-3].squeeze()
|
||||
before_last_candle_12 = dataframe.iloc[-13].squeeze()
|
||||
|
||||
expected_profit = self.expectedProfit(pair, last_candle)
|
||||
# print(f"current_time={current_time} current_profit={current_profit} expected_profit={expected_profit}")
|
||||
|
||||
# ----- 1) Charger les variables de trailing pour ce trade -----
|
||||
max_price = self.pairs[pair]['max_touch']
|
||||
# last_candle_1h = dataframe.iloc[-13].squeeze()
|
||||
# before_last_candle = dataframe.iloc[-2].squeeze()
|
||||
# before_last_candle_2 = dataframe.iloc[-3].squeeze()
|
||||
# before_last_candle_12 = dataframe.iloc[-13].squeeze()
|
||||
#
|
||||
# expected_profit = self.expectedProfit(pair, last_candle)
|
||||
# # print(f"current_time={current_time} current_profit={current_profit} expected_profit={expected_profit}")
|
||||
#
|
||||
# # ----- 1) Charger les variables de trailing pour ce trade -----
|
||||
# max_price = self.pairs[pair]['max_touch']
|
||||
|
||||
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'])
|
||||
@@ -1337,21 +1326,20 @@ class FrictradeLearning(IStrategy):
|
||||
|
||||
# if current_profit > 0:
|
||||
# print(f"profit={profit} max_profit={max_profit} current_profit={current_profit}")
|
||||
if profit < 0:
|
||||
return None
|
||||
|
||||
baisse = 0
|
||||
if profit > 0:
|
||||
baisse = 1 - (profit / max_profit)
|
||||
mx = max_profit / 5
|
||||
|
||||
# baisse = 0
|
||||
# if profit > 0:
|
||||
# baisse = 1 - (profit / max_profit)
|
||||
# mx = max_profit / 5
|
||||
self.pairs[pair]['count_of_buys'] = count_of_buys
|
||||
self.pairs[pair]['current_profit'] = profit
|
||||
|
||||
# dispo = round(self.wallets.get_available_stake_amount())
|
||||
dispo = round(self.wallets.get_available_stake_amount())
|
||||
# hours_since_first_buy = (current_time - trade.open_date_utc).seconds / 3600.0
|
||||
# days_since_first_buy = (current_time - trade.open_date_utc).days
|
||||
# hours = (current_time - trade.date_last_filled_utc).total_seconds() / 3600.0
|
||||
# minutes = (current_time - trade.date_last_filled_utc).total_seconds() / 60.0
|
||||
minutes = (current_time - trade.date_last_filled_utc).total_seconds() / 60.0
|
||||
|
||||
# ----- 2) Mise à jour du max_price -----
|
||||
self.pairs[pair]['max_touch'] = max(last_candle['close'], self.pairs[pair]['max_touch'])
|
||||
@@ -1363,12 +1351,12 @@ class FrictradeLearning(IStrategy):
|
||||
current_trailing_only_offset_is_reached = self.trailing_only_offset_is_reached
|
||||
current_trailing_stop_positive_offset = self.trailing_stop_positive_offset
|
||||
|
||||
max_ = last_candle['max180']
|
||||
min_ = last_candle['min180']
|
||||
mid = last_candle['mid']
|
||||
# max_ = last_candle['max180']
|
||||
# min_ = last_candle['min180']
|
||||
# mid = last_candle['mid']
|
||||
# éviter division par zéro
|
||||
position = (mid - min_) / (max_ - min_)
|
||||
zone = int(position * 3) # 0 à 2
|
||||
# position = (mid - min_) / (max_ - min_)
|
||||
# zone = int(position * 3) # 0 à 2
|
||||
|
||||
# if zone == 0:
|
||||
# current_trailing_stop_positive = self.trailing_stop_positive
|
||||
@@ -1382,11 +1370,11 @@ class FrictradeLearning(IStrategy):
|
||||
# Exemple : offset=0.321 => stop à +24.8%
|
||||
|
||||
trailing_stop = max_profit * (1.0 - current_trailing_stop_positive)
|
||||
baisse = 0
|
||||
if max_profit:
|
||||
baisse = (max_profit - profit) / max_profit
|
||||
# baisse = 0
|
||||
# if max_profit:
|
||||
# baisse = (max_profit - profit) / max_profit
|
||||
|
||||
# if minutes % 12 == 0:
|
||||
# if minutes % 1 == 0:
|
||||
# self.log_trade(
|
||||
# last_candle=last_candle,
|
||||
# date=current_time,
|
||||
@@ -1399,9 +1387,15 @@ class FrictradeLearning(IStrategy):
|
||||
# buys=count_of_buys,
|
||||
# stake=0
|
||||
# )
|
||||
|
||||
if last_candle['sma12'] > last_candle['sma24']:
|
||||
if profit < 0:
|
||||
return None
|
||||
|
||||
if last_candle['rsi'] > 90:
|
||||
return f"rsi_{count_of_buys}_{self.pairs[pair]['has_gain']}"
|
||||
|
||||
if last_candle['sma12'] > last_candle['sma24']: # and last_candle['rsi'] < 85:
|
||||
return None
|
||||
|
||||
# if last_candle['sma24_deriv1'] > 0 : #and minutes < 180 and baisse < 30: # and last_candle['sma5_deriv1'] > -0.15:
|
||||
# if (minutes < 180):
|
||||
# return None
|
||||
@@ -1410,16 +1404,17 @@ class FrictradeLearning(IStrategy):
|
||||
|
||||
|
||||
# ----- 4) OFFSET : faut-il attendre de dépasser trailing_stop_positive_offset ? -----
|
||||
if current_trailing_only_offset_is_reached:
|
||||
if current_trailing_only_offset_is_reached and max_profit > current_trailing_stop_positive_offset:
|
||||
# Max profit pas atteint ET perte < 2 * current_trailing_stop_positive
|
||||
if profit > max_profit * current_trailing_stop_positive_offset * (count_of_buys - self.pairs[pair]['has_gain']): #2 * current_trailing_stop_positive:
|
||||
if profit > max_profit * (1 - current_trailing_stop_positive): #2 * current_trailing_stop_positive:
|
||||
print(f"{current_time} trailing non atteint trailing_stop={round(trailing_stop,4)} profit={round(profit, 4)} max={round(max_profit, 4)} "
|
||||
f"{min(2, current_trailing_stop_positive_offset * (count_of_buys - self.pairs[pair]['has_gain']))}")
|
||||
f"{min(2, max_profit * (1 - current_trailing_stop_positive))}")
|
||||
return None # ne pas activer le trailing encore
|
||||
else:
|
||||
print(f"{current_time} trailing atteint trailing_stop={round(trailing_stop,4)} profit={round(profit, 4)} max={round(max_profit, 4)} "
|
||||
f"{min(2, current_trailing_stop_positive_offset * (count_of_buys - self.pairs[pair]['has_gain']))}")
|
||||
|
||||
f"{min(2,max_profit * (1 - current_trailing_stop_positive))}")
|
||||
else:
|
||||
return None
|
||||
# Sinon : trailing actif dès le début
|
||||
|
||||
# ----- 6) Condition de vente -----
|
||||
@@ -1427,7 +1422,7 @@ class FrictradeLearning(IStrategy):
|
||||
self.pairs[pair]['force_buy'] = True
|
||||
print(
|
||||
f"{current_time} Condition de vente trailing_stop={round(trailing_stop,4)} profit={round(profit, 4)} max={round(max_profit, 4)} "
|
||||
f"{round(min(2, current_trailing_stop_positive_offset * (count_of_buys - self.pairs[pair]['has_gain'])), 4)}")
|
||||
f"{round(min(2, max_profit * (1 - current_trailing_stop_positive)), 4)}")
|
||||
|
||||
return f"stop_{count_of_buys}_{self.pairs[pair]['has_gain']}"
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user