getGridTradeSell = (
  logger,
  cachedSymbolInfo,
  globalConfiguration,
  symbolConfiguration
) => {
  const {
    sell: { gridTrade: srcGridTrade }
  } = symbolConfiguration;

  let orgGridTrade = srcGridTrade;
  if (_.isEmpty(srcGridTrade)) {
    orgGridTrade = globalConfiguration.sell.gridTrade;
  }
  const gridTradeLength = orgGridTrade.length;

  // Loop symbol's sell.gridTrade
  const gridTrade = orgGridTrade.map((orgGrid, index) => {
    const grid = orgGrid;

    // Retrieve configrued quantity percentage
    const symbolQuantityPercentage = _.get(grid, 'quantityPercentage', -1);

    if (symbolQuantityPercentage !== -1) {
      _.unset(grid, 'quantityPercentages');
      return grid;
    }

    let newQuantityPercentage = -1;

    // Retrieve symbol information cache
    if (_.isEmpty(cachedSymbolInfo) === false) {
      const { quoteAsset } = cachedSymbolInfo;

      // Retrieve configured quantity percentage for the quote asset from the global configuration.
      newQuantityPercentage = _.get(
        globalConfiguration,
        `sell.gridTrade[${index}].quantityPercentages[${quoteAsset}]`,
        -1
      );

      // If quantity percentage for the quote asset in the global configuration is not defined,
      // then set custom quantity.
      if (newQuantityPercentage === -1) {
        newQuantityPercentage =
          gridTradeLength !== index + 1
            ? parseFloat((1 / gridTradeLength).toFixed(2))
            : 1;
      }
    } else {
      logger.info(
        { cachedSymbolInfo },
        'Could not find symbol info for sell quantity percentage, wait to be cached.'
      );
    }

    _.set(grid, 'quantityPercentage', newQuantityPercentage);
    _.unset(grid, 'quantityPercentages');

    return grid;
  });

  return gridTrade;
}
Get quantity percentage of grid trade for selling

@param {*} logger
@param {*} cachedSymbolInfo
@param {*} globalConfiguration
@param {*} symbolConfiguration
@returns