@@ -704,8 +704,6 @@ def place_market_order(
704704 "type" : "MARKET" ,
705705 "quantity" : self ._dec_str (q_dec , strict_precision = qty_precision ),
706706 }
707- if reduce_only :
708- params ["reduceOnly" ] = "true"
709707 client_order_id_norm = self ._format_client_order_id (client_order_id )
710708 if client_order_id_norm :
711709 params ["newClientOrderId" ] = client_order_id_norm
@@ -722,6 +720,10 @@ def place_market_order(
722720 # Unknown mode: try without positionSide first; we may retry on -4061.
723721 params .pop ("positionSide" , None )
724722
723+ # reduceOnly after positionSide: in hedge mode, Binance returns -1106 if both are sent.
724+ if reduce_only and not (dual_side is True and params .get ("positionSide" ) in ("LONG" , "SHORT" )):
725+ params ["reduceOnly" ] = "true"
726+
725727 try :
726728 raw = self ._signed_request ("POST" , "/fapi/v1/order" , params = params )
727729 except LiveTradingError as e :
@@ -747,6 +749,7 @@ def place_market_order(
747749 else :
748750 # Likely hedge mode; retry with inferred positionSide.
749751 params2 ["positionSide" ] = (pos_norm if pos_norm in ("LONG" , "SHORT" ) else self ._infer_position_side (side = sd , reduce_only = reduce_only ))
752+ params2 .pop ("reduceOnly" , None )
750753 try :
751754 raw = self ._signed_request ("POST" , "/fapi/v1/order" , params = params2 )
752755 self ._dual_side_cache = (time .time (), True )
@@ -843,8 +846,6 @@ def place_limit_order(
843846 "quantity" : self ._dec_str (q_dec , strict_precision = qty_precision ),
844847 "price" : self ._dec_str (px_dec ),
845848 }
846- if reduce_only :
847- params ["reduceOnly" ] = "true"
848849 client_order_id_norm = self ._format_client_order_id (client_order_id )
849850 if client_order_id_norm :
850851 params ["newClientOrderId" ] = client_order_id_norm
@@ -857,6 +858,9 @@ def place_limit_order(
857858 params .pop ("positionSide" , None )
858859 else :
859860 params .pop ("positionSide" , None )
861+
862+ if reduce_only and not (dual_side is True and params .get ("positionSide" ) in ("LONG" , "SHORT" )):
863+ params ["reduceOnly" ] = "true"
860864 try :
861865 raw = self ._signed_request ("POST" , "/fapi/v1/order" , params = params )
862866 except LiveTradingError as e :
@@ -878,6 +882,7 @@ def place_limit_order(
878882 pass
879883 else :
880884 params2 ["positionSide" ] = (pos_norm if pos_norm in ("LONG" , "SHORT" ) else self ._infer_position_side (side = sd , reduce_only = reduce_only ))
885+ params2 .pop ("reduceOnly" , None )
881886 try :
882887 raw = self ._signed_request ("POST" , "/fapi/v1/order" , params = params2 )
883888 self ._dual_side_cache = (time .time (), True )
0 commit comments