mirror of
https://github.com/wassname/catalyst.git
synced 2026-06-27 23:21:36 +08:00
BLD: populating assets with help from CCXT
This commit is contained in:
@@ -401,6 +401,10 @@ cdef class TradingPair(Asset):
|
||||
cdef readonly object end_daily
|
||||
cdef readonly object end_minute
|
||||
cdef readonly object exchange_symbol
|
||||
cdef readonly float maker
|
||||
cdef readonly float taker
|
||||
cdef readonly int trading_state
|
||||
cdef readonly object data_source
|
||||
|
||||
_kwargnames = frozenset({
|
||||
'sid',
|
||||
@@ -418,7 +422,11 @@ cdef class TradingPair(Asset):
|
||||
'end_daily',
|
||||
'end_minute',
|
||||
'exchange_symbol',
|
||||
'min_trade_size'
|
||||
'min_trade_size',
|
||||
'maker',
|
||||
'taker',
|
||||
'trading_state',
|
||||
'data_source'
|
||||
})
|
||||
def __init__(self,
|
||||
object symbol,
|
||||
@@ -434,10 +442,14 @@ cdef class TradingPair(Asset):
|
||||
object first_traded=None,
|
||||
object auto_close_date=None,
|
||||
object exchange_full=None,
|
||||
object min_trade_size=None):
|
||||
float min_trade_size=0.000001,
|
||||
float maker=0.0015,
|
||||
float taker=0.0025,
|
||||
int trading_state=0,
|
||||
object data_source='catalyst'):
|
||||
"""
|
||||
Replicates the Asset constructor with some built-in conventions
|
||||
and a new 'leverage' attribute.
|
||||
and adds properties for leverage and fees.
|
||||
|
||||
Symbol
|
||||
------
|
||||
@@ -469,8 +481,6 @@ cdef class TradingPair(Asset):
|
||||
highest volume and market cap generally benefit from high leverage.
|
||||
New currencies from ICO generally cannot be leveraged.
|
||||
|
||||
The leverage value is either None or and integer.
|
||||
|
||||
Leverage allows you to open a larger position with a smaller amount
|
||||
of funds. For example, if you open a $5,000 position in BTC/USD
|
||||
with 5:1 leverage, only one-fifth of this amount, or $1000, will be
|
||||
@@ -480,6 +490,11 @@ cdef class TradingPair(Asset):
|
||||
the position. If you open with 1:1 leverage, $5,000 of your balance
|
||||
will be tied to the position.
|
||||
|
||||
Fees
|
||||
----
|
||||
Exchanges generally charge a taker (taking from the order book) or
|
||||
maker (adding to the order book) fee.
|
||||
|
||||
:param symbol:
|
||||
:param exchange:
|
||||
:param start_date:
|
||||
@@ -494,6 +509,9 @@ cdef class TradingPair(Asset):
|
||||
:param auto_close_date:
|
||||
:param exchange_full:
|
||||
:param min_trade_size:
|
||||
:param maker:
|
||||
:param taker:
|
||||
:param data_source
|
||||
"""
|
||||
|
||||
symbol = symbol.lower()
|
||||
@@ -527,13 +545,17 @@ cdef class TradingPair(Asset):
|
||||
first_traded=first_traded,
|
||||
auto_close_date=auto_close_date,
|
||||
exchange_full=exchange_full,
|
||||
min_trade_size=min_trade_size
|
||||
min_trade_size=min_trade_size,
|
||||
)
|
||||
|
||||
self.maker = maker
|
||||
self.taker = taker
|
||||
self.leverage = leverage
|
||||
self.end_daily = end_daily
|
||||
self.end_minute = end_minute
|
||||
self.exchange_symbol = exchange_symbol
|
||||
self.trading_state = trading_state
|
||||
self.data_source = data_source
|
||||
|
||||
def __repr__(self):
|
||||
return 'Trading Pair {symbol}({sid}) Exchange: {exchange}, ' \
|
||||
@@ -579,7 +601,7 @@ cdef class TradingPair(Asset):
|
||||
boolean: whether the asset's exchange is open at the given minute.
|
||||
"""
|
||||
#TODO: consider implementing to spot holds
|
||||
return True
|
||||
return self.trading_state > 0
|
||||
|
||||
cpdef __reduce__(self):
|
||||
"""
|
||||
|
||||
@@ -36,8 +36,8 @@ def initialize(context):
|
||||
context.base_price = None
|
||||
context.current_day = None
|
||||
|
||||
context.RSI_OVERSOLD = 50
|
||||
context.RSI_OVERBOUGHT = 80
|
||||
context.RSI_OVERSOLD = 25
|
||||
context.RSI_OVERBOUGHT = 82
|
||||
context.CANDLE_SIZE = '5T'
|
||||
|
||||
context.start_time = time.time()
|
||||
@@ -247,14 +247,14 @@ if __name__ == '__main__':
|
||||
out = os.path.join(folder, '{}.p'.format(timestr))
|
||||
# catalyst run -f catalyst/examples/mean_reversion_simple.py -x poloniex -s 2017-10-1 -e 2017-11-10 -c usdt -n mean-reversion --data-frequency minute --capital-base 10000
|
||||
run_algorithm(
|
||||
capital_base=10000,
|
||||
capital_base=0.5,
|
||||
data_frequency='minute',
|
||||
initialize=initialize,
|
||||
handle_data=handle_data,
|
||||
analyze=analyze,
|
||||
exchange_name='bitfinex',
|
||||
algo_namespace=NAMESPACE,
|
||||
base_currency='usd',
|
||||
base_currency='eth',
|
||||
start=pd.to_datetime('2017-10-01', utc=True),
|
||||
end=pd.to_datetime('2017-11-10', utc=True),
|
||||
output=out
|
||||
|
||||
@@ -3,12 +3,15 @@ from collections import defaultdict
|
||||
|
||||
import ccxt
|
||||
import pandas as pd
|
||||
from catalyst.assets._assets import TradingPair
|
||||
from logbook import Logger
|
||||
|
||||
from catalyst.constants import LOG_LEVEL
|
||||
from catalyst.exchange.exchange import Exchange
|
||||
from catalyst.exchange.exchange_bundle import ExchangeBundle
|
||||
from catalyst.exchange.exchange_errors import InvalidHistoryFrequencyError
|
||||
from catalyst.exchange.exchange_errors import InvalidHistoryFrequencyError, \
|
||||
ExchangeSymbolsNotFound
|
||||
from catalyst.exchange.exchange_utils import mixin_market_params
|
||||
|
||||
log = Logger('CCXT', level=LOG_LEVEL)
|
||||
|
||||
@@ -96,6 +99,57 @@ class CCXT(Exchange):
|
||||
))
|
||||
return candles
|
||||
|
||||
def load_assets(self, is_local=False):
|
||||
markets = self.api.fetch_markets()
|
||||
try:
|
||||
symbol_map = self.fetch_symbol_map(is_local)
|
||||
except ExchangeSymbolsNotFound:
|
||||
return None
|
||||
|
||||
data_source = 'local' if is_local else 'catalyst'
|
||||
for market in markets:
|
||||
asset = symbol_map[market['id']] \
|
||||
if market['id'] in markets else None
|
||||
|
||||
params = dict(exchange=self.name, data_source=data_source)
|
||||
mixin_market_params(params, market)
|
||||
|
||||
if asset:
|
||||
params['symbol'] = asset['symbol']
|
||||
|
||||
params['start_date'] = pd.to_datetime(
|
||||
asset['start_date'], utc=True
|
||||
) if 'start_date' in asset else None
|
||||
|
||||
params['end_date'] = pd.to_datetime(
|
||||
asset['end_date'], utc=True
|
||||
) if 'end_date' in asset else None
|
||||
|
||||
params['leverage'] = asset['leverage'] \
|
||||
if 'leverage' in asset else 1.0
|
||||
|
||||
params['asset_name'] = asset['asset_name'] \
|
||||
if 'asset_name' in asset else None
|
||||
|
||||
params['end_daily'] = pd.to_datetime(
|
||||
asset['end_daily'], utc=True
|
||||
) if 'end_daily' in asset and asset['end_daily'] != 'N/A' \
|
||||
else None
|
||||
|
||||
params['end_minute'] = pd.to_datetime(
|
||||
asset['end_minute'], utc=True
|
||||
) if 'end_minute' in asset and asset['end_minute'] != 'N/A' \
|
||||
else None
|
||||
|
||||
else:
|
||||
params['symbol'] = market['id']
|
||||
|
||||
trading_pair = TradingPair(**params)
|
||||
if is_local:
|
||||
self.local_assets[market['id']] = trading_pair
|
||||
else:
|
||||
self.assets[market['id']] = trading_pair
|
||||
|
||||
def get_balances(self):
|
||||
return None
|
||||
|
||||
|
||||
@@ -571,3 +571,22 @@ def resample_history_df(df, freq, field):
|
||||
|
||||
resampled_df = df.resample(freq).agg(agg)
|
||||
return resampled_df
|
||||
|
||||
|
||||
def mixin_market_params(params, market):
|
||||
"""
|
||||
Applies a CCXT market dict to parameters of TradingPair init.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
params: dict[Object]
|
||||
market: dict[Object]
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
||||
"""
|
||||
params['min_trade_size'] = market['lot']
|
||||
params['maker'] = market['maker']
|
||||
params['taker'] = market['taker']
|
||||
params['trading_state'] = 1 if int(market['info']['isFrozen']) == 0 else 0
|
||||
|
||||
@@ -99,3 +99,6 @@ class TestCCXT(BaseExchangeTestCase):
|
||||
asset = self.exchange.get_asset('eth_btc')
|
||||
orderbook = self.exchange.get_orderbook(asset)
|
||||
pass
|
||||
|
||||
def test_get_fees(self):
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user