2017-10-06 10:22:04 +00:00
|
|
|
from abc import ABC, abstractmethod
|
2018-01-10 07:51:36 +00:00
|
|
|
from typing import Dict, List, Optional
|
2017-10-06 10:22:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Exchange(ABC):
|
|
|
|
@property
|
|
|
|
def name(self) -> str:
|
|
|
|
"""
|
|
|
|
Name of the exchange.
|
|
|
|
:return: str representation of the class name
|
|
|
|
"""
|
|
|
|
return self.__class__.__name__
|
|
|
|
|
2017-10-31 23:13:23 +00:00
|
|
|
@property
|
|
|
|
def fee(self) -> float:
|
|
|
|
"""
|
|
|
|
Fee for placing an order
|
|
|
|
:return: percentage in float
|
|
|
|
"""
|
|
|
|
|
2017-10-06 10:22:04 +00:00
|
|
|
@abstractmethod
|
|
|
|
def buy(self, pair: str, rate: float, amount: float) -> str:
|
|
|
|
"""
|
|
|
|
Places a limit buy order.
|
|
|
|
:param pair: Pair as str, format: BTC_ETH
|
|
|
|
:param rate: Rate limit for order
|
|
|
|
:param amount: The amount to purchase
|
|
|
|
:return: order_id of the placed buy order
|
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def sell(self, pair: str, rate: float, amount: float) -> str:
|
|
|
|
"""
|
|
|
|
Places a limit sell order.
|
|
|
|
:param pair: Pair as str, format: BTC_ETH
|
|
|
|
:param rate: Rate limit for order
|
|
|
|
:param amount: The amount to sell
|
|
|
|
:return: order_id of the placed sell order
|
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def get_balance(self, currency: str) -> float:
|
|
|
|
"""
|
|
|
|
Gets account balance.
|
|
|
|
:param currency: Currency as str, format: BTC
|
|
|
|
:return: float
|
|
|
|
"""
|
|
|
|
|
2017-10-29 15:57:57 +00:00
|
|
|
@abstractmethod
|
|
|
|
def get_balances(self) -> List[dict]:
|
|
|
|
"""
|
|
|
|
Gets account balances across currencies
|
|
|
|
:return: List of dicts, format: [
|
|
|
|
{
|
|
|
|
'Currency': str,
|
|
|
|
'Balance': float,
|
|
|
|
'Available': float,
|
|
|
|
'Pending': float,
|
|
|
|
}
|
|
|
|
...
|
|
|
|
]
|
|
|
|
"""
|
|
|
|
|
2017-10-06 10:22:04 +00:00
|
|
|
@abstractmethod
|
2018-01-02 09:56:42 +00:00
|
|
|
def get_ticker(self, pair: str, refresh: Optional[bool] = True) -> dict:
|
2017-10-06 10:22:04 +00:00
|
|
|
"""
|
|
|
|
Gets ticker for given pair.
|
|
|
|
:param pair: Pair as str, format: BTC_ETC
|
2018-01-03 16:51:01 +00:00
|
|
|
:param refresh: Shall we query a new value or a cached value is enough
|
2017-10-06 10:22:04 +00:00
|
|
|
:return: dict, format: {
|
|
|
|
'bid': float,
|
|
|
|
'ask': float,
|
|
|
|
'last': float
|
|
|
|
}
|
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
2017-11-13 18:54:09 +00:00
|
|
|
def get_ticker_history(self, pair: str, tick_interval: int) -> List[Dict]:
|
2017-10-06 10:22:04 +00:00
|
|
|
"""
|
|
|
|
Gets ticker history for given pair.
|
|
|
|
:param pair: Pair as str, format: BTC_ETC
|
2017-11-07 17:41:48 +00:00
|
|
|
:param tick_interval: ticker interval in minutes
|
2017-11-05 22:47:59 +00:00
|
|
|
:return: list, format: [
|
|
|
|
{
|
|
|
|
'O': float, (Open)
|
|
|
|
'H': float, (High)
|
|
|
|
'L': float, (Low)
|
|
|
|
'C': float, (Close)
|
|
|
|
'V': float, (Volume)
|
|
|
|
'T': datetime, (Time)
|
|
|
|
'BV': float, (Base Volume)
|
|
|
|
},
|
|
|
|
...
|
|
|
|
]
|
2017-10-06 10:22:04 +00:00
|
|
|
"""
|
|
|
|
|
2017-10-31 23:13:23 +00:00
|
|
|
def get_order(self, order_id: str) -> Dict:
|
2017-10-06 10:22:04 +00:00
|
|
|
"""
|
2017-10-31 23:13:23 +00:00
|
|
|
Get order details for the given order_id.
|
2017-10-06 10:22:04 +00:00
|
|
|
:param order_id: ID as str
|
2017-10-31 23:13:23 +00:00
|
|
|
:return: dict, format: {
|
|
|
|
'id': str,
|
|
|
|
'type': str,
|
|
|
|
'pair': str,
|
|
|
|
'opened': str ISO 8601 datetime,
|
|
|
|
'closed': str ISO 8601 datetime,
|
|
|
|
'rate': float,
|
|
|
|
'amount': float,
|
|
|
|
'remaining': int
|
|
|
|
}
|
2017-10-06 10:22:04 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
2017-10-31 23:13:23 +00:00
|
|
|
def cancel_order(self, order_id: str) -> None:
|
2017-10-06 10:22:04 +00:00
|
|
|
"""
|
2017-10-31 23:13:23 +00:00
|
|
|
Cancels order for given order_id.
|
|
|
|
:param order_id: ID as str
|
|
|
|
:return: None
|
2017-10-06 10:22:04 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def get_pair_detail_url(self, pair: str) -> str:
|
|
|
|
"""
|
|
|
|
Returns the market detail url for the given pair.
|
|
|
|
:param pair: Pair as str, format: BTC_ETC
|
|
|
|
:return: URL as str
|
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def get_markets(self) -> List[str]:
|
|
|
|
"""
|
|
|
|
Returns all available markets.
|
|
|
|
:return: List of all available pairs
|
|
|
|
"""
|
2017-11-11 18:20:16 +00:00
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def get_market_summaries(self) -> List[Dict]:
|
|
|
|
"""
|
|
|
|
Returns a 24h market summary for all available markets
|
|
|
|
:return: list, format: [
|
|
|
|
{
|
|
|
|
'MarketName': str,
|
|
|
|
'High': float,
|
|
|
|
'Low': float,
|
|
|
|
'Volume': float,
|
|
|
|
'Last': float,
|
|
|
|
'TimeStamp': datetime,
|
|
|
|
'BaseVolume': float,
|
|
|
|
'Bid': float,
|
|
|
|
'Ask': float,
|
|
|
|
'OpenBuyOrders': int,
|
|
|
|
'OpenSellOrders': int,
|
|
|
|
'PrevDay': float,
|
|
|
|
'Created': datetime
|
|
|
|
},
|
|
|
|
...
|
|
|
|
]
|
|
|
|
"""
|
2017-11-13 20:34:47 +00:00
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def get_wallet_health(self) -> List[Dict]:
|
|
|
|
"""
|
|
|
|
Returns a list of all wallet health information
|
|
|
|
:return: list, format: [
|
|
|
|
{
|
|
|
|
'Currency': str,
|
|
|
|
'IsActive': bool,
|
|
|
|
'LastChecked': str,
|
|
|
|
'Notice': str
|
|
|
|
},
|
|
|
|
...
|
|
|
|
"""
|