Рассчитайте минимальную сумму покупки / продажи, которую биржа позволит разместить ордер на основе текущей цены

Я создал calculateMinimumAmount для расчета минимальной суммы покупки / продажи, которую биржа позволит разместить спотовый ордер на основе текущей цены.

Используемая мной биржа (FTT) ограничивает минимальную сумму заказа не по стоимости (например, Binance требуется не менее 10 долларов США на заказ), а по количеству токенов.

Например: BTC находится на уровне 33,000 USD поэтому минимальная сумма будет 0.0001 BTC или же 3.33 USD

Я не могу найти, как они рассчитывают минимальный заказ или как называется этот расчет. Так что я думаю:

  • Минимальная сумма заказа должна быть больше, чем 1 но меньше чем 10 доллар США
  • (в формате условий) value > 1 && value < 10
const calculateMinimumAmount = (currentPrice: number) => {
  // Calculate amount that can be buy/sell with 10 USD
  const amountFor10 = 10 / currentPrice;

  // Round to first non-zero decimals digit - e.g. '0.000113112' -> '0.0001'
  // https://stackoverflow.com/a/23887837/7405706
  const decimalPlaces = Math.abs(
    Math.floor(Math.log(amountFor10) / Math.log(10))
  ); // Modified from the linked answer to just only first non-zero digit
  let minimumAmount = amountFor10.toFixed(decimalPlaces);

  // Replace last character with 1 - e.g. '0.00003' -> '0.00001'
  const replaceIndex = minimumAmount.length - 1;
  minimumAmount =
    minimumAmount.substring(0, replaceIndex) +
    '1' +
    minimumAmount.substring(replaceIndex + 1);

  const resultAmount = parseFloat(minimumAmount);
  return Math.min(resultAmount, 1); // Only the smallest amount
};

Вот результат — я проверил результат обмена, что все они верны

calculateMinimumAmount(33000); // BTC -> 0.0001
calculateMinimumAmount(1983); // ETH -> 0.001
calculateMinimumAmount(300); // BNB -> 0.01
calculateMinimumAmount(128); // LTC -> 0.01
calculateMinimumAmount(26.586); // FTT -> 0.1
calculateMinimumAmount(2.939); // SRM -> 1
calculateMinimumAmount(1.01); // USDT -> 1
calculateMinimumAmount(1); // Ideal USDT -> 1
calculateMinimumAmount(0.232857); // DOGE -> 1

Я не думаю, что это не лучший способ его подсчитать. Потому что в нем задействованы строковые манипуляции (которые не должны присутствовать в вычислениях, верно?)


Обновлять:

Я посмотрел на результат и просто выяснил соотношение цифр цены и результата в десятичных разрядах. Итак, вот обновленная версия.

Я вижу, что 5 цифр будут выводить 4 десятичных знака. Поэтому я считаю цифры и переводю их в десятичные. Намного проще.

const calculateMinimumAmount = (currentPrice: number) => {
  // Digits of currentPrice - e.g. 10000 -> 5 digits
  // https://stackoverflow.com/a/14879700/7405706
  const intDigits = (Math.log(currentPrice) * Math.LOG10E + 1) | 0;

  // Convert to the lowest amount in the digits - e.g. 33000 -> 10000
  const roundedInteger = 10 ** intDigits;

  // Covert to decimals - e.g. 10000 -> 0.0001
  const minimumAmount = 1 / (roundedInteger / 10);

  return Math.min(1, minimumAmount); // Only the smallest amount
};

Но опять же, я не уверен, что это лучший способ рассчитать это.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *