You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Binance Futures API创建Stop Market订单异常:仅生成首单后续失败求助

Binance期货API下单问题排查求助

尝试通过Binance API创建和网页端一致的止损市价单(Stop Market),但频繁失败。少数成功的场景里,仅能生成首个止损市价单,后续的止损(Stop Loss)和止盈(Take Profit)订单都无法创建。报错信息无明确文档可查,附上相关代码求排查。

期货订单处理类代码

from binance.client import Client
from binance.enums import *
from binance.exceptions import BinanceAPIException, BinanceOrderException
from helpers import custom_exceptions


class BinanceApi:
    def __init__(self, key: str, secret: str) -> None:
        """
        Class to incorporate and handle the Binance Futures API using the python-binance library.
        @param key: API Key
        @param secret: API Secret
        """
        try:
            self.client = Client(api_key=key, api_secret=secret)
        except (BinanceAPIException, BinanceOrderException) as e:
            raise custom_exceptions.BinanceClientErrorException(str(e))

    def stop_market_order(self, symbol: str, side: str, quantity: float, stop_price: float, reduce_only: bool = False) -> dict:
        """
        Method to create a stop market order.
        @param symbol: The trading pair symbol (e.g., 'BTCUSDT').
        @param side: BUY or SELL.
        @param quantity: The quantity to trade.
        @param stop_price: The price that triggers the market order.
        @param reduce_only: If True, order will only reduce the position size.
        @return: Response from Binance API as a dictionary.
        """
        try:
            response = self.client.futures_create_order(
                symbol=symbol,
                side=side,
                quantity=quantity,
                reduceOnly=reduce_only,
                type=FUTURE_ORDER_TYPE_STOP_MARKET,
                stopPrice=stop_price,
                priceProtect=True
            )
            return response
        except (BinanceAPIException, BinanceOrderException) as e:
            raise custom_exceptions.BinanceClientErrorException(str(e))

    def take_profit_order(self, symbol: str, side: str, quantity: float, price: float, stop_price: float, reduce_only: bool = False) -> dict:
        """
        Method to create a take profit order.
        @param symbol: The trading pair symbol (e.g., 'BTCUSDT').
        @param side: BUY or SELL.
        @param quantity: The quantity to trade.
        @param price: The price at which the order should execute.
        @param stop_price: The price that triggers the take profit order.
        @param reduce_only: If True, order will only reduce the position size.
        @return: Response from Binance API as a dictionary.
        """
        try:
            response = self.client.futures_create_order(
                symbol=symbol,
                side=side,
                quantity=quantity,
                price=price,
                stopPrice=stop_price,
                reduceOnly=reduce_only,
                priceProtect=True,
                type=FUTURE_ORDER_TYPE_TAKE_PROFIT,
                timeInForce=TIME_IN_FORCE_GTC,
                workingType='MARK_PRICE'
            )
            return response
        except (BinanceAPIException, BinanceOrderException) as e:
            raise custom_exceptions.BinanceClientErrorException(str(e))

    def stop_loss_order(self, symbol: str, side: str, quantity: float, stop_price: float, reduce_only: bool = False) -> dict:
        """
        Method to create a stop loss order.
        @param symbol: The trading pair symbol (e.g., 'BTCUSDT').
        @param side: BUY or SELL.
        @param quantity: The quantity to trade.
        @param stop_price: The price that triggers the stop loss order.
        @param reduce_only: If True, order will only reduce the position size.
        @return: Response from Binance API as a dictionary.
        """
        try:
            response = self.client.futures_create_order(
                symbol=symbol,
                side=side,
                quantity=quantity,
                stopPrice=stop_price,
                reduceOnly=reduce_only,
                priceProtect=True,
                type=FUTURE_ORDER_TYPE_STOP_MARKET,
                timeInForce=TIME_IN_FORCE_GTC,
                workingType='MARK_PRICE'
            )
            return response
        except (BinanceAPIException, BinanceOrderException) as e:
            raise custom_exceptions.BinanceClientErrorException(str(e))

    def cancel_all_orders(self, symbol: str) -> dict:
        """
        Method to cancel all open orders for a specific symbol.
        @param symbol: The trading pair symbol (e.g., 'BTCUSDT').
        @return: Response from Binance API as a dictionary.
        """
        try:
            response = self.client.futures_cancel_all_open_orders(symbol=symbol)
            return response
        except (BinanceAPIException, BinanceOrderException) as e:
            raise custom_exceptions.BinanceClientErrorException(str(e))

客户端调用逻辑

stop_market_order = self.binance_api.stop_market_order(
            symbol=symbol,
            side=side,
            stop_price=stop_price,
            quantity=quantity,
            reduce_only=False,
        )

if stop_market_order:
    print("Stop market order created")
    print(stop_market_order)

    stop_loss_order = self.binance_api.stop_loss_order(
        symbol=symbol,
        side="BUY" if "SELL" in side else "SELL",
        quantity=quantity,
        stop_price=tp_price,
        reduce_only=True
    )

    if stop_loss_order:
        print("Stop loss order created")
        print(stop_loss_order)

        take_profit_order = self.binance_api.take_profit_order(
            symbol=symbol,
            side=side,
            quantity=quantity,
            stop_price=sl_price,
            price=sl_price,
            reduce_only=True
        )

        if take_profit_order:
            print("Take profit order created")
            print(take_profit_order)
            return True
        else:
            return False

    else:
        return False

else:
    return False

核心排查点与修正方案

1. 参数传递逻辑错误

  • 调用止损单时,误将tp_price(止盈价)传给stop_price;调用止盈单时,误将sl_price(止损价)传给stop_price,触发条件完全颠倒,Binance会直接拒绝这类不符合交易逻辑的订单,需修正参数对应关系。
  • 止盈单方向错误:止盈是平仓操作,方向必须和开仓方向相反,当前代码直接沿用开仓side,会导致反向开仓而非平仓,需修正为side="BUY" if "SELL" in side else "SELL"。

2. 订单类型与参数不匹配

  • 当前take_profit_order使用FUTURE_ORDER_TYPE_TAKE_PROFIT(限价止盈),需要price和stopPrice配合,但网页端通常用市价止盈,应改为FUTURE_ORDER_TYPE_TAKE_PROFIT_MARKET,且无需传递price参数,否则会触发冗余参数校验错误。

3. 异常调试缺失

  • 自定义异常仅抛出错误字符串,建议打印BinanceAPIException的code和message,Binance错误码有明确规则(如-2010为参数错误、-2019为持仓不足),可快速定位问题。

4. 持仓状态校验

  • 首个止损市价单若未触发(仅为挂单状态),后续reduce_only=True的订单会因无持仓被拒绝。需确认开仓订单成交后再挂止盈止损,或使用Binance的条件单组合功能一次性提交开仓+止盈止损。

内容的提问来源于stack exchange,提问作者Syed Abdullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:22:04