Skip to content

Commit 894a0b5

Browse files
committed
Improved order validation after restart or after external order change
1 parent 1b90e02 commit 894a0b5

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

Bot/Strategy/TradingStrategy.py

+27-20
Original file line numberDiff line numberDiff line change
@@ -86,46 +86,53 @@ def on_execution_rpt(self, data):
8686
def on_order_status_changed(self, t: Target, data):
8787
pass
8888

89-
# TODO: schedule validation once in some time
9089
def validate_target_orders(self, force_cancel_open_orders=False):
90+
NEW_STATUSES = [FXConnector.ORDER_STATUS_NEW, FXConnector.ORDER_STATUS_PARTIALLY_FILLED]
91+
9192
try:
92-
orders_dict = self.fx.get_all_orders(self.symbol())
93+
exchange_orders = self.fx.get_all_orders(self.symbol())
94+
has_open_orders = any([eo['status'] in NEW_STATUSES for eo in exchange_orders.values()])
95+
9396
except BinanceAPIException as bae:
9497
self.logError(str(bae))
9598
return
9699

97-
tgts = self.trade.get_all_active_placed_targets()
100+
active_trade_targets = self.trade.get_all_active_placed_targets()
98101

99102
update_required = False
100-
if force_cancel_open_orders or len(tgts) == 0:
103+
if force_cancel_open_orders or (len(active_trade_targets) == 0 and has_open_orders):
104+
self.logInfo('Cancelling all Open orders')
101105
self.fx.cancel_open_orders(self.symbol())
102106
else:
103-
for t in tgts:
104-
if t.id not in orders_dict:
105-
t.set_canceled()
107+
for active_trade_target in active_trade_targets:
108+
109+
if active_trade_target.id not in exchange_orders:
110+
active_trade_target.set_canceled()
106111
update_required = True
107112
else:
108-
s = orders_dict[t.id]['status']
109-
if s == 'NEW':
110-
if not PriceHelper.is_float_price(t.price) or (
111-
self.exchange_info.adjust_price(t.price) not in(float(orders_dict[t.id]['price']),
112-
float(orders_dict[t.id]['stop_price']))):
113-
self.logInfo('Target price changed: {}'.format(t))
114-
self.fx.cancel_order(self.symbol(), t.id)
115-
t.set_canceled()
116-
update_required |= True
117-
118-
update_required |= self._update_trade_target_status_change(t, s)
113+
s = exchange_orders[active_trade_target.id]['status']
114+
if s in NEW_STATUSES:
115+
if not PriceHelper.is_float_price(active_trade_target.price) or (
116+
self.exchange_info.adjust_price(active_trade_target.price) not in(float(exchange_orders[active_trade_target.id]['price']),
117+
float(exchange_orders[active_trade_target.id]['stop_price']))):
118+
self.logInfo('Target price changed: {}'.format(active_trade_target))
119+
self.fx.cancel_order(self.symbol(), active_trade_target.id)
120+
active_trade_target.set_canceled()
121+
update_required = True
122+
123+
update_required |= self._update_trade_target_status_change(active_trade_target, s)
119124

120125
if update_required:
121126
self.trigger_target_updated()
122127

123128
def _update_trade_target_status_change(self, t: Target, status: str) -> bool:
124-
if status == 'FILLED':
129+
if status == FXConnector.ORDER_STATUS_FILLED:
125130
t.set_completed()
126131
return True
127132

128-
if status in ['CANCELED', 'REJECTED', 'EXPIRED']:
133+
if status in [FXConnector.ORDER_STATUS_CANCELED,
134+
FXConnector.ORDER_STATUS_REJECTED,
135+
FXConnector.ORDER_STATUS_EXPIRED]:
129136
t.set_canceled()
130137
return True
131138

0 commit comments

Comments
 (0)