def query_deposits_withdrawals(self, start_ts, end_ts, end_at_least_ts): with self.lock: cache = self.check_trades_cache( start_ts, end_at_least_ts, special_name='deposits_withdrawals') if cache is None: result = self.returnDepositsWithdrawals(start_ts, end_ts) with self.lock: self.update_trades_cache(result, start_ts, end_ts, special_name='deposits_withdrawals') else: result = cache movements = list() for withdrawal in result['withdrawals']: movements.append( AssetMovement(exchange='poloniex', category='withdrawal', timestamp=withdrawal['timestamp'], asset=withdrawal['currency'], amount=FVal(withdrawal['amount']), fee=FVal(withdrawal['fee']))) for deposit in result['deposits']: movements.append( AssetMovement(exchange='poloniex', category='deposit', timestamp=deposit['timestamp'], asset=deposit['currency'], amount=FVal(deposit['amount']), fee=0)) return movements
def query_deposits_withdrawals( self, start_ts: Timestamp, end_ts: Timestamp, end_at_least_ts: Timestamp, ) -> List: with self.lock: cache = self.check_trades_cache( start_ts, end_at_least_ts, special_name='deposits_withdrawals', ) cache = cast(Dict, cache) if cache is None: result = self.returnDepositsWithdrawals(start_ts, end_ts) with self.lock: self.update_trades_cache( result, start_ts, end_ts, special_name='deposits_withdrawals', ) else: result = cache log.debug( 'Poloniex deposits/withdrawal query', results_num=len(result['withdrawals']) + len(result['deposits']), ) movements = list() for withdrawal in result['withdrawals']: movements.append( AssetMovement( exchange='poloniex', category='withdrawal', timestamp=withdrawal['timestamp'], asset=withdrawal['currency'], amount=FVal(withdrawal['amount']), fee=FVal(withdrawal['fee']), )) for deposit in result['deposits']: movements.append( AssetMovement( exchange='poloniex', category='deposit', timestamp=deposit['timestamp'], asset=deposit['currency'], amount=FVal(deposit['amount']), fee=0, )) return movements
def test_bitmex_api_withdrawals_deposit(test_bitmex): result = test_bitmex.query_deposits_withdrawals( start_ts=1536492800, end_ts=1536492976, end_at_least_ts=1536492976, ) assert len(result) == 0 now = ts_now() result = test_bitmex.query_deposits_withdrawals( start_ts=0, end_ts=now, end_at_least_ts=now, ) expected_result = [ AssetMovement( exchange='bitmex', category='Deposit', timestamp=1537014656, asset='BTC', amount=FVal(0.16960386), fee=FVal(0E-8), ), AssetMovement( exchange='bitmex', category='Deposit', timestamp=1536563759, asset='BTC', amount=FVal('0.38474377'), fee=FVal(0), ), AssetMovement( exchange='bitmex', category='Withdrawal', timestamp=1536536706, asset='BTC', amount=FVal('0.00700000'), fee=FVal('0.00300000'), ), AssetMovement( exchange='bitmex', category='Deposit', timestamp=1536486277, asset='BTC', amount=FVal('0.46966992'), fee=FVal(0), ), ] assert result == expected_result
def query_deposits_withdrawals( self, start_ts: Timestamp, end_ts: Timestamp, end_at_least_ts: Timestamp, ) -> List: with self.lock: cache = self.check_trades_cache( start_ts, end_at_least_ts, special_name='deposits_withdrawals', ) if cache is not None: result = cache else: result = self.query_until_finished( endpoint='Ledgers', keyname='ledger', start_ts=start_ts, end_ts=end_ts, extra_dict=dict(type='deposit'), ) result.extend( self.query_until_finished( endpoint='Ledgers', keyname='ledger', start_ts=start_ts, end_ts=end_ts, extra_dict=dict(type='withdrawal'), )) with self.lock: self.update_trades_cache( result, start_ts, end_ts, special_name='deposits_withdrawals', ) log.debug('Kraken deposit/withdrawals query result', num_results=len(result)) movements = list() for movement in result: movements.append( AssetMovement( exchange='kraken', category=movement['type'], # Kraken timestamps have floating point timestamp=convert_to_int(movement['time'], accept_only_exact=False), asset=asset_from_kraken(movement['asset']), amount=FVal(movement['amount']), fee=FVal(movement['fee']), )) return movements
def query_deposits_withdrawals( self, start_ts: typing.Timestamp, end_ts: typing.Timestamp, end_at_least_ts: typing.Timestamp, market: Optional[str] = None, count: Optional[int] = None, ) -> List: # TODO: Implement cache like in other exchange calls try: resp = self._api_query('get', 'user/walletHistory') except RemoteError as e: msg = ( 'Bitmex API request failed. Could not reach bitmex due ' 'to {}'.format(e) ) log.error(msg) return list() log.debug('Bitmex deposit/withdrawals query', results_num=len(resp)) movements = list() for movement in resp: transaction_type = movement['transactType'] if transaction_type not in ('Deposit', 'Withdrawal'): continue timestamp = iso8601ts_to_timestamp(movement['timestamp']) if timestamp < start_ts: continue if timestamp > end_ts: continue asset = bitmex_to_world(movement['currency']) amount = FVal(movement['amount']) fee = FVal(0) if movement['fee'] is not None: fee = FVal(movement['fee']) # bitmex has negative numbers for withdrawals if amount < 0: amount *= -1 if asset == 'BTC': # bitmex stores amounts in satoshis amount = satoshis_to_btc(amount) fee = satoshis_to_btc(fee) movements.append(AssetMovement( exchange='bitmex', category=transaction_type, timestamp=timestamp, asset=asset, amount=amount, fee=fee, )) return movements
def query_deposits_withdrawals( self, start_ts: Timestamp, end_ts: Timestamp, end_at_least_ts: Timestamp, ) -> List[AssetMovement]: with self.lock: cache = self.check_trades_cache_list( start_ts, end_at_least_ts, special_name='deposits_withdrawals', ) result: List[Any] if cache is not None: result = cache else: result = self.query_until_finished( endpoint='Ledgers', keyname='ledger', start_ts=start_ts, end_ts=end_ts, extra_dict=dict(type='deposit'), ) result.extend( self.query_until_finished( endpoint='Ledgers', keyname='ledger', start_ts=start_ts, end_ts=end_ts, extra_dict=dict(type='withdrawal'), )) with self.lock: self.update_trades_cache( result, start_ts, end_ts, special_name='deposits_withdrawals', ) log.debug('Kraken deposit/withdrawals query result', num_results=len(result)) movements = list() for movement in result: try: movements.append( AssetMovement( exchange='kraken', category=movement['type'], # Kraken timestamps have floating point timestamp=Timestamp( convert_to_int(movement['time'], accept_only_exact=False)), asset=asset_from_kraken(movement['asset']), amount=FVal(movement['amount']), fee=Fee(FVal(movement['fee'])), )) except UnknownAsset as e: self.msg_aggregator.add_warning( f'Found unknown kraken asset {e.asset_name}. ' f'Ignoring its deposit/withdrawals query.', ) continue return movements
def query_deposits_withdrawals( self, start_ts: Timestamp, end_ts: Timestamp, end_at_least_ts: Timestamp, ) -> List[AssetMovement]: with self.lock: cache = self.check_trades_cache_dict( start_ts, end_at_least_ts, special_name='deposits_withdrawals', ) if cache is None: result = self.returnDepositsWithdrawals(start_ts, end_ts) with self.lock: self.update_trades_cache( result, start_ts, end_ts, special_name='deposits_withdrawals', ) else: result = cache log.debug( 'Poloniex deposits/withdrawal query', results_num=len(result['withdrawals']) + len(result['deposits']), ) movements = list() for withdrawal in result['withdrawals']: try: movements.append(AssetMovement( exchange='poloniex', category='withdrawal', timestamp=withdrawal['timestamp'], asset=asset_from_poloniex(withdrawal['currency']), amount=FVal(withdrawal['amount']), fee=Fee(FVal(withdrawal['fee'])), )) except UnsupportedAsset as e: self.msg_aggregator.add_warning( f'Found withdrawal of unsupported poloniex asset {e.asset_name}. Ignoring it.', ) continue except UnknownAsset as e: self.msg_aggregator.add_warning( f'Found withdrawal of unknown poloniex asset {e.asset_name}. Ignoring it.', ) continue for deposit in result['deposits']: try: movements.append(AssetMovement( exchange='poloniex', category='deposit', timestamp=deposit['timestamp'], asset=asset_from_poloniex(deposit['currency']), amount=FVal(deposit['amount']), fee=Fee(ZERO), )) except UnsupportedAsset as e: self.msg_aggregator.add_warning( f'Found deposit of unsupported poloniex asset {e.asset_name}. Ignoring it.', ) continue except UnknownAsset as e: self.msg_aggregator.add_warning( f'Found deposit of unknown poloniex asset {e.asset_name}. Ignoring it.', ) continue return movements
def query_deposits_withdrawals( self, start_ts: Timestamp, end_ts: Timestamp, end_at_least_ts: Timestamp, ) -> List[AssetMovement]: with self.lock: cache = self.check_trades_cache_dict( start_ts, end_at_least_ts, special_name='deposits_withdrawals', ) if cache is None: result = self.returnDepositsWithdrawals(start_ts, end_ts) with self.lock: self.update_trades_cache( result, start_ts, end_ts, special_name='deposits_withdrawals', ) else: result = cache log.debug( 'Poloniex deposits/withdrawal query', results_num=len(result['withdrawals']) + len(result['deposits']), ) movements = list() for withdrawal in result['withdrawals']: try: movements.append( AssetMovement( exchange='poloniex', category='withdrawal', timestamp=deserialize_timestamp( withdrawal['timestamp']), asset=asset_from_poloniex(withdrawal['currency']), amount=deserialize_asset_amount(withdrawal['amount']), fee=deserialize_fee(withdrawal['fee']), )) except UnsupportedAsset as e: self.msg_aggregator.add_warning( f'Found withdrawal of unsupported poloniex asset {e.asset_name}. Ignoring it.', ) continue except UnknownAsset as e: self.msg_aggregator.add_warning( f'Found withdrawal of unknown poloniex asset {e.asset_name}. Ignoring it.', ) continue except DeserializationError as e: log.error( f'Unexpected data encountered during deserialization of poloniex ' f'withdrawal: {withdrawal}. Error was: {str(e)}', ) self.msg_aggregator.add_warning( f'Unexpected data encountered during deserialization of a poloniex ' f'withdrawal. Check logs for details and open a bug report.', ) for deposit in result['deposits']: try: movements.append( AssetMovement( exchange='poloniex', category='deposit', timestamp=deserialize_timestamp(deposit['timestamp']), asset=asset_from_poloniex(deposit['currency']), amount=deserialize_asset_amount(FVal( deposit['amount'])), fee=Fee(ZERO), )) except UnsupportedAsset as e: self.msg_aggregator.add_warning( f'Found deposit of unsupported poloniex asset {e.asset_name}. Ignoring it.', ) continue except UnknownAsset as e: self.msg_aggregator.add_warning( f'Found deposit of unknown poloniex asset {e.asset_name}. Ignoring it.', ) continue except DeserializationError as e: log.error( f'Unexpected data encountered during deserialization of poloniex ' f'deposit: {deposit}. Error was: {str(e)}', ) self.msg_aggregator.add_warning( f'Unexpected data encountered during deserialization of a poloniex ' f'deposit. Check logs for details and open a bug report.', ) return movements