Я создал 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
};
Но опять же, я не уверен, что это лучший способ рассчитать это.