code: def find_exchanges(
      features=None,
      skip_blacklist=True,
      is_authenticated=False,
      quote_currency=None,
  ):
      """
      Find exchanges filtered by a list of feature.
  
      Parameters
      ----------
      features: str
          The list of features.
  
      skip_blacklist: bool
      is_authenticated: bool
      quote_currency: bool
  
      Returns
      -------
      list[Exchange]
  
      """
      exchange_names = CCXT.find_exchanges(features, is_authenticated)
  
      exchanges = []
      for exchange_name in exchange_names:
          if skip_blacklist and is_blacklist(exchange_name):
              continue
  
          exchange = get_exchange(
              exchange_name=exchange_name,
              skip_init=True,
              quote_currency=quote_currency,
          )
  
          if features is not None:
              if "dailyBundle" in features and not exchange.has_bundle(
                  "daily"
              ):
                  continue
  
              elif (
                  "minuteBundle" in features
                  and not exchange.has_bundle("minute")
              ):
                  continue
  
          exchanges.append(exchange)
  
      return exchanges
  
file_path: catalyst/catalyst/exchange/utils/factory.py
imports: import os
  from catalyst.constants import LOG_LEVEL
  from catalyst.exchange.ccxt.ccxt_exchange import CCXT
  from catalyst.exchange.exchange_errors import ExchangeAuthEmpty
  from catalyst.exchange.utils.exchange_utils import get_exchange_auth, get_exchange_folder, is_blacklist
  from logbook import Logger
label_desc: Use image node_id 3 for calling a global function with example usage: find_exchanges(features, skip_blacklist, is_authenticated, quote_currency) and returns: exchanges