class_docstr: Interface for performing queries against exchange API's
      
class_docstr_tok: ["Interface","for","performing","queries","against","exchange","API","'s"]
docstr: Initializes ExchangeInterface class
  
  Args:
      exchange_config (dict): A dictionary containing configuration for the exchanges.
docstr_tok: ["Initializes","ExchangeInterface","class","Args",":","exchange_config","(","dict",")",":","A","dictionary","containing","configuration","for","the","exchanges","."]
code: def __init__(self, exchange_config):
      """Initializes ExchangeInterface class
  
      Args:
          exchange_config (dict): A dictionary containing configuration for the exchanges.
      """
  
      self.logger = structlog.get_logger()
      self.exchanges = dict()
  
      # Loads the exchanges using ccxt.
      for exchange in exchange_config:
          if exchange_config[exchange]["required"]["enabled"]:
              new_exchange = getattr(ccxt, exchange)(
                  {"enableRateLimit": True}
              )
  
              # sets up api permissions for user if given
              if new_exchange:
                  self.exchanges[new_exchange.id] = new_exchange
              else:
                  self.logger.error(
                      "Unable to load exchange %s", new_exchange
                  )
  
file_path: Crypto-Signal/app/exchange.py
imports: import re
  import sys
  import time
  from datetime import datetime, timedelta, timezone
  import ccxt
  import structlog
  from tenacity import retry, retry_if_exception_type, stop_after_attempt
label_desc: Use image node_id 1 to create a new ExchangeInterface object  with example: obj = ExchangeInterface(exchange_config)