'python-Binance api: APIError(code=-1013): Filter failure: LOT_SIZE

When trying to place a buy or sell order with the python-binance api I got the following error:

APIError(code=-1013): Filter failure: LOT_SIZE.

Now I've seen at iceberg_parts that this means there is probably something wrong with my buying or selling quantity. I've tried to increase the quantity by a factor 10 but this only gives me another related error:

APIError(code=-1013): Filter failure: MIN_NOTIONAL.

Here's some of my code:

diff = current_price - prev_price
if diff <= 0.0001:
    order = client.order_market_buy(symbol = market , quantity = '0.0001')
    print('buy order')

if diff >= 0.00040:
    order = client.order_market_sell(symbol =market, quantity ='0.0001')
    print('sell order')

Do you know how to fix this?



Solution 1:[1]

This error appears because you are trying to create an order with a quantity lower than the minimun required.

You can access the minimun required of a specific pair with:

info = client.get_symbol_info('ETHUSDT')
print(info)

Output a dictionary with information about that pair. Now you can access the minimun quantity required with:

print(info['filters'][2]['minQty'])
# 0.00001

Solution 2:[2]

The buying or selling quantity has to be >= 10.3 USD or 10.3/price, pass the quantity and price to these decimal settings/filters with the amounts set with decimal

from decimal import Decimal as D, ROUND_DOWN, ROUND_UP
import decimal

info = client.get_symbol_info(symbol=pair)
price_filter = float(info['filters'][0]['tickSize'])
ticker = client.get_symbol_ticker(symbol=pair)
price = float(ticker['price'])
price = D.from_float(price).quantize(D(str(price_filter)))
minimum = float(info['filters'][2]['minQty']) # 'minQty'
quant = D.from_float(quantity).quantize(D(str(minimum))) # if quantity >= 10.3/price

Solution 3:[3]

I've just gone through this same problem. As a noob, some of the code in these answers seem quite complicated so I came up with a solution.

Code:

def check_decimals(symbol):
    info = client.get_symbol_info(symbol)
    val = info['filters'][2]['stepSize']
    decimal = 0
    is_dec = False
    for c in val:
        if is_dec is True:
            decimal += 1
        if c == '1':
            break
        if c == '.':
            is_dec = True
    return decimal

then when you place the order, just do for ex: (make sure qty is a float or decimal)

  B_order = round(qty / symbol_price, decimal)
  order = client.order_market_buy(
            symbol=symbol_name,
            quantity=B_order)

Solution 4:[4]

Here is some code.

def round_down(self, coin, number):
    info = self.client.get_symbol_info('%sUSDT' % coin)
    step_size = [float(_['stepSize']) for _ in info['filters'] if _['filterType'] == 'LOT_SIZE'][0]
    step_size = '%.8f' % step_size
    step_size = step_size.rstrip('0')
    decimals = len(step_size.split('.')[1])
    return math.floor(number * 10 ** decimals) / 10 ** decimals

Solution 5:[5]

https://python-binance.readthedocs.io/en/latest/account.html

from binance.helpers import round_step_size

# to get a lot size
def getLotSize(self):
    info = self.apiCall(lambda: self.client.get_symbol_info(self.pair))
    lotSize = float(info['filters'][2]['minQty'])
    return lotSize


# get ceiling value and correct format for a lot size
def getCeilingVal(self):
    pairData = self.apiCall(lambda: 
    self.client.get_symbol_ticker(symbol=self.pair))
    pairPrice = pairData["price"]
    ceilingVal = float(self.dInv) / float(pairPrice)

    aLotSize = self.getLotSize()
    rounded_amount = round_step_size(ceilingVal, aLotSize)

    return rounded_amount

Solution 6:[6]

Here's a very helpful code using binance-python package

  ...
  // Full code: https://github.com/ndiecodes/binance-trading-bot/blob/main/main.py

  def get_round_step_quantity(self, qty):
    info = self.client.get_symbol_info(Config.TRADESYMBOL)
    for x in info["filters"]:
        if x["filterType"] == "LOT_SIZE":
            self.minQty = float(x["minQty"])
            self.maxQty = float(x["maxQty"])
            self.stepSize= float(x["stepSize"])
    if qty < self.minQty:
        qty = self.minQty
    return round_step_size(quantity=qty, step_size=self.stepSize)

Solution 7:[7]

I write a function like that. It's working for me.

def getPriceLotFormat(self, priceOrg, quantityOrg):
    price = float(priceOrg)
    quantity = float(quantityOrg)
    response = self.get_symbol_info(car.pair) #self is client btw
    priceFilterFloat = format(float(response["filters"][0]["tickSize"]), '.20f')
    lotSizeFloat = format(float(response["filters"][2]["stepSize"]), '.20f')
    # PriceFilter
    numberAfterDot = str(priceFilterFloat.split(".")[1])
    indexOfOne = numberAfterDot.find("1")
    if indexOfOne == -1:
        price = int(price)
    else:
        price = round(float(price), int(indexOfOne - 1))
    # LotSize
    numberAfterDotLot = str(lotSizeFloat.split(".")[1])
    indexOfOneLot = numberAfterDotLot.find("1")
    if indexOfOneLot == -1:
        quantity = int(quantity)
    else:
        quantity = round(float(quantity), int(indexOfOneLot))
    print(f"""
    ##### SELL #####
    Pair : {str(car.pair)}
    Cash : {str(car.price)}
    Quantity : {str(car.quantity)}
    Price : {str(car.price)}
        """)

Solution 8:[8]

We can use the Log10 function to get rounding precision from the Binance /api/v3/exchangeinfo endpoint data.

CurrencyRoundNum = int(math.Abs(math.Log10(stepSize)))
PriceRoundNum = int(math.Abs(math.Log10(tickSize)))

The full version on golang is here, or at go playground. I'm sorry that code is not on python.

Solution 9:[9]

So I was struggling with the LOT_SIZE error myself.

Previously I was using the round_step_size function from the python-binance library, however, I had to edit this function to deal with this API error.

Here is a function that I use:

from decimal import Decimal, ROUND_DOWN
import math
from typing import Union

def round_step_size(quantity: Union[float, Decimal], step_size: Union[float, Decimal]) -> float:
    if step_size == 1.0:
        return math.floor(quantity)
    elif step_size < 1.0:
        return Decimal(f'{quantity}').quantize(Decimal(f'{step_size}'), rounding=ROUND_DOWN)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Stack
Solution 2
Solution 3 Yugenswitch
Solution 4 jrm
Solution 5 amijaljevic
Solution 6 ndiecodes
Solution 7 abdulsamed kayaduman
Solution 8 Vladimir Filin
Solution 9 Reinis Ga??is