wiki/examples/js/huobipro-market-buy-sell-fetch-trading-limits.md
import ccxt from '../../js/ccxt.js';
import ololog from 'ololog'
const log = ololog.configure .unlimited.handleNodeErrors (),
{ NotSupported } = ccxt,
enableRateLimit = true,
symbol = 'ADA/BTC',
side = 'buy',
// set createMarketBuyOrderRequiresPrice to true or false to see the difference
type = 'market',
// default is true
createMarketBuyOrderRequiresPrice = true,
amount = 191.03,
price = 0.000011,
options = { createMarketBuyOrderRequiresPrice },
exchange = new ccxt.huobipro ({ enableRateLimit, options });
// This is an example that demonstrates the issues discussed here:
// https://github.com/ccxt/ccxt/issues/564
// https://github.com/ccxt/ccxt/issues/3427
// https://github.com/ccxt/ccxt/issues/3460
// https://github.com/ccxt/ccxt/issues/4799
log.green ('CCXT', ccxt.version)
;(async () => {
// preload them first
await exchange.loadMarkets ()
// huobipro has this
if (!exchange.has['fetchTradingLimits']) {
throw new NotSupported (exchange.id + ' does not have fetchTradingLimits() yet, make sure your version of CCXT is up to date');
}
// In this particular case it requires an array of symbols
// otherwise it will load all of them one by one.
// Loading all limits without specifying
// the array of symbols might take a lot of time.
// The array of symbols will contain just one symbol of interest.
const arrayOfSymbols = [ symbol ]
const allLimits = await exchange.fetchTradingLimits (arrayOfSymbols)
// { 'ADA/BTC': { info: { symbol: "adabtc",
// 'buy-limit-must-less-than': 1.1,
// 'sell-limit-must-greater-than': 0.9,
// 'limit-order-must-greater-than': 0.1,
// 'limit-order-must-less-than': 5000000,
// 'market-buy-order-must-greater-than': 0.0001,
// 'market-buy-order-must-less-than': 100,
// 'market-sell-order-must-greater-than': 0.1,
// 'market-sell-order-must-less-than': 500000,
// 'limit-order-before-open-greater-than': 999999999,
// 'limit-order-before-open-less-than': 0,
// 'circuit-break-when-greater-than': 10000,
// 'circuit-break-when-less-than': 10,
// 'market-sell-order-rate-must-less-than': 0.1,
// 'market-buy-order-rate-must-less-than': 0.1 },
// limits: { amount: { min: 0.1, max: 5000000 } } } }
const limits = allLimits[symbol]
log.yellow (symbol, 'limits:')
log.yellow (limits)
// To make things a bit more complicated huobipro specifies
// different minimums for market and limit orders
// and different minimums for buy/sell directions
// therefore we have to work with it in an exchange-specific way
// using the 'info' field from the response – that is
// until this aspect is completely unified in ccxt.
const info = limits['info']
const typeSide = type + '-' + side
const min = info[typeSide + '-order-must-greater-than']
const max = info[typeSide + '-order-must-less-than']
// huobipro requires the amount in quote currency for market sell orders
// huobipro requires the cost in quote currency for market buy orders
// cost = amount * price
const cost = createMarketBuyOrderRequiresPrice ? (amount * price) : amount
let color = 'red'
if ((min !== undefined) && (cost < min)) {
log[color] ('The cost is below minimum:', cost, '<', min)
} else if ((max !== undefined) && (cost > max)) {
log[color] ('The cost is above maximum:', cost, '>', max)
} else {
color = 'green'
}
log[color] ({ min, max, cost })
}) ()