mirror of
https://github.com/wassname/catalyst.git
synced 2026-06-27 20:20:55 +08:00
Merge remote-tracking branch 'origin/concurrent-exchanges' into concurrent-exchanges
This commit is contained in:
@@ -12,7 +12,7 @@ import pytz
|
||||
from catalyst.data.bundles import from_bundle_ingest_dirname
|
||||
from catalyst.data.bundles.core import download_without_progress
|
||||
from catalyst.exchange.exchange_errors import ApiCandlesError, \
|
||||
PricingDataBeforeTradingError
|
||||
PricingDataBeforeTradingError, NoDataAvailableOnExchange
|
||||
from catalyst.exchange.exchange_utils import get_exchange_bundles_folder
|
||||
from catalyst.utils.deprecate import deprecated
|
||||
from catalyst.utils.paths import data_path
|
||||
@@ -134,10 +134,17 @@ def get_adj_dates(start, end, assets, data_frequency):
|
||||
if end is None or (last_entry is not None and end > last_entry):
|
||||
end = last_entry
|
||||
|
||||
if start >= end:
|
||||
if end is None:
|
||||
raise NoDataAvailableOnExchange(
|
||||
exchange=asset.exchange.title(),
|
||||
symbol=[asset.symbol.encode('utf-8')],
|
||||
data_frequency=data_frequency,
|
||||
)
|
||||
|
||||
if end is None or start >= end:
|
||||
raise PricingDataBeforeTradingError(
|
||||
symbols=[asset.symbol],
|
||||
exchange=asset.exchange,
|
||||
symbols=[asset.symbol.encode('utf-8')],
|
||||
exchange=asset.exchange.title(),
|
||||
first_trading_day=earliest_trade,
|
||||
dt=end
|
||||
)
|
||||
|
||||
@@ -301,7 +301,7 @@ class DataPortalExchangeBacktest(DataPortalExchangeBase):
|
||||
reader = bundle.get_reader(data_frequency)
|
||||
if reader is None:
|
||||
raise BundleNotFoundError(
|
||||
exchange=exchange.name,
|
||||
exchange=exchange.name.title(),
|
||||
data_frequency=data_frequency
|
||||
)
|
||||
|
||||
@@ -321,9 +321,10 @@ class DataPortalExchangeBacktest(DataPortalExchangeBase):
|
||||
raise PricingDataNotLoadedError(
|
||||
field=field,
|
||||
first_trading_day=first_trading_day,
|
||||
exchange=exchange.name,
|
||||
exchange=exchange.name.title(),
|
||||
symbols=symbols,
|
||||
symbol_list=symbol_list
|
||||
symbol_list=symbol_list,
|
||||
data_frequency=data_frequency
|
||||
)
|
||||
|
||||
series = dict()
|
||||
@@ -340,7 +341,7 @@ class DataPortalExchangeBacktest(DataPortalExchangeBase):
|
||||
if dt < first_trading_day:
|
||||
raise PricingDataBeforeTradingError(
|
||||
first_trading_day=first_trading_day,
|
||||
exchange=assets[0].exchange,
|
||||
exchange=assets[0].exchange.title(),
|
||||
symbols=[asset.symbol.encode('utf-8') for asset in assets],
|
||||
dt=dt,
|
||||
)
|
||||
@@ -365,10 +366,11 @@ class DataPortalExchangeBacktest(DataPortalExchangeBase):
|
||||
raise PricingDataNotLoadedError(
|
||||
field=field,
|
||||
first_trading_day=self._get_first_trading_day(assets),
|
||||
exchange=exchange.name,
|
||||
exchange=exchange.name.title(),
|
||||
symbols=[asset.symbol.encode('utf-8') for asset in assets],
|
||||
symbol_list=''.join(
|
||||
[asset.symbol.encode('utf-8') for asset in assets])
|
||||
[asset.symbol.encode('utf-8') for asset in assets]),
|
||||
data_frequency=data_frequency
|
||||
)
|
||||
|
||||
return values
|
||||
|
||||
@@ -130,7 +130,7 @@ class Exchange:
|
||||
|
||||
if not symbol:
|
||||
raise ValueError('Currency %s not supported by exchange %s' %
|
||||
(asset['symbol'], self.name))
|
||||
(asset['symbol'], self.name.title()))
|
||||
|
||||
return symbol
|
||||
|
||||
@@ -174,10 +174,10 @@ class Exchange:
|
||||
asset = self.assets[key]
|
||||
|
||||
if not asset:
|
||||
supported_symbols = [pair.symbol for pair in self.assets.values()]
|
||||
supported_symbols = [pair.symbol.encode('utf-8') for pair in self.assets.values()]
|
||||
raise SymbolNotFoundOnExchange(
|
||||
symbol=symbol,
|
||||
exchange=self.name,
|
||||
exchange=self.name.title(),
|
||||
supported_symbols=supported_symbols
|
||||
)
|
||||
|
||||
@@ -529,7 +529,7 @@ class Exchange:
|
||||
reader = self.bundle.get_reader(data_frequency)
|
||||
if reader is None:
|
||||
raise BundleNotFoundError(
|
||||
exchange=self.name,
|
||||
exchange=self.name.title(),
|
||||
data_frequency=data_frequency
|
||||
)
|
||||
|
||||
@@ -570,7 +570,7 @@ class Exchange:
|
||||
elif field == 'volume':
|
||||
agg = 'sum'
|
||||
else:
|
||||
raise ValueError('invalid field')
|
||||
raise ValueError('Invalid field.')
|
||||
|
||||
df = df.resample('{}T'.format(candle_size)).agg(agg)
|
||||
|
||||
@@ -592,7 +592,7 @@ class Exchange:
|
||||
if base_position_available is None:
|
||||
raise BaseCurrencyNotFoundError(
|
||||
base_currency=self.base_currency,
|
||||
exchange=self.name
|
||||
exchange=self.name.title()
|
||||
)
|
||||
|
||||
portfolio = self._portfolio
|
||||
@@ -682,7 +682,7 @@ class Exchange:
|
||||
style = ExchangeStopOrder(stop_price, exchange=self.name)
|
||||
|
||||
elif style is not None:
|
||||
raise InvalidOrderStyle(exchange=self.name,
|
||||
raise InvalidOrderStyle(exchange=self.name.title(),
|
||||
style=style.__class__.__name__)
|
||||
else:
|
||||
raise ValueError('Incomplete order data.')
|
||||
|
||||
@@ -4,7 +4,7 @@ from catalyst.errors import ZiplineError
|
||||
|
||||
def silent_except_hook(exctype, excvalue, exctraceback):
|
||||
if exctype in [PricingDataBeforeTradingError, PricingDataNotLoadedError,
|
||||
SymbolNotFoundOnExchange, ]:
|
||||
SymbolNotFoundOnExchange, NoDataAvailableOnExchange, ]:
|
||||
fn = traceback.extract_tb(exctraceback)[-1][0]
|
||||
ln = traceback.extract_tb(exctraceback)[-1][1]
|
||||
print "Error traceback: {1} (line {2})\n" \
|
||||
@@ -197,9 +197,14 @@ class PricingDataNotLoadedError(ZiplineError):
|
||||
'exchange {exchange} since {first_trading_day} is unavailable. '
|
||||
'The bundle data is either out-of-date or has not been loaded yet. '
|
||||
'Please ingest data using the command '
|
||||
'`catalyst ingest-exchange -x {exchange} -i {symbol_list}`. '
|
||||
'`catalyst ingest-exchange -x {exchange} -f {data_frequency} -i {symbol_list}`. '
|
||||
'See catalyst documentation for details.').strip()
|
||||
|
||||
|
||||
class ApiCandlesError(ZiplineError):
|
||||
msg = ('Unable to fetch candles from the remote API: {error}.').strip()
|
||||
|
||||
class NoDataAvailableOnExchange(ZiplineError):
|
||||
msg = ('Requested data for trading pair {symbol} is not available on exchange {exchange} '
|
||||
'in `{data_frequency}` frequency at this time. '
|
||||
'Check `http://enigma.co/catalyst/status` for market coverage.').strip()
|
||||
|
||||
Reference in New Issue
Block a user