@@ -68,6 +68,80 @@ async def test_apply_inactive_orders(swap_strategy, simulated_trader):
6868 assert swap_strategy .is_priority_order .call_count == 3
6969 assert set_as_inactive_mock .call_count == 2
7070
71+ # Test with trigger_above_by_order_id parameter
72+ swap_strategy .is_priority_order = mock .Mock (side_effect = lambda o : o .order_type is enums .TraderOrderType .STOP_LOSS )
73+ with mock .patch .object (personal_data .Order , "set_as_inactive" , mock .AsyncMock ()) as set_as_inactive_mock , \
74+ mock .patch .object (personal_data .Order , "update" , mock .Mock ()) as update_mock :
75+ stop_loss = created_order (personal_data .StopLossLimitOrder , enums .TraderOrderType .STOP_LOSS ,
76+ trader_instance , side = enums .TradeOrderSide .SELL )
77+ stop_loss .trigger_above = False
78+ stop_loss .order_id = "stop_loss_id"
79+ stop_loss .get_filling_price = mock .Mock (return_value = decimal .Decimal ("100" ))
80+
81+ sell_limit = created_order (personal_data .SellLimitOrder , enums .TraderOrderType .SELL_LIMIT ,
82+ trader_instance , side = enums .TradeOrderSide .SELL )
83+ sell_limit .trigger_above = True
84+ sell_limit .order_id = "sell_limit_id"
85+ sell_limit .get_filling_price = mock .Mock (return_value = decimal .Decimal ("200" ))
86+
87+ buy_limit = created_order (personal_data .SellLimitOrder , enums .TraderOrderType .BUY_LIMIT ,
88+ trader_instance , side = enums .TradeOrderSide .SELL )
89+ buy_limit .trigger_above = False
90+ buy_limit .order_id = "buy_limit_id"
91+ buy_limit .get_filling_price = mock .Mock (return_value = decimal .Decimal ("300" ))
92+
93+ # Test: trigger_above_by_order_id overrides order's trigger_above
94+ trigger_above_by_order_id = {
95+ "stop_loss_id" : True , # Override False to True
96+ "sell_limit_id" : False , # Override True to False
97+ # buy_limit_id not in dict, should use its own trigger_above (False)
98+ }
99+ await swap_strategy .apply_inactive_orders ([stop_loss , sell_limit , buy_limit ],
100+ trigger_above_by_order_id = trigger_above_by_order_id )
101+
102+ # Verify priority order (stop_loss) gets active_trigger with overridden trigger_above=True
103+ assert update_mock .call_count == 1
104+ update_call_kwargs = update_mock .call_args [1 ]
105+ assert "active_trigger" in update_call_kwargs
106+ active_trigger = update_call_kwargs ["active_trigger" ]
107+ assert active_trigger .trigger_above is True # Overridden from False to True
108+
109+ # Verify non-priority orders (sell_limit, buy_limit) get set_as_inactive with correct trigger_above
110+ assert set_as_inactive_mock .call_count == 2
111+ assert set_as_inactive_mock .call_args_list [0 ][0 ][0 ].trigger_above is False # sell_limit order's trigger_above is overridden from True to False
112+ assert set_as_inactive_mock .call_args_list [0 ][0 ][0 ].trigger_price == decimal .Decimal ("200" ) # sell_limit order's trigger_price
113+ assert set_as_inactive_mock .call_args_list [1 ][0 ][0 ].trigger_above is False # buy limit order's trigger_above's origin value
114+ assert set_as_inactive_mock .call_args_list [1 ][0 ][0 ].trigger_price == decimal .Decimal ("300" ) # buy_limit order's trigger_price
115+
116+ # Test: trigger_above_by_order_id is None, should use order's trigger_above
117+ swap_strategy .is_priority_order = mock .Mock (side_effect = lambda o : o .order_type is enums .TraderOrderType .STOP_LOSS )
118+ with mock .patch .object (personal_data .Order , "set_as_inactive" , mock .AsyncMock ()) as set_as_inactive_mock , \
119+ mock .patch .object (personal_data .Order , "update" , mock .Mock ()) as update_mock :
120+ stop_loss = created_order (personal_data .StopLossLimitOrder , enums .TraderOrderType .STOP_LOSS ,
121+ trader_instance , side = enums .TradeOrderSide .SELL )
122+ stop_loss .trigger_above = True
123+ stop_loss .order_id = "stop_loss_id"
124+ stop_loss .get_filling_price = mock .Mock (return_value = decimal .Decimal ("100" ))
125+
126+ sell_limit = created_order (personal_data .SellLimitOrder , enums .TraderOrderType .SELL_LIMIT ,
127+ trader_instance , side = enums .TradeOrderSide .SELL )
128+ sell_limit .trigger_above = False
129+ sell_limit .order_id = "sell_limit_id"
130+ sell_limit .get_filling_price = mock .Mock (return_value = decimal .Decimal ("200" ))
131+
132+ await swap_strategy .apply_inactive_orders ([stop_loss , sell_limit ],
133+ trigger_above_by_order_id = None )
134+
135+ # Verify priority order uses its own trigger_above=True
136+ assert update_mock .call_count == 1
137+ update_call_kwargs = update_mock .call_args [1 ]
138+ active_trigger = update_call_kwargs ["active_trigger" ]
139+ assert active_trigger .trigger_above is True # Uses order's own value
140+
141+ # Verify non-priority order uses its own trigger_above=False
142+ assert set_as_inactive_mock .call_count == 1
143+ assert sell_limit .trigger_above is False # Uses order's own value
144+
71145
72146
73147async def test_execute_no_reverse (swap_strategy , simulated_trader ):
0 commit comments