Source code for gryphon.lib.exchange.exchange_factory

# -*- coding: utf-8 -*-

from gryphon.lib.exchange import exceptions


ALL_EXCHANGE_KEYS = [
    'bitstamp_btc_eur',
    'bitstamp_btc_usd',
    'bitstamp_eth_eur',
    'bitstamp_eth_usd',
    'bitstamp_eth_btc',
    'bitstamp_bch_btc',
    'bitstamp_bch_eur',
    'bitstamp_bch_usd',
    'bitfinex_btc_usd',
    'kraken_btc_eur',
    'kraken_btc_usd',
    'kraken_btc_cad',
    'itbit_btc_usd',
    'okcoin_btc_usd',
    'coinbase_btc_usd',
    'quadriga_btc_cad',
    'gemini_btc_usd',
    'gemini_eth_btc',
    'gemini_eth_usd',
    'gemini_ltc_usd',
    'gemini_zec_usd',
]

HISTORICAL_EXCHANGE_KEYS = [
    'vaultofsatoshi_btc_cad',
    'bitme_btc_usd',
    'buttercoin_btc_usd',
    'cavirtex_btc_cad',
    'coinsetter_btc_usd',
]

BANK_ACCOUNT_KEYS = ['BMO_USD', 'BMO_CAD', 'BMO_CAD_OPS', 'BOA_MAIN', 'BOA_INCOME']


[docs]def all_exchanges(): return [make_exchange_from_key(key) for key in ALL_EXCHANGE_KEYS]
[docs]def all_exchange_datas(db): return make_exchange_datas_from_keys(ALL_EXCHANGE_KEYS, db)
[docs]def all_bank_accounts(db): return make_exchange_datas_from_keys(BANK_ACCOUNT_KEYS, db)
[docs]def historical_exchanges(): return [make_exchange_from_key(key) for key in HISTORICAL_EXCHANGE_KEYS]
[docs]def historical_exchange_datas(db): return make_exchange_datas_from_keys(HISTORICAL_EXCHANGE_KEYS, db)
[docs]def all_current_and_historical_exchanges(): current_exchanges = all_exchanges() current_exchanges.extend(historical_exchanges()) return current_exchanges
[docs]def canonical_key(key): key = key.upper() if key == 'VAULT': key = 'VAULTOFSATOSHI' if key == 'BUTTER': key = 'BUTTERCOIN' return key
[docs]def map_pair_name_to_exchange_name(pair_name): """ We're preparing to add the notion that exchanges can have multiple trading pairs into our system. Each exchange is going to have a single ExchangeData db object but have one wrapper for each pair. Order.exchange_name is going to refer to the pair, but most accounting functions take place on the ExchangeData object. Thus, we need a mapping of ExchangeWrapper -> ExchangeData. This function will serve that purpose for now. To add a master-slave relationship to a pair, add a line like this: if pair_name == 'GEMINI_ETH_USD': # [slave pair] return 'GEMINI_BTC_USD' # [master pair] """ return pair_name
[docs]def make_exchange_from_key(key): key = canonical_key(key) api_wrapper_class = get_api_wrapper_class_by_name(key) return api_wrapper_class()
[docs]def make_exchange_data_from_key(key, db): keys = [key] exchange_datas = make_exchange_datas_from_keys(keys, db) assert len(exchange_datas) == 1 return exchange_datas[0]
[docs]def initialized_ledgers(db): """ Give us the names of the exchanges that have initialized ledgers in our trading database. """ from gryphon.lib.models.exchange import Exchange as ExchangeData exchange_account_names = db.query(ExchangeData.name).all() exchange_account_names = [e[0] for e in exchange_account_names] return exchange_account_names
[docs]def get_all_initialized_exchange_wrappers(db): from gryphon.lib.models.exchange import Exchange as ExchangeData exchange_accounts = db.query(ExchangeData).all() exchange_wrappers = [ make_exchange_from_key(e.name) for e in exchange_accounts if e.name.lower() in ALL_EXCHANGE_KEYS ] return exchange_wrappers
[docs]def make_exchange_datas_from_keys(pair_names, db): from gryphon.lib.models.exchange import Exchange as ExchangeData canonical_pair_names = [canonical_key(k) for k in pair_names] exchange_names = [map_pair_name_to_exchange_name(p) for p in canonical_pair_names] exchange_datas = db.query(ExchangeData)\ .filter(ExchangeData.name.in_(exchange_names))\ .all() assert len(exchange_datas) == len(pair_names) return [exchange_datas[0]]
[docs]def get_api_wrapper_class_by_name(exchange_name): exchange_name = canonical_key(exchange_name) if exchange_name == 'BITSTAMP_BTC_USD': from gryphon.lib.exchange.bitstamp_btc_usd import BitstampBTCUSDExchange return BitstampBTCUSDExchange elif exchange_name == 'BITSTAMP_ETH_EUR': from gryphon.lib.exchange.bitstamp_eth_eur import BitstampETHEURExchange return BitstampETHEURExchange elif exchange_name == 'BITSTAMP_ETH_USD': from gryphon.lib.exchange.bitstamp_eth_usd import BitstampETHUSDExchange return BitstampETHUSDExchange elif exchange_name == 'BITSTAMP_ETH_BTC': from gryphon.lib.exchange.bitstamp_eth_btc import BitstampETHBTCExchange return BitstampETHBTCExchange elif exchange_name == 'BITSTAMP_ETH_EUR': from gryphon.lib.exchange.bitstamp_eth_eur import BitstampETHEURExchange return BitstampETHEURExchange elif exchange_name == 'BITSTAMP_BTC_EUR': from gryphon.lib.exchange.bitstamp_btc_eur import BitstampBTCEURExchange return BitstampBTCEURExchange elif exchange_name == 'BITSTAMP_BCH_BTC': from gryphon.lib.exchange.bitstamp_bch_btc import BitstampBCHBTCExchange return BitstampBCHBTCExchange elif exchange_name == 'BITSTAMP_BCH_USD': from gryphon.lib.exchange.bitstamp_bch_usd import BitstampBCHUSDExchange return BitstampBCHUSDExchange elif exchange_name == 'BITSTAMP_BCH_EUR': from gryphon.lib.exchange.bitstamp_bch_eur import BitstampBCHEURExchange return BitstampBCHEURExchange elif exchange_name == 'KRAKEN_BTC_EUR': from gryphon.lib.exchange.kraken_btc_eur import KrakenBTCEURExchange return KrakenBTCEURExchange elif exchange_name == 'KRAKEN_BTC_USD': from gryphon.lib.exchange.kraken_btc_usd import KrakenBTCUSDExchange return KrakenBTCUSDExchange elif exchange_name == 'KRAKEN_BTC_CAD': from gryphon.lib.exchange.kraken_btc_cad import KrakenBTCCADExchange return KrakenBTCCADExchange elif exchange_name == 'BITFINEX_BTC_USD': from gryphon.lib.exchange.bitfinex_btc_usd import BitfinexBTCUSDExchange return BitfinexBTCUSDExchange elif exchange_name == 'ITBIT_BTC_USD': from gryphon.lib.exchange.itbit_btc_usd import ItbitBTCUSDExchange return ItbitBTCUSDExchange elif exchange_name == 'OKCOIN_BTC_USD': from gryphon.lib.exchange.okcoin_btc_usd import OKCoinBTCUSDExchange return OKCoinBTCUSDExchange elif exchange_name == 'QUADRIGA_BTC_CAD': from gryphon.lib.exchange.quadriga_btc_cad import QuadrigaBTCCADExchange return QuadrigaBTCCADExchange elif exchange_name == 'COINBASE_BTC_USD': from gryphon.lib.exchange.coinbase_btc_usd import CoinbaseBTCUSDExchange return CoinbaseBTCUSDExchange elif exchange_name == 'GEMINI_BTC_USD': from gryphon.lib.exchange.gemini_btc_usd import GeminiBTCUSDExchange return GeminiBTCUSDExchange elif exchange_name == 'GEMINI_ETH_USD': from gryphon.lib.exchange.gemini_eth_usd import GeminiETHUSDExchange return GeminiETHUSDExchange elif exchange_name == 'GEMINI_ETH_BTC': from gryphon.lib.exchange.gemini_eth_btc import GeminiETHBTCExchange return GeminiETHBTCExchange elif exchange_name == 'GEMINI_LTC_USD': from gryphon.lib.exchange.gemini_ltc_usd import GeminiLTCUSDExchange return GeminiLTCUSDExchange elif exchange_name == 'GEMINI_ZEC_USD': from gryphon.lib.exchange.gemini_zec_usd import GeminiZECUSDExchange return GeminiZECUSDExchange elif exchange_name == 'POLONIEX_ETH_BTC': from gryphon.lib.exchange.poloniex_eth_btc import PoloniexETHBTCExchange return PoloniexETHBTCExchange else: raise exceptions.ExchangeNotIntegratedError(exchange_name)