@@ -698,7 +698,7 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera
698698@pytest .mark .parametrize ("leverage" , [1 , 2 ])
699699@pytest .mark .parametrize ("is_short" , [False , True ])
700700def test_dca_handle_similar_open_order (
701- default_conf_usdt , ticker_usdt , is_short , leverage , fee , mocker
701+ default_conf_usdt , ticker_usdt , is_short , leverage , fee , mocker , caplog
702702) -> None :
703703 default_conf_usdt ["position_adjustment_enable" ] = True
704704 default_conf_usdt ["trading_mode" ] = "futures"
@@ -720,6 +720,7 @@ def test_dca_handle_similar_open_order(
720720 patch_get_signal (freqtrade , enter_short = is_short , enter_long = not is_short )
721721 freqtrade .strategy .custom_entry_price = lambda ** kwargs : ticker_usdt ["ask" ] * 0.96
722722 freqtrade .strategy .leverage = MagicMock (return_value = leverage )
723+ freqtrade .strategy .custom_exit = MagicMock (return_value = False )
723724 freqtrade .strategy .minimal_roi = {0 : 0.2 }
724725
725726 # Create trade and initial entry order
@@ -729,7 +730,13 @@ def test_dca_handle_similar_open_order(
729730 trade : Trade = Trade .get_trades ().first ()
730731 assert len (trade .orders ) == 1
731732 assert trade .orders [- 1 ].side == trade .entry_side
733+ assert trade .orders [- 1 ].status == "open"
734+
732735 assert trade .has_open_orders
736+ # Process - shouldn't do anything
737+ freqtrade .process ()
738+ # Doesn't try to exit, as we're not in a position yet
739+ assert freqtrade .strategy .custom_exit .call_count == 0
733740
734741 # Adjust with new price, cancel initial entry order and place new one
735742 freqtrade .strategy .adjust_entry_price = MagicMock (return_value = 1.99 )
@@ -750,9 +757,17 @@ def test_dca_handle_similar_open_order(
750757 assert len (trade .orders ) == 3
751758
752759 # Fill entry order
760+ assert freqtrade .strategy .custom_exit .call_count == 0
761+
753762 mocker .patch (f"{ EXMS } ._dry_is_price_crossed" , return_value = True )
754763 freqtrade .process ()
755764
765+ trade = Trade .get_trades ().first ()
766+ assert trade .amount > 0
767+
768+ assert freqtrade .strategy .custom_exit .call_count == 1
769+ freqtrade .strategy .custom_exit .reset_mock ()
770+
756771 # Should Create a new exit order
757772 freqtrade .exchange .amount_to_contract_precision = MagicMock (return_value = 2 )
758773 freqtrade .strategy .adjust_trade_position = MagicMock (return_value = - 2 )
@@ -765,27 +780,40 @@ def test_dca_handle_similar_open_order(
765780 assert trade .orders [- 1 ].status == "open"
766781 assert trade .orders [- 1 ].side == trade .exit_side
767782 assert len (trade .orders ) == 5
783+ assert freqtrade .strategy .custom_exit .call_count == 1
784+ freqtrade .strategy .custom_exit .reset_mock ()
768785
769786 # Adjust with new exit amount, should cancel and replace existing exit order
770787 freqtrade .exchange .amount_to_contract_precision = MagicMock (return_value = 3 )
771788 freqtrade .strategy .adjust_trade_position = MagicMock (return_value = - 3 )
772789 freqtrade .process ()
773790 trade = Trade .get_trades ().first ()
791+ # Even with open order, trying to exit...
792+ assert freqtrade .strategy .custom_exit .call_count == 1
793+ freqtrade .strategy .custom_exit .reset_mock ()
774794
775795 assert trade .orders [- 2 ].status == "canceled"
776796 assert len (trade .orders ) == 6
777797
778798 # Adjust with new exit price, should cancel and replace existing exit order
779799 freqtrade .strategy .custom_exit_price = MagicMock (return_value = 1.95 )
780800 freqtrade .process ()
801+ # Even with open order, trying to exit...
802+ assert freqtrade .strategy .custom_exit .call_count == 1
803+ freqtrade .strategy .custom_exit .reset_mock ()
804+
781805 trade = Trade .get_trades ().first ()
782806
783807 assert trade .orders [- 2 ].status == "canceled"
784808 assert len (trade .orders ) == 7
809+ similar_msg = r"A similar open order was found for.*"
810+
811+ assert not log_has_re (similar_msg , caplog )
785812
786813 # Adjust with same params, should keep existing order as price and amount are similar
787814 freqtrade .strategy .custom_exit_price = MagicMock (return_value = 1.95 )
788815 freqtrade .process ()
789816 trade = Trade .get_trades ().first ()
817+ assert log_has_re (similar_msg , caplog )
790818
791819 assert len (trade .orders ) == 7
0 commit comments