Bug hunting

This commit is contained in:
Nicolás Sánchez 2024-10-30 18:19:58 -03:00
parent 8981353230
commit a26dbf41b5
4 changed files with 32 additions and 21 deletions

View File

@ -1,3 +1,7 @@
2024.10.30:
. Changes trying to catch the wrong base amount bug.
. Simplified new_market_order code.
2024.10.29: 2024.10.29:
. New functions to get top ask and top bid prices. . New functions to get top ask and top bid prices.
. Improvements when dealing with shallow orderbooks. . Improvements when dealing with shallow orderbooks.

View File

@ -39,7 +39,6 @@ class broker:
self.exchange.load_markets() self.exchange.load_markets()
def all_markets(self,no_retries=False): def all_markets(self,no_retries=False):
retries = self.retries retries = self.retries
while retries>0: while retries>0:
@ -674,22 +673,21 @@ class broker:
if side=="buy": if side=="buy":
to_buy = float(size) to_buy = float(size)
if not amount_in_base: if not amount_in_base:
order_book = self.get_order_book(symbol) #order_book = self.get_order_book(symbol)
if order_book=={}: #if order_book=={}:
self.logger.log_this(f"new_market_order - Orderbook request returned an empty dictionary - Not using orderbook. Switching to a less precise method.",1,symbol) # self.logger.log_this(f"new_market_order - Orderbook request returned an empty dictionary - Not using orderbook. Switching to a less precise method.",1,symbol)
price = self.get_ticker_price(symbol) # price = self.get_ticker_price(symbol)
else: #else:
price = self.average_price_depth(order_book,size,side) # price = self.average_price_depth(order_book,size,side)
if price is None: # if price is None:
#Something failed, back to the basics # #Something failed, back to the basics
self.logger.log_this(f"new_market_order - average_price_depth returned None. Switching to a less precise method.",1,symbol) # self.logger.log_this(f"new_market_order - average_price_depth returned None. Switching to a less precise method.",1,symbol)
price = self.get_ticker_price(symbol) # price = self.get_ticker_price(symbol)
to_buy = float(size)/price to_buy = float(size)/self.get_top_ask_price(pair)
amount = self.amount_to_precision(pair,to_buy) amount = self.amount_to_precision(pair,to_buy)
else: else:
amount = self.amount_to_precision(pair,size) #Market sell orders are ALWAYS nominated in baseexchange.create_order(pair,"market",side,amount) amount = self.amount_to_precision(pair,size) #Market sell orders are always nominated in base currency
#self.logger.log_this(f"Order to be sent: {side} {amount}",1,pair)
order_to_send = self.exchange.create_order(pair,"market",side,amount) order_to_send = self.exchange.create_order(pair,"market",side,amount)
time.sleep(self.wait_time) time.sleep(self.wait_time)
return self.get_order(order_to_send["id"],pair) return self.get_order(order_to_send["id"],pair)

View File

@ -22,7 +22,7 @@ In case the permissions of the certificate changes, reset them this way:
# ll /etc/letsencrypt/ # ll /etc/letsencrypt/
''' '''
version = "2024.10.29" version = "2024.10.30"
''' '''
Color definitions. If you want to change them, check the reference at https://en.wikipedia.org/wiki/ANSI_escape_code#Colors Color definitions. If you want to change them, check the reference at https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

View File

@ -120,6 +120,8 @@ class trader:
#Reset some variables #Reset some variables
self.safety_order_index = 0 self.safety_order_index = 0
self.status_dict["deal_order_history"].clear() self.status_dict["deal_order_history"].clear()
self.tp_order = self.broker.get_empty_order()
self.so = self.broker.get_empty_order()
#Reloads the market #Reloads the market
new_market_data = self.broker.fetch_market(self.pair) new_market_data = self.broker.fetch_market(self.pair)
@ -214,13 +216,19 @@ class trader:
#Wait until the first order gets filled #Wait until the first order gets filled
self.status_dict["pause_reason"] = "start_bot - waiting for the first order to get filled" self.status_dict["pause_reason"] = "start_bot - waiting for the first order to get filled"
while True: while True:
time.sleep(self.broker.get_wait_time()) #Wait a bit longer, to catch a bug:
#Sometimes the amount of base taken into account by the trader is lower than the amount bought,
# which ends up misrepresenting the trade cost per unit of base, which causes the take profit price to skyrocket.
# Maybe is the first market order getting "closed" before is fully filled?
# Or is there an error later in the trader?
#UPDATE: A rogue order appeared selling half of the last filled safety order.
# Is Gate.io pulling shady stuff?
time.sleep(self.broker.get_wait_time()*self.broker.get_cooldown_multiplier())
returned_order = self.broker.get_order(first_order["id"],self.pair) returned_order = self.broker.get_order(first_order["id"],self.pair)
if returned_order==self.broker.get_empty_order(): if returned_order==self.broker.get_empty_order():
self.broker.logger.log_this("Problems with the initial order",1,self.pair) self.broker.logger.log_this("Problems with the initial order",1,self.pair)
return 1 return 1
elif returned_order["status"]=="closed": elif returned_order["status"]=="closed":
self.tp_order = returned_order #Why????
break break
elif returned_order["status"]=="expired": elif returned_order["status"]=="expired":
self.broker.logger.log_this(f"First order expired. Id: {returned_order['id']}",1,self.pair) self.broker.logger.log_this(f"First order expired. Id: {returned_order['id']}",1,self.pair)
@ -250,7 +258,8 @@ class trader:
if returned_order["filled"]!=None: if returned_order["filled"]!=None:
self.total_amount_of_base = returned_order["filled"] self.total_amount_of_base = returned_order["filled"]
if not self.is_short: if not self.is_short:
self.total_amount_of_base -= self.parse_fees(returned_order)[0] #The substraction is because some exchanges charges some fees in base #self.total_amount_of_base -= self.parse_fees(returned_order)[0] #The substraction is because some exchanges charges some fees in base
self.total_amount_of_base -= self.fees_paid_in_base
self.total_amount_of_quote = returned_order["cost"] self.total_amount_of_quote = returned_order["cost"]
else: else:
self.broker.logger.log_this("Error starting bot. Aborting.",1,self.pair) self.broker.logger.log_this("Error starting bot. Aborting.",1,self.pair)
@ -900,8 +909,8 @@ class trader:
self.status_dict["pause_reason"] = "take_profit_routine - var cleanup" self.status_dict["pause_reason"] = "take_profit_routine - var cleanup"
self.fees_paid_in_quote = 0 self.fees_paid_in_quote = 0
self.fees_paid_in_base = 0 self.fees_paid_in_base = 0
self.tp_order = self.broker.get_empty_order() #self.tp_order = self.broker.get_empty_order()
self.so = self.broker.get_empty_order() #self.so = self.broker.get_empty_order()
self.safety_price_table.clear() self.safety_price_table.clear()
#self.safety_order_index = 0 #self.safety_order_index = 0
self.config_dict = self.reload_config_dict() self.config_dict = self.reload_config_dict()