code: def get_exchange(
      exchange_name,
      quote_currency=None,
      must_authenticate=False,
      skip_init=False,
      auth_alias=None,
  ):
      key = (exchange_name, quote_currency)
      if key in exchange_cache:
          return exchange_cache[key]
  
      exchange_auth = get_exchange_auth(exchange_name, alias=auth_alias)
  
      has_auth = (
          exchange_auth["key"] != "" and exchange_auth["secret"] != ""
      )
      if must_authenticate and not has_auth:
          raise ExchangeAuthEmpty(
              exchange=exchange_name.title(),
              filename=os.path.join(
                  get_exchange_folder(exchange_name), "auth.json"
              ),
          )
  
      exchange = CCXT(
          exchange_name=exchange_name,
          key=exchange_auth["key"],
          secret=exchange_auth["secret"],
          password=exchange_auth["password"]
          if "password" in exchange_auth.keys()
          else "",
          quote_currency=quote_currency,
      )
      exchange_cache[key] = exchange
  
      if not skip_init:
          exchange.init()
  
      return exchange
  
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 1 for calling a global function with example usage: get_exchange(exchange_name, quote_currency, must_authenticate, skip_init, auth_alias) and returns: exchange, exchange_cache