2025.09.07
This commit is contained in:
parent
5cf2979f38
commit
bc8d621152
|
|
@ -1,3 +1,6 @@
|
||||||
|
2025.09.07:
|
||||||
|
. Increased wait time after sending market orders.
|
||||||
|
|
||||||
2025.09.05:
|
2025.09.05:
|
||||||
. Now the trader supports multiple safety orders at the same time.
|
. Now the trader supports multiple safety orders at the same time.
|
||||||
. Removed forcing orders when importing a trader. Maybe it will be reinstated at a later date.
|
. Removed forcing orders when importing a trader. Maybe it will be reinstated at a later date.
|
||||||
|
|
|
||||||
2
main.py
2
main.py
|
|
@ -18,7 +18,7 @@ import exchange_wrapper
|
||||||
import trader
|
import trader
|
||||||
|
|
||||||
|
|
||||||
version = "2025.09.05"
|
version = "2025.09.07"
|
||||||
|
|
||||||
'''
|
'''
|
||||||
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
|
||||||
|
|
|
||||||
24
trader.py
24
trader.py
|
|
@ -216,7 +216,7 @@ class trader:
|
||||||
#Wait a bit longer, sometimes a recently filled market order is not updated quickly enough.
|
#Wait a bit longer, sometimes a recently filled market order is not updated quickly enough.
|
||||||
# When that happens, the amount of base taken into account by the trader is lower than the amount bought,
|
# When that happens, 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.
|
# which ends up misrepresenting the trade cost per unit of base, which causes the take profit price to skyrocket.
|
||||||
time.sleep(self.broker.get_wait_time())
|
time.sleep(self.broker.get_wait_time()*2)
|
||||||
returned_order = self.broker.get_order(first_order["id"],self.status.get_pair())
|
returned_order = self.broker.get_order(first_order["id"],self.status.get_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.status.get_pair())
|
self.broker.logger.log_this("Problems with the initial order",1,self.status.get_pair())
|
||||||
|
|
@ -682,13 +682,14 @@ class trader:
|
||||||
return 1
|
return 1
|
||||||
#send market order selling the total amount of base in the last take profit short order
|
#send market order selling the total amount of base in the last take profit short order
|
||||||
order = self.broker.new_market_order(self.status.get_pair(),free_base,"sell")
|
order = self.broker.new_market_order(self.status.get_pair(),free_base,"sell")
|
||||||
|
time.sleep(self.broker.get_wait_time()*2)
|
||||||
tries = self.broker.get_retries()
|
tries = self.broker.get_retries()
|
||||||
while True:
|
while True:
|
||||||
time.sleep(self.broker.get_wait_time())
|
|
||||||
market_tp_order = self.broker.get_order(order["id"],self.status.get_pair())
|
market_tp_order = self.broker.get_order(order["id"],self.status.get_pair())
|
||||||
if market_tp_order["status"]=="closed":
|
if market_tp_order["status"]=="closed":
|
||||||
_, fees_paid = self.parse_fees(market_tp_order)
|
_, fees_paid = self.parse_fees(market_tp_order)
|
||||||
break
|
break
|
||||||
|
time.sleep(self.broker.get_wait_time())
|
||||||
tries-=1
|
tries-=1
|
||||||
if tries==0:
|
if tries==0:
|
||||||
self.broker.logger.log_this("Liquidation order not filling. Skipping base liquidation",1,self.status.get_pair())
|
self.broker.logger.log_this("Liquidation order not filling. Skipping base liquidation",1,self.status.get_pair())
|
||||||
|
|
@ -722,6 +723,7 @@ class trader:
|
||||||
#Send the market order
|
#Send the market order
|
||||||
amount = self.status.get_take_profit_order()["amount"]
|
amount = self.status.get_take_profit_order()["amount"]
|
||||||
market_order = self.broker.new_market_order(self.status.get_pair(),amount,"sell",amount_in_base=True)
|
market_order = self.broker.new_market_order(self.status.get_pair(),amount,"sell",amount_in_base=True)
|
||||||
|
time.sleep(self.broker.get_wait_time()*2)
|
||||||
|
|
||||||
#Wait for it to be filled
|
#Wait for it to be filled
|
||||||
tries = self.broker.get_retries()
|
tries = self.broker.get_retries()
|
||||||
|
|
@ -730,6 +732,7 @@ class trader:
|
||||||
if order["status"]=="closed":
|
if order["status"]=="closed":
|
||||||
break
|
break
|
||||||
tries-=1
|
tries-=1
|
||||||
|
time.sleep(self.broker.get_wait_time())
|
||||||
if tries==0:
|
if tries==0:
|
||||||
self.broker.logger.log_this("Forced market order not filling.",1,self.status.get_pair())
|
self.broker.logger.log_this("Forced market order not filling.",1,self.status.get_pair())
|
||||||
self.quit = True
|
self.quit = True
|
||||||
|
|
@ -773,21 +776,14 @@ class trader:
|
||||||
partial_filled_price = []
|
partial_filled_price = []
|
||||||
for order in self.status.get_safety_orders():
|
for order in self.status.get_safety_orders():
|
||||||
closed_order = self.broker.get_order(order["id"],self.status.get_pair())
|
closed_order = self.broker.get_order(order["id"],self.status.get_pair())
|
||||||
if closed_order["filled"]==0:
|
if closed_order["filled"]==0: #If this order wasn't filled, it is safe to assume that no order coming after this one was.
|
||||||
#If this order wasn't filled, it is safe to assume that no order coming after this one was.
|
|
||||||
break
|
break
|
||||||
#Sum the filled amounts
|
|
||||||
partial_filled_amount+=closed_order["filled"]
|
partial_filled_amount+=closed_order["filled"]
|
||||||
partial_filled_price.append(closed_order["average"])
|
partial_filled_price.append(closed_order["average"])
|
||||||
#Better than this, the total filled and total cost can be used to send a sell market order of the partial filled amount, and add that to the profit.
|
|
||||||
self.broker.logger.log_this(f"Old safety order is partially filled, ID: {closed_order['id']}, {closed_order['filled']}/{closed_order['amount']} {self.base} filled",1,self.status.get_pair())
|
self.broker.logger.log_this(f"Old safety order is partially filled, ID: {closed_order['id']}, {closed_order['filled']}/{closed_order['amount']} {self.base} filled",1,self.status.get_pair())
|
||||||
#self.status.set_base_bought(self.status.get_base_bought() + closed_order["filled"] - self.parse_fees(closed_order)[0])
|
|
||||||
#self.status.set_quote_spent(self.status.get_quote_spent() + closed_order["cost"])
|
|
||||||
#Save the order
|
|
||||||
if self.broker.get_follow_order_history():
|
if self.broker.get_follow_order_history():
|
||||||
self.status.update_deal_order_history(closed_order)
|
self.status.update_deal_order_history(closed_order)
|
||||||
if closed_order["remaining"]!=0:
|
if closed_order["remaining"]!=0: #If this order is not completely filled, it is safe to assume that no order coming after this one was partially filled.
|
||||||
#If this order is not completely filled, it is safe to assume that no order coming after this one was partially filled.
|
|
||||||
break
|
break
|
||||||
#Now we can clear the safety order list
|
#Now we can clear the safety order list
|
||||||
self.status.set_safety_orders([])
|
self.status.set_safety_orders([])
|
||||||
|
|
@ -796,12 +792,11 @@ class trader:
|
||||||
if not self.status.get_is_short():
|
if not self.status.get_is_short():
|
||||||
#With short traders is just an accounting issue, since when the trader restarts it will be buying cheaper what it sold more expensive in the partially filled safety order(s)
|
#With short traders is just an accounting issue, since when the trader restarts it will be buying cheaper what it sold more expensive in the partially filled safety order(s)
|
||||||
if partial_filled_amount!=0 and len(partial_filled_price)>0 and partial_filled_amount>self.broker.get_min_base_size(self.status.get_pair()):
|
if partial_filled_amount!=0 and len(partial_filled_price)>0 and partial_filled_amount>self.broker.get_min_base_size(self.status.get_pair()):
|
||||||
#send a market order and sum the profits
|
#send a market order and sum the profits and wait for it to be filled
|
||||||
market_order = self.broker.new_market_order(self.status.get_pair(),partial_filled_amount,"sell",amount_in_base=True)
|
market_order = self.broker.new_market_order(self.status.get_pair(),partial_filled_amount,"sell",amount_in_base=True)
|
||||||
#Wait for it to be filled
|
time.sleep(self.broker.get_wait_time()*2)
|
||||||
tries = self.broker.get_retries()
|
tries = self.broker.get_retries()
|
||||||
while True:
|
while True:
|
||||||
time.sleep(self.broker.get_wait_time())
|
|
||||||
partial_fill_order = self.broker.get_order(market_order["id"],self.status.get_pair())
|
partial_fill_order = self.broker.get_order(market_order["id"],self.status.get_pair())
|
||||||
if partial_fill_order["status"]=="closed":
|
if partial_fill_order["status"]=="closed":
|
||||||
avg_buy_price = sum(partial_filled_price)/len(partial_filled_price)
|
avg_buy_price = sum(partial_filled_price)/len(partial_filled_price)
|
||||||
|
|
@ -809,6 +804,7 @@ class trader:
|
||||||
self.status.set_partial_profit(self.status.get_partial_profit()+partial_profit)
|
self.status.set_partial_profit(self.status.get_partial_profit()+partial_profit)
|
||||||
break
|
break
|
||||||
tries-=1
|
tries-=1
|
||||||
|
time.sleep(self.broker.get_wait_time())
|
||||||
if tries==0:
|
if tries==0:
|
||||||
self.broker.logger.log_this("Partial fill sell order not filling.",1,self.status.get_pair())
|
self.broker.logger.log_this("Partial fill sell order not filling.",1,self.status.get_pair())
|
||||||
break
|
break
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue