Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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