def choose_pair( self, timestamp: Timestamp, price_query: Callable[[Asset, Asset, Timestamp], FVal], ) -> TradePair: """Choose a random pair to trade from the available pairs at the selected timestamp""" choices = set(self.asset_pairs['result'].keys()) found = False while len(choices) != 0: pair = random.choice(tuple(choices)) choices.remove(pair) pair = kraken_to_world_pair(pair) base, quote = pair_get_assets(pair) kbase = base.to_kraken() kquote = quote.to_kraken() if kbase in self.balances_dict or kquote in self.balances_dict: # Before choosing make sure that at the selected timestamp both of # the pair assets exist (had a price) if not assets_exist_at_time(base, quote, timestamp, price_query): continue found = True break if not found: raise ValueError( 'Could not find a pair to trade with the current funds') return trade_pair_from_assets(base, quote)
def test_kraken_to_world_pair(): assert kraken_to_world_pair('QTUMXBT') == 'QTUM_BTC' assert kraken_to_world_pair('ADACAD') == 'ADA_CAD' assert kraken_to_world_pair('BCHUSD') == 'BCH_USD' assert kraken_to_world_pair('DASHUSD') == 'DASH_USD' assert kraken_to_world_pair('XTZETH') == 'XTZ_ETH' assert kraken_to_world_pair('XXBTZGBP.d') == 'BTC_GBP' with pytest.raises(UnprocessableTradePair): kraken_to_world_pair('GABOOBABOO')
def test_kraken_to_world_pair(kraken): """Kraken does not consistently list its pairs so test here that most pairs work For example ETH can be ETH or XETH, BTC can be XXBT or XBT """ # Some standard tests that should always pass assert kraken_to_world_pair('QTUMXBT') == 'QTUM_BTC' assert kraken_to_world_pair('ADACAD') == 'ADA_CAD' assert kraken_to_world_pair('BCHUSD') == 'BCH_USD' assert kraken_to_world_pair('DASHUSD') == 'DASH_USD' assert kraken_to_world_pair('XTZETH') == 'XTZ_ETH' assert kraken_to_world_pair('ETHDAI') == 'ETH_DAI' assert kraken_to_world_pair('SCXBT') == 'SC_BTC' assert kraken_to_world_pair('SCEUR') == 'SC_EUR' assert kraken_to_world_pair('WAVESUSD') == 'WAVES_USD' assert kraken_to_world_pair('XXBTZGBP.d') == 'BTC_GBP' assert kraken_to_world_pair('ETHCHF') == 'ETH_CHF' assert kraken_to_world_pair('XBTCHF') == 'BTC_CHF' assert kraken_to_world_pair('EURCAD') == 'EUR_CAD' assert kraken_to_world_pair('USDCHF') == 'USD_CHF' assert kraken_to_world_pair('EURJPY') == 'EUR_JPY' assert kraken_to_world_pair('LTCETH') == 'LTC_ETH' assert kraken_to_world_pair('LTCUSDT') == 'LTC_USDT' assert kraken_to_world_pair('XRPGBP') == 'XRP_GBP' assert kraken_to_world_pair('XRPUSDT') == 'XRP_USDT' assert kraken_to_world_pair('AUDJPY') == 'AUD_JPY' # now try to test all pairs that kraken returns and if one does not work note # down a test warning so that it can be fixed by us later pairs = kraken.api_query('AssetPairs').keys() for pair in pairs: try: kraken_to_world_pair(pair) except Exception: test_warnings.warn(UserWarning( f'Could not process kraken pair {pair}', )) # Finally test that wrong pairs raise proper exception with pytest.raises(UnprocessableTradePair): kraken_to_world_pair('GABOOBABOO')
def test_kraken_to_world_pair(kraken): """Kraken does not consistently list its pairs so test here that most pairs work For example ETH can be ETH or XETH, BTC can be XXBT or XBT """ # Some standard tests that should always pass assert kraken_to_world_pair('QTUMXBT') == (A_QTUM, A_BTC) assert kraken_to_world_pair('ADACAD') == (A_ADA, A_CAD) assert kraken_to_world_pair('BCHUSD') == (A_BCH, A_USD) assert kraken_to_world_pair('DASHUSD') == (A_DASH, A_USD) assert kraken_to_world_pair('XTZETH') == (A_XTZ, A_ETH) assert kraken_to_world_pair('ETHDAI') == (A_ETH, A_DAI) assert kraken_to_world_pair('SCXBT') == (A_SC, A_BTC) assert kraken_to_world_pair('SCEUR') == (A_SC, A_EUR) assert kraken_to_world_pair('WAVESUSD') == (A_WAVES, A_USD) assert kraken_to_world_pair('XXBTZGBP.d') == (A_BTC, A_GBP) assert kraken_to_world_pair('ETHCHF') == (A_ETH, A_CHF) assert kraken_to_world_pair('XBTCHF') == (A_BTC, A_CHF) assert kraken_to_world_pair('EURCAD') == (A_EUR, A_CAD) assert kraken_to_world_pair('USDCHF') == (A_USD, A_CHF) assert kraken_to_world_pair('EURJPY') == (A_EUR, A_JPY) assert kraken_to_world_pair('LTCETH') == (A_LTC, A_ETH) assert kraken_to_world_pair('LTCUSDT') == (A_LTC, A_USDT) assert kraken_to_world_pair('XRPGBP') == (A_XRP, A_GBP) assert kraken_to_world_pair('XRPUSDT') == (A_XRP, A_USDT) assert kraken_to_world_pair('AUDJPY') == (A_AUD, A_JPY) assert kraken_to_world_pair('ETH2.SETH') == (A_ETH2, A_ETH) assert kraken_to_world_pair('EWTEUR') == (A_EWT, A_EUR) assert kraken_to_world_pair('EWTGBP') == (A_EWT, A_GBP) assert kraken_to_world_pair('EWTXBT') == (A_EWT, A_BTC) assert kraken_to_world_pair('OCEANEUR') == (A_OCEAN, A_EUR) assert kraken_to_world_pair('OCEANGBP') == (A_OCEAN, A_GBP) assert kraken_to_world_pair('OCEANUSD') == (A_OCEAN, A_USD) assert kraken_to_world_pair('OCEANXBT') == (A_OCEAN, A_BTC) # now try to test all pairs that kraken returns and if one does not work note # down a test warning so that it can be fixed by us later pairs = kraken.api_query('AssetPairs').keys() for pair in pairs: try: kraken_to_world_pair(pair) except (UnknownAsset, UnprocessableTradePair, DeserializationError) as e: test_warnings.warn( UserWarning( f'Could not process kraken pair {pair} due to {str(e)}', )) # Finally test that wrong pairs raise proper exception with pytest.raises(UnprocessableTradePair): kraken_to_world_pair('GABOOBABOO')