Невозможно установить лимитный ордер STOP-LOSS с помощью Binance Python API

Я пытаюсь создать LONG TRADE, который будет содержать BUY ORDER и STOP-LOSS, используя Python asyncio, ccxt API (который вызывает Binance API для криптобиржи Binance).

Сначала создаю ЗАКАЗ НА ПОКУПКУ. Потом жду пока заказ будет исполнен. ПОСЛЕ его исполнения я пытаюсь создать ордер СТОП-УБЫТКИ, чтобы использовать созданный LONG (Причина: я не хочу потерять много денег, если сделка пойдет против меня) .

Согласно журналу, ЗАКАЗ НА ПОКУПКУ создается ОК. У меня "недостаточно средств" по СТОП-ЛИМИТНОМУ приказу.

Я не понимаю, почему я получаю "недостаточно средств" на ордере STOP-LOSS, когда ордер на ПОКУПКУ прошел нормально (он даже имеет статус <сильный > ЗАПОЛНЕНО).

Если я ПОКУПАЮ 0,0015 BTC за 9000 долларов (и заказ был ВЫПОЛНЕН), я смогу ОСТАНОВИТЬ-ПОТЕРЯ 0,0015 BTC за 8875 долларов (опять же, чтобы сохранить средства на случай, если сделка переместится. против меня)

Почему это не работает? Почему я не могу создать СТОП-ЛОСС для своей сделки?

ETA: Видел это в другой ветке:

TAKE_PROFIT является противоположностью STOP_LOSS. Один выполняется в нисходящем направлении, другой - в восходящем.

ВОПРОС: Как я могу структурировать API, чтобы можно было установить TAKE_PROFIT и STOP_LOSS для заказа?

async def execute_long_trade(self, trade: LongTrade):
    try:
        buy_price = trade.start_price
        sell_price = trade.exit_price
        symbol = trade.exchange_symbol
        amount = trade.amount
        stop_loss = trade.stop_loss

        order = self.exchange.ccxt_create_buy_order(symbol, amount, buy_price, 0 )

[... вырезать ...]

        logging.info(f'Opened long trade: {amount} of {symbol}. Target buy {stop_loss}, sell price {sell_price}')

        await self._wait_order_complete(order["data"][0]["id"], symbol)

        # set up a stop loss order
        order = self.exchange.ccxt_create_sell_order(symbol, amount, sell_price, stop_loss )

        logging.info(f'Completed long trade: {amount} of {symbol}. Bought at {buy_price} and sold at {sell_price}')

    except ExchangeError as e:
        raise

    except Exception as e:
        print (" unexpected exception ")
        exit()

[... вырезать ...]

ВЫЗОВ BINANCE (для части КУПИТЬ - которая отлично работает):

    def ccxt_create_buy_order( self, symbol: str, amount: float, price: float, stop_price: float ):
        try:
            results = {}

            if ( stop_price > 0 ):
                params = { 'stopPrice': stop_price - 10 }
                output  = self.ccxt_binance.createOrder(symbol, 'STOP_LOSS_LIMIT', amount=amount, side="buy",
                        price = stop_price, params=params)
            else:
                output  = self.ccxt_binance.create_order(symbol=symbol, type="limit", side="buy",\
                    amount=amount, price=price )

[ ... snip ...]
            return (results)

        except ccxt.InsufficientFunds as e:
            print ("insufficient funds)
            return

        except Exception as e:
            print (" unexpected error ")
            exit()

ВЫЗОВ BINANCE (для ПРОДАЖИ - ошибка "не хватает средств"):

    def ccxt_create_sell_order( self, symbol: str, amount: float, price: float, stop_price: float  ):
        try:
            results = {}

            if ( stop_price > 0 ):
                params = { 'stopPrice': stop_price + 10 }
                output  = self.ccxt_binance.createOrder(symbol, 'STOP_LOSS_LIMIT', amount=amount, \
                        side="sell", price = stop_price, params=params)
                print(output)
            else:
                output  = self.ccxt_binance.create_order(symbol=symbol, \
                    type="limit", side="sell",amount=amount )

[ ... snip ...]

            return (results)

        except ccxt.InsufficientFunds as e:
            print ("insufficient funds)
            return

        except Exception as e:
            print (" unexpected error ")
            exit()

ЗАПИСАТЬСЯ НА ПОКУПКУ

2020-06-10 01:01:08 - DEBUG - 16537 - ccxt.base.exchange - DEBUG
MESSAGE : POST https://api.binance.com/api/v3/order, Request: {'X-MBX-APIKEY': 'JXXXXXXXX-XXXXXX', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.21.0', 'Accept-Encoding': 'gzip, deflate'} timestamp=1591750868935&recvWindow=5000&symbol=BTCUSDT&type=LIMIT&side=BUY&quantity=0.0015&newOrderRespType=RESULT&price=9777.99&timeInForce=GTC&signature=XXXXXXXXXXXX-XXXXXXXXXXXXXX

2020-06-10 01:01:09 - DEBUG - 16537 - urllib3.connectionpool - DEBUG
MESSAGE : https://api.binance.com:443 "POST /api/v3/order HTTP/1.1" 200 None

2020-06-10 01:01:09 - DEBUG - 16537 - ccxt.base.exchange - DEBUG
MESSAGE : POST https://api.binance.com/api/v3/order, Response: 200 {'Content-Type': 'application/json;charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Wed, 10 Jun 2020 01:01:09 GMT', 'Server': 'nginx', 'X-MBX-UUID': 'XXXXXXXXX-XXXXx', 'X-MBX-USED-WEIGHT': '5', 'X-MBX-USED-WEIGHT-1M': '5', 'X-MBX-ORDER-COUNT-10S': '1', 'X-MBX-ORDER-COUNT-1D': '10', 'Content-Encoding': 'gzip', 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains', 'X-Frame-Options': 'SAMEORIGIN', 'X-Xss-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'Content-Security-Policy': "default-src 'self'", 'X-Content-Security-Policy': "default-src 'self'", 'X-WebKit-CSP': "default-src 'self'", 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, HEAD, OPTIONS', 'X-Cache': 'Miss from cloudfront', 'Via': '1.1 e9ccfc64a258a54713XXXXb7b.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop': 'ATL56-C3', 'X-Amz-Cf-Id': 'gXXXXXXXXXXX-XXX9TzUqeLltao4UiQ=='} {"symbol":"BTCUSDT","orderId":2434736796,"orderListId":-1,"clientOrderId":"93XXXXXXXECejmtfb","transactTime":1591750869025,"price":"9777.99000000","origQty":"0.00150000","executedQty":"0.00150000","cummulativeQuoteQty":"14.66698500","status":"FILLED","timeInForce":"GTC","type":"LIMIT","side":"BUY"}

ЖУРНАЛ ПРОДАЖИ:

2020-06-10 01:01:24 - DEBUG - 16537 - ccxt.base.exchange - DEBUG
MESSAGE : POST https://api.binance.com/api/v3/order, Request: {'X-MBX-APIKEY': 'XXXXXXXXX-XXX', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.21.0', 'Accept-Encoding': 'gzip, deflate'} timestamp=1591750884617&recvWindow=5000&symbol=BTCUSDT&type=STOP_LOSS_LIMIT&side=SELL&quantity=0.0015&newOrderRespType=RESULT&price=9670.21&timeInForce=GTC&stopPrice=9680.21&signature=XXXXXXX-XXXXXXX-XXXXXXXXXXX-XXXXXXXXXXXXX

2020-06-10 01:01:24 - DEBUG - 16537 - urllib3.connectionpool - DEBUG
MESSAGE : https://api.binance.com:443 "POST /api/v3/order HTTP/1.1" 400 None

2020-06-10 01:01:24 - DEBUG - 16537 - ccxt.base.exchange - DEBUG
MESSAGE : POST https://api.binance.com/api/v3/order, Response: 400 {'Content-Type': 'application/json;charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Wed, 10 Jun 2020 01:01:24 GMT', 'Server': 'nginx', 'X-MBX-UUID': 'XXXXXX-023741e9e18b', 'X-MBX-USED-WEIGHT': '7', 'X-MBX-USED-WEIGHT-1M': '7', 'X-MBX-ORDER-COUNT-10S': '1', 'X-MBX-ORDER-COUNT-1D': '11', 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains', 'X-Frame-Options': 'SAMEORIGIN', 'X-Xss-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'Content-Security-Policy': "default-src 'self'", 'X-Content-Security-Policy': "default-src 'self'", 'X-WebKit-CSP': "default-src 'self'", 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'X-Cache': 'Error from cloudfront', 'Via': '1.1 e9XXXXXXXX-09e5b7b.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop': 'ATL56-C3', 'X-Amz-Cf-Id': 'XXXXXXX'} {"code":-2010,"msg":"Account has insufficient balance for requested action."}

person Casey Harrils    schedule 10.06.2020    source источник
comment
Это большой объем кода, но, судя по самым последним строкам, ваша проблема не носит технического характера, поскольку сервер возвращает правильный ответ со статусом 400, указывая на то, что отправленный вами запрос был плохим. Обычно это означает, что он имеет неправильный формат или ссылается на несуществующее значение. Возможно, он отправит вам 400 из-за недостаточного баланса, но пробовали ли вы запросить свой баланс до запроса STOP-LOSS? Это показывает, что у вас достаточно баланса? Возможно, это слишком быстро? Является ли сервер транзакционным и нужно ли вам совершать КУПИТЬ перед отправкой СТОП-УБЫТКИ?   -  person Grismar    schedule 10.06.2020
comment
Спасибо за ответ. ››› Кода очень много ……… Я удалил его значительную часть. ››› Возможно, что он отправит вам 400 из-за недостаточного баланса ‹-------------------------------- - да, я думаю, что купленные предметы (например, BTCUSD) все еще находились на бирже (и доступны для продажи). Я думал, что STOP-LMIT посмотрит на биржу, увидит, что BTC уже был куплен, а затем разрешит выполнение функции STOP-LIMIT. Я думал, он сначала посмотрит на биржу, а не в моем аккаунте.   -  person Casey Harrils    schedule 10.06.2020


Ответы (2)


в сообщении api вашего лимитного ордера нет цены

person davido561    schedule 12.01.2021

def ccxt_create_sell_order (self, symbol: str, amount: float, price: float, stop_price: float): try: results = {}

        if ( stop_price > 0 ):
            params = { 'stopPrice': stop_price + 10 }
            output  = self.ccxt_binance.createOrder(symbol, 'STOP_LOSS_LIMIT', amount=amount, \
                    side="sell", price = stop_price, params=params)
            print(output)
        else:
            output  = self.ccxt_binance.create_order(symbol=symbol, \
                type="limit", side="sell",amount=amount )

[... вырезать ...]

        return (results)

    except ccxt.InsufficientFunds as e:
        print ("insufficient funds)
        return

    except Exception as e:
        print (" unexpected error ")
        exit()
person Digital Marketer BD    schedule 12.11.2020
comment
Попробуйте объяснить разные части вашего ответа. Непонятно, что делают разные части кода. - person Serge de Gosson de Varennes; 12.11.2020