@@ -86,46 +86,53 @@ def on_execution_rpt(self, data):
86
86
def on_order_status_changed (self , t : Target , data ):
87
87
pass
88
88
89
- # TODO: schedule validation once in some time
90
89
def validate_target_orders (self , force_cancel_open_orders = False ):
90
+ NEW_STATUSES = [FXConnector .ORDER_STATUS_NEW , FXConnector .ORDER_STATUS_PARTIALLY_FILLED ]
91
+
91
92
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
+
93
96
except BinanceAPIException as bae :
94
97
self .logError (str (bae ))
95
98
return
96
99
97
- tgts = self .trade .get_all_active_placed_targets ()
100
+ active_trade_targets = self .trade .get_all_active_placed_targets ()
98
101
99
102
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' )
101
105
self .fx .cancel_open_orders (self .symbol ())
102
106
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 ()
106
111
update_required = True
107
112
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 )
119
124
120
125
if update_required :
121
126
self .trigger_target_updated ()
122
127
123
128
def _update_trade_target_status_change (self , t : Target , status : str ) -> bool :
124
- if status == 'FILLED' :
129
+ if status == FXConnector . ORDER_STATUS_FILLED :
125
130
t .set_completed ()
126
131
return True
127
132
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 ]:
129
136
t .set_canceled ()
130
137
return True
131
138
0 commit comments