getSymbolInfo = async (logger, symbol) => {
  const cachedSymbolInfo =
    JSON.parse(
      await cache.hget('trailing-trade-symbols', `${symbol}-symbol-info`)
    ) || {};

  if (_.isEmpty(cachedSymbolInfo) === false) {
    logger.info({ cachedSymbolInfo }, 'Retrieved symbol info from the cache.');
    return cachedSymbolInfo;
  }

  const exchangeInfo = await getCachedExchangeInfo(logger);

  logger.info({}, 'Retrieved exchange info.');
  const symbolInfo = _.filter(
    exchangeInfo.symbols,
    s => s.symbol === symbol
  )[0];

  // eslint-disable-next-line prefer-destructuring
  symbolInfo.filterLotSize = _.filter(
    symbolInfo.filters,
    f => f.filterType === 'LOT_SIZE'
  )[0];
  // eslint-disable-next-line prefer-destructuring
  symbolInfo.filterPrice = _.filter(
    symbolInfo.filters,
    f => f.filterType === 'PRICE_FILTER'
  )[0];
  // eslint-disable-next-line prefer-destructuring
  symbolInfo.filterMinNotional = _.filter(
    symbolInfo.filters,
    f => f.filterType === 'MIN_NOTIONAL'
  )[0];
  // eslint-disable-next-line prefer-destructuring
  symbolInfo.filterNotional = _.filter(
    symbolInfo.filters,
    f => f.filterType === 'NOTIONAL'
  )[0];

  // This is for a backward compatibility that filterMinNotional is not available.
  if (symbolInfo.filterNotional) {
    symbolInfo.filterMinNotional = symbolInfo.filterNotional;
  }

  logger.info({ symbolInfo }, 'Retrieved symbol info from Binance.');

  const finalSymbolInfo = _.pick(symbolInfo, [
    'symbol',
    'status',
    'baseAsset',
    'baseAssetPrecision',
    'quoteAsset',
    'quotePrecision',
    'filterLotSize',
    'filterPrice',
    'filterMinNotional'
  ]);

  await cache.hset(
    'trailing-trade-symbols',
    `${symbol}-symbol-info`,
    JSON.stringify(finalSymbolInfo),
    3600
  );

  return finalSymbolInfo;
}
Get symbol information

@param {*} logger
@param {*} symbol