@@ -958,6 +958,7 @@ async def test_chained_stop_loss_and_take_profit_orders(tools):
958958 assert stop_order .associated_entry_ids == [buy_order .order_id ]
959959 assert stop_order .tag == "super"
960960 assert stop_order .reduce_only is False
961+ assert stop_order .trailing_profile is None
961962 assert stop_order .is_open ()
962963
963964 state = trading_enums .EvaluatorStates .LONG .value
@@ -977,6 +978,7 @@ async def test_chained_stop_loss_and_take_profit_orders(tools):
977978 assert take_profit_order .origin_price == decimal .Decimal ("100000" )
978979 assert take_profit_order .is_waiting_for_chained_trigger
979980 assert take_profit_order .associated_entry_ids == [buy_order .order_id ]
981+ assert take_profit_order .trailing_profile is None
980982 assert not take_profit_order .is_open ()
981983 assert not take_profit_order .is_created ()
982984 assert take_profit_order .reduce_only is False
@@ -998,6 +1000,7 @@ async def test_chained_stop_loss_and_take_profit_orders(tools):
9981000 assert not take_profit_order .is_open ()
9991001 assert not take_profit_order .is_created ()
10001002 assert take_profit_order .reduce_only is False
1003+ assert take_profit_order .trailing_profile is None
10011004
10021005 # stop loss and take profit
10031006 data = {
@@ -1015,6 +1018,7 @@ async def test_chained_stop_loss_and_take_profit_orders(tools):
10151018 assert stop_order .origin_price == decimal .Decimal ("123" )
10161019 assert stop_order .is_waiting_for_chained_trigger
10171020 assert stop_order .associated_entry_ids == [buy_order .order_id ]
1021+ assert stop_order .trailing_profile is None
10181022 assert not take_profit_order .is_open ()
10191023 assert not take_profit_order .is_created ()
10201024 take_profit_order = buy_order .chained_orders [1 ]
@@ -1029,6 +1033,7 @@ async def test_chained_stop_loss_and_take_profit_orders(tools):
10291033 assert take_profit_order .reduce_only is False
10301034 assert isinstance (stop_order .order_group , trading_personal_data .OneCancelsTheOtherOrderGroup )
10311035 assert take_profit_order .order_group is stop_order .order_group
1036+ assert take_profit_order .trailing_profile is None
10321037
10331038 # stop loss and take profit but decreasing position size: create stop loss and no take profit
10341039 # (this initial order is a take profit already)
@@ -1050,6 +1055,7 @@ async def test_chained_stop_loss_and_take_profit_orders(tools):
10501055 assert stop_loss .chained_orders == []
10511056 assert stop_loss .reduce_only is True # True as force stop loss
10521057 assert stop_loss .origin_price == decimal .Decimal ("123" )
1058+ assert stop_loss .trailing_profile is None
10531059 assert stop_loss .origin_quantity == decimal .Decimal ("0.01" ) \
10541060 - trading_personal_data .get_fees_for_currency (sell_limit .fee , stop_loss .quantity_currency )
10551061
@@ -1087,11 +1093,12 @@ async def test_chained_multiple_take_profit_orders(tools):
10871093 assert not take_profit_order .is_open ()
10881094 assert not take_profit_order .is_created ()
10891095 assert take_profit_order .update_with_triggering_order_fees == is_last
1096+ assert take_profit_order .trailing_profile is None
10901097
10911098 # only 2 additional (2 in total)
10921099 data = {
10931100 consumer .ADDITIONAL_TAKE_PROFIT_PRICES_KEY : [decimal .Decimal ("110000" ), decimal .Decimal ("120000" )],
1094- consumer .VOLUME_KEY : decimal .Decimal ("0.01" ),
1101+ consumer .VOLUME_KEY : decimal .Decimal ("0.01" ), consumer . TRAILING_PROFILE : None
10951102 }
10961103 orders_with_tps = await consumer .create_new_orders (symbol , decimal .Decimal (str (- 1 )), state , data = data )
10971104 buy_order = orders_with_tps [0 ]
@@ -1110,6 +1117,7 @@ async def test_chained_multiple_take_profit_orders(tools):
11101117 assert not take_profit_order .is_open ()
11111118 assert not take_profit_order .is_created ()
11121119 assert take_profit_order .update_with_triggering_order_fees == is_last
1120+ assert take_profit_order .trailing_profile is None
11131121
11141122 # stop loss and 1 take profit and 5 additional (6 TP in total)
11151123 tp_prices = [
@@ -1134,6 +1142,7 @@ async def test_chained_multiple_take_profit_orders(tools):
11341142 assert stop_order .is_waiting_for_chained_trigger
11351143 assert stop_order .associated_entry_ids == [buy_order .order_id ]
11361144 assert stop_order .update_with_triggering_order_fees is True
1145+ assert stop_order .trailing_profile is None
11371146 assert len (buy_order .chained_orders [1 :]) == len (tp_prices )
11381147 for i , take_profit_order in enumerate (buy_order .chained_orders [1 :]):
11391148 is_last = i == len (buy_order .chained_orders [1 :]) - 1
@@ -1150,6 +1159,64 @@ async def test_chained_multiple_take_profit_orders(tools):
11501159 assert isinstance (stop_order .order_group , trading_personal_data .BalancedTakeProfitAndStopOrderGroup )
11511160 assert take_profit_order .order_group is stop_order .order_group
11521161 assert take_profit_order .update_with_triggering_order_fees == is_last
1162+ assert take_profit_order .trailing_profile is None
1163+
1164+
1165+ async def test_chained_multiple_take_profit_with_filled_tp_trailing_stop_orders (tools ):
1166+ exchange_manager , trader , symbol , consumer , last_btc_price = tools
1167+
1168+ # with BTC/USDT
1169+ exchange_manager .exchange_personal_data .portfolio_manager .portfolio_value_holder .value_converter .last_prices_by_trading_pair [symbol ] = \
1170+ last_btc_price
1171+ exchange_manager .exchange_personal_data .portfolio_manager .portfolio_value_holder .portfolio_current_value = \
1172+ decimal .Decimal (str (10 + 1000 / last_btc_price ))
1173+
1174+ state = trading_enums .EvaluatorStates .LONG .value
1175+ # stop loss and 1 take profit and 5 additional (6 TP in total)
1176+ tp_prices = [
1177+ decimal .Decimal ("100012" ),
1178+ decimal .Decimal ("110000" ), decimal .Decimal ("120000" ), decimal .Decimal ("130000" ),
1179+ decimal .Decimal ("140000" ), decimal .Decimal ("150000" )
1180+ ]
1181+ data = {
1182+ consumer .STOP_PRICE_KEY : decimal .Decimal ("123" ),
1183+ consumer .TAKE_PROFIT_PRICE_KEY : tp_prices [0 ],
1184+ consumer .ADDITIONAL_TAKE_PROFIT_PRICES_KEY : tp_prices [1 :],
1185+ consumer .VOLUME_KEY : decimal .Decimal ("0.01" ),
1186+ consumer .TRAILING_PROFILE : trading_personal_data .TrailingProfileTypes .FILLED_TAKE_PROFIT .value ,
1187+ }
1188+ orders_with_tp = await consumer .create_new_orders (symbol , decimal .Decimal (str (0.4 )), state , data = data )
1189+ buy_order = orders_with_tp [0 ]
1190+ assert len (buy_order .chained_orders ) == 1 + len (tp_prices )
1191+ stop_order = buy_order .chained_orders [0 ]
1192+ assert isinstance (stop_order , trading_personal_data .StopLossOrder )
1193+ assert stop_order .origin_quantity == decimal .Decimal ("0.01" ) \
1194+ - trading_personal_data .get_fees_for_currency (buy_order .fee , stop_order .quantity_currency )
1195+ assert stop_order .origin_price == decimal .Decimal ("123" )
1196+ assert stop_order .is_waiting_for_chained_trigger
1197+ assert stop_order .associated_entry_ids == [buy_order .order_id ]
1198+ assert stop_order .update_with_triggering_order_fees is True
1199+ assert stop_order .trailing_profile == trading_personal_data .FilledTakeProfitTrailingProfile ([
1200+ trading_personal_data .TrailingPriceStep (float (trailing_price ), float (trigger_price ), True )
1201+ for trailing_price , trigger_price in zip ([buy_order .origin_price ] + tp_prices [:- 1 ], tp_prices )
1202+ ])
1203+ assert len (buy_order .chained_orders [1 :]) == len (tp_prices )
1204+ for i , take_profit_order in enumerate (buy_order .chained_orders [1 :]):
1205+ is_last = i == len (buy_order .chained_orders [1 :]) - 1
1206+ assert isinstance (take_profit_order , trading_personal_data .SellLimitOrder )
1207+ assert take_profit_order .origin_quantity == (
1208+ decimal .Decimal ("0.01" )
1209+ - trading_personal_data .get_fees_for_currency (buy_order .fee , take_profit_order .quantity_currency )
1210+ ) / decimal .Decimal (str (len (tp_prices )))
1211+ assert take_profit_order .origin_price == tp_prices [i ]
1212+ assert take_profit_order .is_waiting_for_chained_trigger
1213+ assert take_profit_order .associated_entry_ids == [buy_order .order_id ]
1214+ assert not take_profit_order .is_open ()
1215+ assert not take_profit_order .is_created ()
1216+ assert isinstance (stop_order .order_group , trading_personal_data .TrailingOnFilledTPBalancedOrderGroup )
1217+ assert take_profit_order .order_group is stop_order .order_group
1218+ assert take_profit_order .update_with_triggering_order_fees == is_last
1219+ assert take_profit_order .trailing_profile is None
11531220
11541221
11551222async def test_create_stop_loss_orders (tools ):
0 commit comments