Module jumpscale.clients.btc_alpha.btc_alpha

BTC_ALPHA client

interacts with btc-alpha.com to provides trading operations and broadcasting of all trading events.

requirments

you need a key and a secret for your account. - make an account from: https://btc-alpha.com/en/accounts/api/settings/ - go to settings - api and create api key

make a new client

> test_client = j.clients.btc_alpha.get("my_client", key_="*******", secret_="*****")
> test_client.save()

use the client

  • you can inquire, exchange, order.
  • example: test_client.get_currencies()
    also pprint for more readable response
from pprint import pprint
pprint(test_client.get_currencies())

see what other methods do at: https://btc-alpha.github.io/api-docs

Expand source code
"""
## BTC_ALPHA client
interacts with btc-alpha.com to provides trading operations and broadcasting of all trading events.

### requirments
you need a key and a secret for your account.
- make an account from: https://btc-alpha.com/en/accounts/api/settings/
- go to settings - api and create api key

### make a new client
```
> test_client = j.clients.btc_alpha.get("my_client", key_="*******", secret_="*****")
> test_client.save()
```

### use the client
- you can inquire, exchange, order.
* example: `test_client.get_currencies()` <br/>
also pprint for more readable response
```
from pprint import pprint
pprint(test_client.get_currencies())
```
see what other methods do at: https://btc-alpha.github.io/api-docs

"""

import hmac
from time import time
from urllib.parse import urlencode

import requests
from jumpscale.clients.base import Client
from jumpscale.core.base import fields
from jumpscale.loader import j


class BTCAlpha(Client):
    _url = fields.String(default="https://btc-alpha.com/api/")
    token_id = fields.String(default="")
    token_secret = fields.Secret(default="")

    def get_currencies(self):
        """Returns all active currencies
        :return: array of currencies
        Example: [{'sign': 'Ƀ', 'short_name': 'BTC'}, {'sign': 'Ξ', 'short_name': 'ETH'}, ...]
        """
        return self._query("get", "v1/currencies/")

    def get_pairs(self, **kwargs):
        """Returns all active pairs
        :param kwargs: Filters (Optional): currency1, currency2
        :return: pairs array
        Example: [{'currency2': 'USD', 'maximum_order_size': '100000000.00000000', 'minimum_order_size': '0.00000001',
                'currency1': 'BTC', 'name': 'BTC_USD', 'price_precision': 3}, ... ]
        """
        return self._query("get", "v1/pairs/", params=kwargs)

    def get_wallets(self, **kwargs):
        """Returns own wallets
        :param kwargs: Filters (Optional): currency_id
        :return: wallets array
        Example: [{'currency': 'BTC', 'balance': '0.00000000', 'reserve': '0.00000000'}, ...]
        """
        return self._query("get", "v1/wallets/", params=kwargs, auth=True)

    def get_own_sell_orders(self, **kwargs):
        """ Returns own sell orders """
        kwargs["type"] = "sell"
        return self._query("get", "v1/orders/own/", params=kwargs, auth=True)

    def get_own_buy_orders(self, **kwargs):
        """ Returns own buy orders """
        kwargs["type"] = "buy"
        return self._query("get", "v1/orders/own/", params=kwargs, auth=True)

    def create_sell_order(self, pair, amount, price):
        """Create sell order
        :param pair: Pair (BTC_USD,)
        :param amount: Amount of order - string
        :param price: Price of order - string
        :return: order info
        Example: {
        'type': 'buy', 'date': 1483721079.51632, 'oid': '11268', 'price': '870.69000000', 'amount': '0.00000000',
        'trades': [{'type': 'sell', 'price': '870.69000000', 'o_id': '11266', 'amount': '0.00010000', 'tid': '6049'}]
        }
        """
        data = {"pair": pair, "amount": amount, "price": price, "type": "sell"}
        return self._query("post", "v1/order/", data=data, auth=True)

    def create_buy_order(self, pair, amount, price):
        """ Create buy order """
        data = {"pair": pair, "amount": amount, "price": price, "type": "buy"}
        return self._query("post", "v1/order/", data=data, auth=True)

    def cancel_order(self, oid):
        """Cancel order
        :param oid: id of order
        Example: {
            order: 63568
        }
        """
        data = {"order": oid}
        return self._query("post", "v1/order-cancel/", data=data, auth=True)

    def get_exchanges(self, **kwargs):
        """Returns last exchanges
        :param kwargs: Filters (Optional): pair, limit
        :return: exchanges array
        Example: [{'id': 6030, 'price': '839.36000000', 'pair': 'BTC_USD', 'type': 1, 'timestamp': 1483705817.735508,
                'amount': '0.00281167'}, ....]
        """
        return self._query("get", "v1/exchanges/", params=kwargs)

    def get_own_exchanges(self, **kwargs):
        """Returns only own exchanges
        :param kwargs: see get_exchanges()
        :return: see get_exchanges()
        """
        return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)

    def get_own_sell_exchanges(self, **kwargs):
        kwargs["type"] = "sell"
        return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)

    def get_own_buy_exchanges(self, **kwargs):
        kwargs["type"] = "buy"
        return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)

    def get_deposits(self):
        """Returns all made deposits
        :return: deposits array
        Example [{'timestamp': 1485363039.18359, 'id': 317, 'currency': 'BTC', 'amount': '530.00000000'}, ... ]
        """
        return self._query("get", "v1/deposits/", auth=True)

    def get_withdraws(self, **kwargs):
        """Returns all made withdraws
        :param kwargs: currency_id, status
        :return: withdraws array
        Example: [{'id': 403, 'timestamp': 1485363466.868539, 'currency': 'BTC', 'amount': '0.53000000', 'status': 20} ...]
        """

        return self._query("get", "v1/withdraws/", params=kwargs, auth=True)

    def get_orderbook(self, pair, **kwargs):
        """Return sell and buy orders for specified pair
        :param kwargs: limit_bids, limit_asks, group
        :return: object {'bids': Array, 'asks': Array}
        Example: {
            'bids': [{'price': 911.519, 'id': 44667, 'amount': 0.000446, 'timestamp': 1485777324.410015}],
            'asks': [{'price': 911.122, 'id': 44647, 'amount': 0.001233, 'timestamp': 1485777124.415542}]
        }
        """

        return self._query("get", f"v1/orderbook/{pair}/", params=kwargs)

    def get_charts(self, pair, type, **kwargs):
        """Return data for chart candles
        :param pair: Pair name
        :param type: Type of candles ('1','5','15','30','60','240','D')
        :param kwargs: since, until, limit
        :return: array of bars
        Example [
            {'volume': 0.262929, 'high': 912.236, 'low': 910.086, 'close': 911.915, 'time': 1485777600, 'open': 910.424},
            {'volume': 2.16483814, 'high': 911.519, 'low': 909.432, 'close': 910.424, 'time': 1485774000, 'open': 909.433}
        ]
        """
        return self._query("get", f"charts/{pair}/{type}/chart", params=kwargs)

    def _query(self, method, path, params=None, data=None, auth=False):
        url = f"{self._url}{path}"
        headers = data and self._get_headers(data)
        response = requests.request(method=method, url=url, params=params, data=data, auth=auth, headers=headers)

        if 300 > response.status_code >= 200:
            return response.json()
        else:
            raise j.exceptions.Value(f"Http status {response.status_code} - {response.content}")

    def _get_headers(self, data):
        msg = self.token_id + urlencode(sorted(data.items(), key=lambda val: val[0]))

        sign = hmac.new(self.token_secret.encode(), msg.encode(), digestmod="sha256").hexdigest()

        return {"X-KEY": self.token_id, "X-SIGN": sign, "X-NONCE": str(int(time() * 1000))}

Classes

class BTCAlpha (parent_=None, instance_name_=None, **values)

A simple attribute-based namespace.

SimpleNamespace(**kwargs)

base class implementation for any class with fields which supports getting/setting raw data for any instance fields.

any instance can have an optional name and a parent.

class Person(Base):
    name = fields.String()
    age = fields.Float()

p = Person(name="ahmed", age="19")
print(p.name, p.age)

Args

parent_ : Base, optional
parent instance. Defaults to None.
instance_name_ : str, optional
instance name. Defaults to None.
**values
any given field values to initiate the instance with
Expand source code
class BTCAlpha(Client):
    _url = fields.String(default="https://btc-alpha.com/api/")
    token_id = fields.String(default="")
    token_secret = fields.Secret(default="")

    def get_currencies(self):
        """Returns all active currencies
        :return: array of currencies
        Example: [{'sign': 'Ƀ', 'short_name': 'BTC'}, {'sign': 'Ξ', 'short_name': 'ETH'}, ...]
        """
        return self._query("get", "v1/currencies/")

    def get_pairs(self, **kwargs):
        """Returns all active pairs
        :param kwargs: Filters (Optional): currency1, currency2
        :return: pairs array
        Example: [{'currency2': 'USD', 'maximum_order_size': '100000000.00000000', 'minimum_order_size': '0.00000001',
                'currency1': 'BTC', 'name': 'BTC_USD', 'price_precision': 3}, ... ]
        """
        return self._query("get", "v1/pairs/", params=kwargs)

    def get_wallets(self, **kwargs):
        """Returns own wallets
        :param kwargs: Filters (Optional): currency_id
        :return: wallets array
        Example: [{'currency': 'BTC', 'balance': '0.00000000', 'reserve': '0.00000000'}, ...]
        """
        return self._query("get", "v1/wallets/", params=kwargs, auth=True)

    def get_own_sell_orders(self, **kwargs):
        """ Returns own sell orders """
        kwargs["type"] = "sell"
        return self._query("get", "v1/orders/own/", params=kwargs, auth=True)

    def get_own_buy_orders(self, **kwargs):
        """ Returns own buy orders """
        kwargs["type"] = "buy"
        return self._query("get", "v1/orders/own/", params=kwargs, auth=True)

    def create_sell_order(self, pair, amount, price):
        """Create sell order
        :param pair: Pair (BTC_USD,)
        :param amount: Amount of order - string
        :param price: Price of order - string
        :return: order info
        Example: {
        'type': 'buy', 'date': 1483721079.51632, 'oid': '11268', 'price': '870.69000000', 'amount': '0.00000000',
        'trades': [{'type': 'sell', 'price': '870.69000000', 'o_id': '11266', 'amount': '0.00010000', 'tid': '6049'}]
        }
        """
        data = {"pair": pair, "amount": amount, "price": price, "type": "sell"}
        return self._query("post", "v1/order/", data=data, auth=True)

    def create_buy_order(self, pair, amount, price):
        """ Create buy order """
        data = {"pair": pair, "amount": amount, "price": price, "type": "buy"}
        return self._query("post", "v1/order/", data=data, auth=True)

    def cancel_order(self, oid):
        """Cancel order
        :param oid: id of order
        Example: {
            order: 63568
        }
        """
        data = {"order": oid}
        return self._query("post", "v1/order-cancel/", data=data, auth=True)

    def get_exchanges(self, **kwargs):
        """Returns last exchanges
        :param kwargs: Filters (Optional): pair, limit
        :return: exchanges array
        Example: [{'id': 6030, 'price': '839.36000000', 'pair': 'BTC_USD', 'type': 1, 'timestamp': 1483705817.735508,
                'amount': '0.00281167'}, ....]
        """
        return self._query("get", "v1/exchanges/", params=kwargs)

    def get_own_exchanges(self, **kwargs):
        """Returns only own exchanges
        :param kwargs: see get_exchanges()
        :return: see get_exchanges()
        """
        return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)

    def get_own_sell_exchanges(self, **kwargs):
        kwargs["type"] = "sell"
        return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)

    def get_own_buy_exchanges(self, **kwargs):
        kwargs["type"] = "buy"
        return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)

    def get_deposits(self):
        """Returns all made deposits
        :return: deposits array
        Example [{'timestamp': 1485363039.18359, 'id': 317, 'currency': 'BTC', 'amount': '530.00000000'}, ... ]
        """
        return self._query("get", "v1/deposits/", auth=True)

    def get_withdraws(self, **kwargs):
        """Returns all made withdraws
        :param kwargs: currency_id, status
        :return: withdraws array
        Example: [{'id': 403, 'timestamp': 1485363466.868539, 'currency': 'BTC', 'amount': '0.53000000', 'status': 20} ...]
        """

        return self._query("get", "v1/withdraws/", params=kwargs, auth=True)

    def get_orderbook(self, pair, **kwargs):
        """Return sell and buy orders for specified pair
        :param kwargs: limit_bids, limit_asks, group
        :return: object {'bids': Array, 'asks': Array}
        Example: {
            'bids': [{'price': 911.519, 'id': 44667, 'amount': 0.000446, 'timestamp': 1485777324.410015}],
            'asks': [{'price': 911.122, 'id': 44647, 'amount': 0.001233, 'timestamp': 1485777124.415542}]
        }
        """

        return self._query("get", f"v1/orderbook/{pair}/", params=kwargs)

    def get_charts(self, pair, type, **kwargs):
        """Return data for chart candles
        :param pair: Pair name
        :param type: Type of candles ('1','5','15','30','60','240','D')
        :param kwargs: since, until, limit
        :return: array of bars
        Example [
            {'volume': 0.262929, 'high': 912.236, 'low': 910.086, 'close': 911.915, 'time': 1485777600, 'open': 910.424},
            {'volume': 2.16483814, 'high': 911.519, 'low': 909.432, 'close': 910.424, 'time': 1485774000, 'open': 909.433}
        ]
        """
        return self._query("get", f"charts/{pair}/{type}/chart", params=kwargs)

    def _query(self, method, path, params=None, data=None, auth=False):
        url = f"{self._url}{path}"
        headers = data and self._get_headers(data)
        response = requests.request(method=method, url=url, params=params, data=data, auth=auth, headers=headers)

        if 300 > response.status_code >= 200:
            return response.json()
        else:
            raise j.exceptions.Value(f"Http status {response.status_code} - {response.content}")

    def _get_headers(self, data):
        msg = self.token_id + urlencode(sorted(data.items(), key=lambda val: val[0]))

        sign = hmac.new(self.token_secret.encode(), msg.encode(), digestmod="sha256").hexdigest()

        return {"X-KEY": self.token_id, "X-SIGN": sign, "X-NONCE": str(int(time() * 1000))}

Ancestors

Instance variables

var token_id

getter method this property

will call _get_value, which would if the value is already defined and will get the default value if not

Returns

any
the field value
Expand source code
def getter(self):
    """
    getter method this property

    will call `_get_value`, which would if the value is already defined
    and will get the default value if not

    Returns:
        any: the field value
    """
    return self._get_value(name, field)
var token_secret

getter method this property

will call _get_value, which would if the value is already defined and will get the default value if not

Returns

any
the field value
Expand source code
def getter(self):
    """
    getter method this property

    will call `_get_value`, which would if the value is already defined
    and will get the default value if not

    Returns:
        any: the field value
    """
    return self._get_value(name, field)

Methods

def cancel_order(self, oid)

Cancel order :param oid: id of order Example: { order: 63568 }

Expand source code
def cancel_order(self, oid):
    """Cancel order
    :param oid: id of order
    Example: {
        order: 63568
    }
    """
    data = {"order": oid}
    return self._query("post", "v1/order-cancel/", data=data, auth=True)
def create_buy_order(self, pair, amount, price)

Create buy order

Expand source code
def create_buy_order(self, pair, amount, price):
    """ Create buy order """
    data = {"pair": pair, "amount": amount, "price": price, "type": "buy"}
    return self._query("post", "v1/order/", data=data, auth=True)
def create_sell_order(self, pair, amount, price)

Create sell order :param pair: Pair (BTC_USD,) :param amount: Amount of order - string :param price: Price of order - string :return: order info Example: { 'type': 'buy', 'date': 1483721079.51632, 'oid': '11268', 'price': '870.69000000', 'amount': '0.00000000', 'trades': [{'type': 'sell', 'price': '870.69000000', 'o_id': '11266', 'amount': '0.00010000', 'tid': '6049'}] }

Expand source code
def create_sell_order(self, pair, amount, price):
    """Create sell order
    :param pair: Pair (BTC_USD,)
    :param amount: Amount of order - string
    :param price: Price of order - string
    :return: order info
    Example: {
    'type': 'buy', 'date': 1483721079.51632, 'oid': '11268', 'price': '870.69000000', 'amount': '0.00000000',
    'trades': [{'type': 'sell', 'price': '870.69000000', 'o_id': '11266', 'amount': '0.00010000', 'tid': '6049'}]
    }
    """
    data = {"pair": pair, "amount": amount, "price": price, "type": "sell"}
    return self._query("post", "v1/order/", data=data, auth=True)
def get_charts(self, pair, type, **kwargs)

Return data for chart candles :param pair: Pair name :param type: Type of candles ('1','5','15','30','60','240','D') :param kwargs: since, until, limit :return: array of bars Example [ {'volume': 0.262929, 'high': 912.236, 'low': 910.086, 'close': 911.915, 'time': 1485777600, 'open': 910.424}, {'volume': 2.16483814, 'high': 911.519, 'low': 909.432, 'close': 910.424, 'time': 1485774000, 'open': 909.433} ]

Expand source code
def get_charts(self, pair, type, **kwargs):
    """Return data for chart candles
    :param pair: Pair name
    :param type: Type of candles ('1','5','15','30','60','240','D')
    :param kwargs: since, until, limit
    :return: array of bars
    Example [
        {'volume': 0.262929, 'high': 912.236, 'low': 910.086, 'close': 911.915, 'time': 1485777600, 'open': 910.424},
        {'volume': 2.16483814, 'high': 911.519, 'low': 909.432, 'close': 910.424, 'time': 1485774000, 'open': 909.433}
    ]
    """
    return self._query("get", f"charts/{pair}/{type}/chart", params=kwargs)
def get_currencies(self)

Returns all active currencies :return: array of currencies Example: [{'sign': 'Ƀ', 'short_name': 'BTC'}, {'sign': 'Ξ', 'short_name': 'ETH'}, …]

Expand source code
def get_currencies(self):
    """Returns all active currencies
    :return: array of currencies
    Example: [{'sign': 'Ƀ', 'short_name': 'BTC'}, {'sign': 'Ξ', 'short_name': 'ETH'}, ...]
    """
    return self._query("get", "v1/currencies/")
def get_deposits(self)

Returns all made deposits :return: deposits array Example [{'timestamp': 1485363039.18359, 'id': 317, 'currency': 'BTC', 'amount': '530.00000000'}, … ]

Expand source code
def get_deposits(self):
    """Returns all made deposits
    :return: deposits array
    Example [{'timestamp': 1485363039.18359, 'id': 317, 'currency': 'BTC', 'amount': '530.00000000'}, ... ]
    """
    return self._query("get", "v1/deposits/", auth=True)
def get_exchanges(self, **kwargs)

Returns last exchanges :param kwargs: Filters (Optional): pair, limit :return: exchanges array Example: [{'id': 6030, 'price': '839.36000000', 'pair': 'BTC_USD', 'type': 1, 'timestamp': 1483705817.735508, 'amount': '0.00281167'}, ....]

Expand source code
def get_exchanges(self, **kwargs):
    """Returns last exchanges
    :param kwargs: Filters (Optional): pair, limit
    :return: exchanges array
    Example: [{'id': 6030, 'price': '839.36000000', 'pair': 'BTC_USD', 'type': 1, 'timestamp': 1483705817.735508,
            'amount': '0.00281167'}, ....]
    """
    return self._query("get", "v1/exchanges/", params=kwargs)
def get_orderbook(self, pair, **kwargs)

Return sell and buy orders for specified pair :param kwargs: limit_bids, limit_asks, group :return: object {'bids': Array, 'asks': Array} Example: { 'bids': [{'price': 911.519, 'id': 44667, 'amount': 0.000446, 'timestamp': 1485777324.410015}], 'asks': [{'price': 911.122, 'id': 44647, 'amount': 0.001233, 'timestamp': 1485777124.415542}] }

Expand source code
def get_orderbook(self, pair, **kwargs):
    """Return sell and buy orders for specified pair
    :param kwargs: limit_bids, limit_asks, group
    :return: object {'bids': Array, 'asks': Array}
    Example: {
        'bids': [{'price': 911.519, 'id': 44667, 'amount': 0.000446, 'timestamp': 1485777324.410015}],
        'asks': [{'price': 911.122, 'id': 44647, 'amount': 0.001233, 'timestamp': 1485777124.415542}]
    }
    """

    return self._query("get", f"v1/orderbook/{pair}/", params=kwargs)
def get_own_buy_exchanges(self, **kwargs)
Expand source code
def get_own_buy_exchanges(self, **kwargs):
    kwargs["type"] = "buy"
    return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)
def get_own_buy_orders(self, **kwargs)

Returns own buy orders

Expand source code
def get_own_buy_orders(self, **kwargs):
    """ Returns own buy orders """
    kwargs["type"] = "buy"
    return self._query("get", "v1/orders/own/", params=kwargs, auth=True)
def get_own_exchanges(self, **kwargs)

Returns only own exchanges :param kwargs: see get_exchanges() :return: see get_exchanges()

Expand source code
def get_own_exchanges(self, **kwargs):
    """Returns only own exchanges
    :param kwargs: see get_exchanges()
    :return: see get_exchanges()
    """
    return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)
def get_own_sell_exchanges(self, **kwargs)
Expand source code
def get_own_sell_exchanges(self, **kwargs):
    kwargs["type"] = "sell"
    return self._query("get", "v1/exchanges/own/", params=kwargs, auth=True)
def get_own_sell_orders(self, **kwargs)

Returns own sell orders

Expand source code
def get_own_sell_orders(self, **kwargs):
    """ Returns own sell orders """
    kwargs["type"] = "sell"
    return self._query("get", "v1/orders/own/", params=kwargs, auth=True)
def get_pairs(self, **kwargs)

Returns all active pairs :param kwargs: Filters (Optional): currency1, currency2 :return: pairs array Example: [{'currency2': 'USD', 'maximum_order_size': '100000000.00000000', 'minimum_order_size': '0.00000001', 'currency1': 'BTC', 'name': 'BTC_USD', 'price_precision': 3}, … ]

Expand source code
def get_pairs(self, **kwargs):
    """Returns all active pairs
    :param kwargs: Filters (Optional): currency1, currency2
    :return: pairs array
    Example: [{'currency2': 'USD', 'maximum_order_size': '100000000.00000000', 'minimum_order_size': '0.00000001',
            'currency1': 'BTC', 'name': 'BTC_USD', 'price_precision': 3}, ... ]
    """
    return self._query("get", "v1/pairs/", params=kwargs)
def get_wallets(self, **kwargs)

Returns own wallets :param kwargs: Filters (Optional): currency_id :return: wallets array Example: [{'currency': 'BTC', 'balance': '0.00000000', 'reserve': '0.00000000'}, …]

Expand source code
def get_wallets(self, **kwargs):
    """Returns own wallets
    :param kwargs: Filters (Optional): currency_id
    :return: wallets array
    Example: [{'currency': 'BTC', 'balance': '0.00000000', 'reserve': '0.00000000'}, ...]
    """
    return self._query("get", "v1/wallets/", params=kwargs, auth=True)
def get_withdraws(self, **kwargs)

Returns all made withdraws :param kwargs: currency_id, status :return: withdraws array Example: [{'id': 403, 'timestamp': 1485363466.868539, 'currency': 'BTC', 'amount': '0.53000000', 'status': 20} …]

Expand source code
def get_withdraws(self, **kwargs):
    """Returns all made withdraws
    :param kwargs: currency_id, status
    :return: withdraws array
    Example: [{'id': 403, 'timestamp': 1485363466.868539, 'currency': 'BTC', 'amount': '0.53000000', 'status': 20} ...]
    """

    return self._query("get", "v1/withdraws/", params=kwargs, auth=True)

Inherited members