8 Commits

Author SHA1 Message Date
Markus
436f692e4f Merge remote-tracking branch 'origin/master' into new-candle-drivers 2021-01-02 17:15:48 +01:00
Markus
4974b82c25 Merge remote-tracking branch 'origin/master' into new-candle-drivers 2020-12-27 20:24:31 +01:00
Markus
26471a26aa Merge remote-tracking branch 'origin/master' into new-candle-drivers 2020-12-16 11:21:09 +01:00
Markus
489039268f Merge remote-tracking branch 'origin/master' into coincap 2020-12-07 19:58:39 +01:00
Markus
443f82e5f7 Better error handling. 2020-11-24 17:32:08 +01:00
Markus
b4fc941a59 Add error for not found symbols. 2020-11-24 17:13:58 +01:00
Markus
a0d6f4c361 Remove backup and add limit for search. 2020-11-24 15:21:38 +01:00
Markus
bfb881cd16 Added coincap driver. 2020-11-24 15:02:25 +01:00
2 changed files with 119 additions and 0 deletions

View File

@@ -2,6 +2,7 @@ from .binance import Binance
from .binance_futures import BinanceFutures
from .bitfinex import Bitfinex
from .coinbase import Coinbase
from .coincap import Coincap
from .testnet_binance_futures import TestnetBinanceFutures
drivers = {
@@ -10,4 +11,5 @@ drivers = {
'Testnet Binance Futures': TestnetBinanceFutures,
'Bitfinex': Bitfinex,
'Coinbase': Coinbase,
'Coincap': Coincap,
}

View File

@@ -0,0 +1,117 @@
import requests
import jesse.helpers as jh
from jesse import exceptions
from .interface import CandleExchange
class Coincap(CandleExchange):
def __init__(self):
super().__init__('Coincap', 1440, 0.1)
self.endpoint = 'https://api.coincap.io/v2/'
def init_backup_exchange(self):
self.backup_exchange = None
def get_starting_time(self, symbol: str):
symbol_splited = symbol.split('-')
baseId = self.find_symbol_id(symbol_splited[0])
quoteId = self.find_symbol_id(symbol_splited[1])
payload = {
'interval': 'd1',
'exchange': 'binance',
'baseId': baseId,
'quoteId': quoteId,
}
response = requests.get(self.endpoint + 'candles', params=payload)
self._handle_errors(response)
data = response.json()['data']
# wrong symbol entered
if not len(data):
raise ValueError("No candles received to determine start_date.")
first_timestamp = int(data[0]['period'])
second_timestamp = first_timestamp + 60_000 * 1440
return second_timestamp
def fetch(self, symbol, start_timestamp):
end_timestamp = start_timestamp + (self.count - 1) * 60000
symbol_splited = symbol.split('-')
baseId = self.find_symbol_id(symbol_splited[0])
quoteId = self.find_symbol_id(symbol_splited[1])
payload = {
'start': start_timestamp,
'end': end_timestamp,
'interval': 'm1',
'exchange': 'binance',
'baseId': baseId,
'quoteId': quoteId,
}
response = requests.get(self.endpoint + 'candles', params=payload)
self._handle_errors(response)
data = response.json()['data']
candles = []
for d in data:
candles.append({
'id': jh.generate_unique_id(),
'symbol': symbol,
'exchange': self.name,
'timestamp': int(d['period']),
'open': float(d['open']),
'close': float(d['close']),
'high': float(d['high']),
'low': float(d['low']),
'volume': float(d['volume'])
})
return candles
def find_symbol_id(self, symbol):
payload = {
'search': symbol,
'limit': 1
}
response = requests.get(self.endpoint + 'assets', params=payload)
self._handle_errors(response)
data = response.json()['data']
if not data:
raise exceptions.SymbolNotFound("No asset found for {}. You're probably misspelling the symbol name.".format(symbol))
return data[0]['id']
@staticmethod
def _handle_errors(response):
first_digit_code = int(str(response.status_code)[0])
# Exchange In Maintenance
if first_digit_code == 5:
raise exceptions.ExchangeInMaintenance('Server ERROR. Please try again later')
# unsupported user params
if first_digit_code == 4:
raise ValueError(response.json()['error'])
if response.status_code != 200:
raise Exception(response.content)