Skip to content

Commit 3a2c24e

Browse files
committed
[Order] handle is_synchronization_enabled for tasks and group sync
1 parent 2fa7199 commit 3a2c24e

File tree

5 files changed

+36
-8
lines changed

5 files changed

+36
-8
lines changed

octobot_trading/personal_data/orders/order.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,8 @@ async def _ensure_inactive_order_watcher(self):
477477
if self.active_trigger is None:
478478
logging.get_logger(self.get_logger_name()).error("self.active_trigger is None")
479479
return
480-
await self.active_trigger.create_watcher(self.exchange_manager, self.symbol, self.creation_time)
480+
if self.is_synchronization_enabled():
481+
await self.active_trigger.create_watcher(self.exchange_manager, self.symbol, self.creation_time)
481482

482483
@contextlib.contextmanager
483484
def order_state_creation(self):
@@ -1042,6 +1043,12 @@ def _update_taker_maker(self):
10421043
else enums.ExchangeConstantsMarketPropertyColumns.MAKER
10431044
).value
10441045

1046+
def is_synchronization_enabled(self):
1047+
return (
1048+
self.exchange_manager is not None and
1049+
self.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization
1050+
)
1051+
10451052
def to_dict(self):
10461053
filled_price = self.filled_price if self.filled_price > 0 else self.origin_price
10471054
return {

octobot_trading/personal_data/orders/order_group.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,14 @@ async def enable(self, enabled):
8080
def get_group_open_orders(self):
8181
return [
8282
order
83-
for order in self.orders_manager.get_order_from_group(self.name)
84-
if order.is_open() and not order.is_cancelling()
83+
for order in (
84+
open_order
85+
for open_order in self.orders_manager.get_order_from_group(self.name)
86+
if open_order.is_open() and not (open_order.is_cancelling())
87+
)
88+
# when is_synchronization_enabled is disabled, orders' state might not be set and executed, also ensure
89+
# orders are not filled or closed
90+
if order.is_synchronization_enabled() or not (order.is_filled() or order.is_closed())
8591
]
8692

8793
def clear(self):

octobot_trading/personal_data/orders/order_state.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,7 @@ def ensure_not_cleared(order):
152152
raise octobot_trading.errors.InvalidOrderState(f"Order has already been cleared. Order: {order}")
153153

154154
def _is_synchronization_enabled(self):
155-
return (
156-
self.order.exchange_manager is not None and
157-
self.order.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization
158-
)
155+
return self.order.is_synchronization_enabled()
159156

160157
def clear(self):
161158
"""

octobot_trading/personal_data/orders/types/limit/limit_order.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ def _create_hit_event(self, price_time):
8585
new_event(self.origin_price, price_time, self.trigger_above, self.allow_instant_fill)
8686

8787
def _create_hit_task(self):
88-
self.wait_for_hit_event_task = asyncio.create_task(self.wait_for_price_hit())
88+
if self.is_synchronization_enabled():
89+
self.wait_for_hit_event_task = asyncio.create_task(self.wait_for_price_hit())
8990

9091
def _reset_events(self, price_time):
9192
"""

tests/personal_data/orders/test_order.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,23 @@ async def test_ensure_inactive_order_watcher_and_sub_functions(trader_simulator)
599599
assert base_order.active_trigger._trigger_task is None
600600
assert len(exchange_manager_inst.exchange_symbols_data.get_exchange_symbol_data(base_order.symbol).price_events_manager.events) == 0
601601

602+
base_order = personal_data.Order(trader_inst)
603+
base_order.is_active = False
604+
assert base_order.active_trigger is None
605+
base_order.use_active_trigger(order_util.create_order_price_trigger(base_order, decimal.Decimal(1), True))
606+
# now is_synchronization_enabled returns False
607+
exchange_manager_inst.exchange_personal_data.orders_manager.enable_order_auto_synchronization = False
608+
await base_order._ensure_inactive_order_watcher()
609+
assert base_order.active_trigger._trigger_event is None
610+
assert base_order.active_trigger._trigger_task is None
611+
assert len(exchange_manager_inst.exchange_symbols_data.get_exchange_symbol_data(base_order.symbol).price_events_manager.events) == 0
612+
613+
base_order.clear()
614+
# event and task are removed
615+
assert base_order.active_trigger._trigger_event is None
616+
assert base_order.active_trigger._trigger_task is None
617+
assert len(exchange_manager_inst.exchange_symbols_data.get_exchange_symbol_data(base_order.symbol).price_events_manager.events) == 0
618+
602619

603620
def test_should_become_active(trader_simulator):
604621
config, exchange_manager_inst, trader_inst = trader_simulator

0 commit comments

Comments
 (0)