From f913b57bbecaf44ee52cd59938fb4696463c4319 Mon Sep 17 00:00:00 2001 From: enenn Date: Sat, 3 Feb 2018 17:15:40 +0100 Subject: [PATCH] Replace 'BTC_XXX' with 'XXX/BTC' for pairs and 'XXX_BTC' for files --- bin/freqtrade | 4 -- config.json.example | 22 ++++---- docs/backtesting.md | 2 +- freqtrade/analyze.py | 2 +- freqtrade/exchange/__init__.py | 5 +- freqtrade/exchange/interface.py | 10 ++-- freqtrade/rpc/telegram.py | 4 +- freqtrade/tests/conftest.py | 18 +++---- freqtrade/tests/exchange/test_exchange.py | 28 +++++----- freqtrade/tests/optimize/test_backtesting.py | 34 ++++++------ freqtrade/tests/optimize/test_optimize.py | 54 +++++++++---------- freqtrade/tests/rpc/test_rpc_telegram.py | 14 ++--- .../tests/strategy/test_default_strategy.py | 2 +- freqtrade/tests/test_acl_pair.py | 20 +++---- freqtrade/tests/test_dataframe.py | 2 +- freqtrade/tests/test_main.py | 19 ++++--- freqtrade/tests/test_persistence.py | 24 ++++----- .../tests/testdata/download_backtest_data.py | 11 ++-- freqtrade/tests/testdata/pairs.json | 46 ++++++++-------- user_data/hyperopt_conf.py | 20 +++---- 20 files changed, 170 insertions(+), 171 deletions(-) delete mode 100755 bin/freqtrade diff --git a/bin/freqtrade b/bin/freqtrade deleted file mode 100755 index 7476152fd..000000000 --- a/bin/freqtrade +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env python3 - -from freqtrade.main import main -main() \ No newline at end of file diff --git a/config.json.example b/config.json.example index afeb6ada2..231ecee14 100644 --- a/config.json.example +++ b/config.json.example @@ -13,19 +13,19 @@ "key": "your_echange_key", "secret": "your_echange_secret", "pair_whitelist": [ - "BTC_ETH", - "BTC_LTC", - "BTC_ETC", - "BTC_DASH", - "BTC_ZEC", - "BTC_XLM", - "BTC_NXT", - "BTC_POWR", - "BTC_ADA", - "BTC_XMR" + "ETH/BTC", + "LTC/BTC", + "ETC/BTC", + "DASH/BTC", + "ZEC/BTC", + "XLM/BTC", + "NXT/BTC", + "POWR/BTC", + "ADA/BTC", + "XMR/BTC" ], "pair_blacklist": [ - "BTC_DOGE" + "DOGE/BTC" ] }, "experimental": { diff --git a/docs/backtesting.md b/docs/backtesting.md index a704f1cb9..858bc7cbf 100644 --- a/docs/backtesting.md +++ b/docs/backtesting.md @@ -117,7 +117,7 @@ A backtesting result will look like that: ====================== BACKTESTING REPORT ================================ pair buy count avg profit % total profit BTC avg duration -------- ----------- -------------- ------------------ -------------- -BTC_ETH 56 -0.67 -0.00075455 62.3 +ETH/BTC 56 -0.67 -0.00075455 62.3 BTC_LTC 38 -0.48 -0.00036315 57.9 BTC_ETC 42 -1.15 -0.00096469 67.0 BTC_DASH 72 -0.62 -0.00089368 39.9 diff --git a/freqtrade/analyze.py b/freqtrade/analyze.py index 70bf40936..1dc75c1d0 100644 --- a/freqtrade/analyze.py +++ b/freqtrade/analyze.py @@ -87,7 +87,7 @@ def analyze_ticker(ticker_history: List[Dict]) -> DataFrame: def get_signal(pair: str, interval: int) -> (bool, bool): """ Calculates current signal based several technical analysis indicators - :param pair: pair in format BTC_ANT or BTC-ANT + :param pair: pair in format ANT/BTC :return: (Buy, Sell) A bool-tuple indicating buy/sell signal """ ticker_hist = get_ticker_history(pair, interval) diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index 9c432d968..5262e7776 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -45,6 +45,9 @@ def init(config: dict) -> None: # TODO add check for a list of supported exchanges + if name not in ccxt.exchanges: + raise OperationalException('Exchange {} is not supported'.format(name)) + try: # exchange_class = Exchanges[name.upper()].value _API = getattr(ccxt, name.lower())({ @@ -81,7 +84,7 @@ def validate_pairs(pairs: List[str]) -> None: stake_cur = _CONF['stake_currency'] for pair in pairs: # Note: ccxt has BaseCurrency/QuoteCurrency format for pairs - pair = pair.replace('_', '/') + # pair = pair.replace('_', '/') # TODO: add a support for having coins in BTC/USDT format if not pair.endswith(stake_cur): diff --git a/freqtrade/exchange/interface.py b/freqtrade/exchange/interface.py index 6121a98b3..894c42f12 100644 --- a/freqtrade/exchange/interface.py +++ b/freqtrade/exchange/interface.py @@ -22,7 +22,7 @@ class Exchange(ABC): def buy(self, pair: str, rate: float, amount: float) -> str: """ Places a limit buy order. - :param pair: Pair as str, format: BTC_ETH + :param pair: Pair as str, format: ETH/BTC :param rate: Rate limit for order :param amount: The amount to purchase :return: order_id of the placed buy order @@ -32,7 +32,7 @@ class Exchange(ABC): def sell(self, pair: str, rate: float, amount: float) -> str: """ Places a limit sell order. - :param pair: Pair as str, format: BTC_ETH + :param pair: Pair as str, format: ETH/BTC :param rate: Rate limit for order :param amount: The amount to sell :return: order_id of the placed sell order @@ -65,7 +65,7 @@ class Exchange(ABC): def get_ticker(self, pair: str, refresh: Optional[bool] = True) -> dict: """ Gets ticker for given pair. - :param pair: Pair as str, format: BTC_ETC + :param pair: Pair as str, format: ETC/BTC :param refresh: Shall we query a new value or a cached value is enough :return: dict, format: { 'bid': float, @@ -78,7 +78,7 @@ class Exchange(ABC): def get_ticker_history(self, pair: str, tick_interval: int) -> List[Dict]: """ Gets ticker history for given pair. - :param pair: Pair as str, format: BTC_ETC + :param pair: Pair as str, format: ETC/BTC :param tick_interval: ticker interval in minutes :return: list, format: [ { @@ -122,7 +122,7 @@ class Exchange(ABC): 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 + :param pair: Pair as str, format: ETC/BTC :return: URL as str """ diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 3d4ab5aa5..ef2367395 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -400,9 +400,9 @@ def _balance(bot: Bot, update: Update) -> None: currency["Rate"] = 1.0 else: if coin == 'USDT': - currency["Rate"] = 1.0 / exchange.get_ticker('USDT_BTC', False)['bid'] + currency["Rate"] = 1.0 / exchange.get_ticker('BTC/USDT', False)['bid'] else: - currency["Rate"] = exchange.get_ticker('BTC_' + coin, False)['bid'] + currency["Rate"] = exchange.get_ticker(coin + '/BTC', False)['bid'] currency['BTC'] = currency["Rate"] * currency["Balance"] total = total + currency['BTC'] output += """*Currency*: {Currency} diff --git a/freqtrade/tests/conftest.py b/freqtrade/tests/conftest.py index 053b980f7..6b888374f 100644 --- a/freqtrade/tests/conftest.py +++ b/freqtrade/tests/conftest.py @@ -49,11 +49,11 @@ def default_conf(): "key": "key", "secret": "secret", "pair_whitelist": [ - "BTC_ETH", - "BTC_TKN", - "BTC_TRST", - "BTC_SWT", - "BTC_BCC" + "ETH/BTC", + "TKN/BTC", + "TRST/BTC", + "SWT/BTC", + "BCC/BTC" ] }, "telegram": { @@ -150,7 +150,7 @@ def limit_buy_order_old(): return { 'id': 'mocked_limit_buy_old', 'type': 'LIMIT_BUY', - 'pair': 'BTC_ETH', + 'pair': 'ETH/BTC', 'opened': str(arrow.utcnow().shift(minutes=-601).datetime), 'rate': 0.00001099, 'amount': 90.99181073, @@ -163,7 +163,7 @@ def limit_sell_order_old(): return { 'id': 'mocked_limit_sell_old', 'type': 'LIMIT_SELL', - 'pair': 'BTC_ETH', + 'pair': 'ETH/BTC', 'opened': str(arrow.utcnow().shift(minutes=-601).datetime), 'rate': 0.00001099, 'amount': 90.99181073, @@ -176,7 +176,7 @@ def limit_buy_order_old_partial(): return { 'id': 'mocked_limit_buy_old_partial', 'type': 'LIMIT_BUY', - 'pair': 'BTC_ETH', + 'pair': 'ETH/BTC', 'opened': str(arrow.utcnow().shift(minutes=-601).datetime), 'rate': 0.00001099, 'amount': 90.99181073, @@ -263,7 +263,7 @@ def ticker_history_without_bv(): @pytest.fixture def result(): - with open('freqtrade/tests/testdata/BTC_ETH-1.json') as data_file: + with open('freqtrade/tests/testdata/ETH_BTC-1.json') as data_file: return parse_ticker_dataframe(json.load(data_file)) diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index 9761fff3a..77f1d6abb 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -42,8 +42,8 @@ def test_init_exception(default_conf): def test_validate_pairs(default_conf, mocker): api_mock = MagicMock() - api_mock.get_markets = MagicMock(return_value=[ - 'BTC_ETH', 'BTC_TKN', 'BTC_TRST', 'BTC_SWT', 'BTC_BCC', + api_mock.load_markets = MagicMock(return_value=[ + 'ETH/BTC', 'TKN/BTC', 'TRST/BTC', 'SWT/BTC', 'BCC/BTC', ]) mocker.patch('freqtrade.exchange._API', api_mock) mocker.patch.dict('freqtrade.exchange._CONF', default_conf) @@ -62,7 +62,7 @@ def test_validate_pairs_not_available(default_conf, mocker): def test_validate_pairs_not_compatible(default_conf, mocker): api_mock = MagicMock() api_mock.get_markets = MagicMock( - return_value=['BTC_ETH', 'BTC_TKN', 'BTC_TRST', 'BTC_SWT']) + return_value=['ETH/BTC', 'TKN/BTC', 'TRST/BTC', 'SWT/BTC']) default_conf['stake_currency'] = 'ETH' mocker.patch('freqtrade.exchange._API', api_mock) mocker.patch.dict('freqtrade.exchange._CONF', default_conf) @@ -87,38 +87,38 @@ def test_buy_dry_run(default_conf, mocker): default_conf['dry_run'] = True mocker.patch.dict('freqtrade.exchange._CONF', default_conf) - assert 'dry_run_buy_' in buy(pair='BTC_ETH', rate=200, amount=1) + assert 'dry_run_buy_' in buy(pair='ETH/BTC', rate=200, amount=1) def test_buy_prod(default_conf, mocker): api_mock = MagicMock() api_mock.buy = MagicMock( - return_value='dry_run_buy_{}'.format(randint(0, 10**6))) + return_value='dry_run_buy_{}'.format(randint(0, 10 ** 6))) mocker.patch('freqtrade.exchange._API', api_mock) default_conf['dry_run'] = False mocker.patch.dict('freqtrade.exchange._CONF', default_conf) - assert 'dry_run_buy_' in buy(pair='BTC_ETH', rate=200, amount=1) + assert 'dry_run_buy_' in buy(pair='ETH/BTC', rate=200, amount=1) def test_sell_dry_run(default_conf, mocker): default_conf['dry_run'] = True mocker.patch.dict('freqtrade.exchange._CONF', default_conf) - assert 'dry_run_sell_' in sell(pair='BTC_ETH', rate=200, amount=1) + assert 'dry_run_sell_' in sell(pair='ETH/BTC', rate=200, amount=1) def test_sell_prod(default_conf, mocker): api_mock = MagicMock() api_mock.sell = MagicMock( - return_value='dry_run_sell_{}'.format(randint(0, 10**6))) + return_value='dry_run_sell_{}'.format(randint(0, 10 ** 6))) mocker.patch('freqtrade.exchange._API', api_mock) default_conf['dry_run'] = False mocker.patch.dict('freqtrade.exchange._CONF', default_conf) - assert 'dry_run_sell_' in sell(pair='BTC_ETH', rate=200, amount=1) + assert 'dry_run_sell_' in sell(pair='ETH/BTC', rate=200, amount=1) def test_get_balance_dry_run(default_conf, mocker): @@ -180,7 +180,7 @@ def test_get_ticker(default_conf, mocker): mocker.patch('freqtrade.exchange.bittrex._API', api_mock) # retrieve original ticker - ticker = get_ticker(pair='BTC_ETH') + ticker = get_ticker(pair='ETH/BTC') assert ticker['bid'] == 0.00001098 assert ticker['ask'] == 0.00001099 @@ -191,12 +191,12 @@ def test_get_ticker(default_conf, mocker): # if not caching the result we should get the same ticker # if not fetching a new result we should get the cached ticker - ticker = get_ticker(pair='BTC_ETH', refresh=False) + ticker = get_ticker(pair='ETH/BTC', refresh=False) assert ticker['bid'] == 0.00001098 assert ticker['ask'] == 0.00001099 # force ticker refresh - ticker = get_ticker(pair='BTC_ETH', refresh=True) + ticker = get_ticker(pair='ETH/BTC', refresh=True) assert ticker['bid'] == 0.5 assert ticker['ask'] == 1 @@ -208,7 +208,7 @@ def test_get_ticker_history(default_conf, mocker): mocker.patch('freqtrade.exchange._API', api_mock) # retrieve original ticker - ticks = get_ticker_history('BTC_ETH', int(default_conf['ticker_interval'])) + ticks = get_ticker_history('ETH/BTC', int(default_conf['ticker_interval'])) assert ticks == 123 # change the ticker @@ -217,7 +217,7 @@ def test_get_ticker_history(default_conf, mocker): mocker.patch('freqtrade.exchange._API', api_mock) # ensure caching will still return the original ticker - ticks = get_ticker_history('BTC_ETH', int(default_conf['ticker_interval'])) + ticks = get_ticker_history('ETH/BTC', int(default_conf['ticker_interval'])) assert ticks == 123 diff --git a/freqtrade/tests/optimize/test_backtesting.py b/freqtrade/tests/optimize/test_backtesting.py index 368682bad..f8a0c78de 100644 --- a/freqtrade/tests/optimize/test_backtesting.py +++ b/freqtrade/tests/optimize/test_backtesting.py @@ -21,7 +21,7 @@ def trim_dictlist(dict_list, num): def test_generate_text_table(): results = pd.DataFrame( { - 'currency': ['BTC_ETH', 'BTC_ETH'], + 'currency': ['ETH/BTC', 'ETH/BTC'], 'profit_percent': [0.1, 0.2], 'profit_BTC': [0.2, 0.4], 'duration': [10, 30], @@ -29,17 +29,17 @@ def test_generate_text_table(): 'loss': [0, 0] } ) - print(generate_text_table({'BTC_ETH': {}}, results, 'BTC', 5)) - assert generate_text_table({'BTC_ETH': {}}, results, 'BTC', 5) == ( + print(generate_text_table({'ETH/BTC': {}}, results, 'BTC', 5)) + assert generate_text_table({'ETH/BTC': {}}, results, 'BTC', 5) == ( 'pair buy count avg profit % total profit BTC avg duration profit loss\n' # noqa '------- ----------- -------------- ------------------ -------------- -------- ------\n' # noqa - 'BTC_ETH 2 15.00 0.60000000 100.0 2 0\n' # noqa + 'ETH/BTC 2 15.00 0.60000000 100.0 2 0\n' # noqa 'TOTAL 2 15.00 0.60000000 100.0 2 0') # noqa def test_get_timeframe(default_strategy): data = preprocess(optimize.load_data( - None, ticker_interval=1, pairs=['BTC_UNITEST'])) + None, ticker_interval=1, pairs=['UNITTEST/BTC'])) min_date, max_date = get_timeframe(data) assert min_date.isoformat() == '2017-11-04T23:02:00+00:00' assert max_date.isoformat() == '2017-11-14T22:59:00+00:00' @@ -49,7 +49,7 @@ def test_backtest(default_strategy, default_conf, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf) exchange._API = Bittrex({'key': '', 'secret': ''}) - data = optimize.load_data(None, ticker_interval=5, pairs=['BTC_ETH']) + data = optimize.load_data(None, ticker_interval=5, pairs=['ETH/BTC']) data = trim_dictlist(data, -200) results = backtest({'stake_amount': default_conf['stake_amount'], 'processed': optimize.preprocess(data), @@ -63,7 +63,7 @@ def test_backtest_1min_ticker_interval(default_strategy, default_conf, mocker): exchange._API = Bittrex({'key': '', 'secret': ''}) # Run a backtesting for an exiting 5min ticker_interval - data = optimize.load_data(None, ticker_interval=1, pairs=['BTC_UNITEST']) + data = optimize.load_data(None, ticker_interval=1, pairs=['UNITTEST/BTC']) data = trim_dictlist(data, -200) results = backtest({'stake_amount': default_conf['stake_amount'], 'processed': optimize.preprocess(data), @@ -74,8 +74,8 @@ def test_backtest_1min_ticker_interval(default_strategy, default_conf, mocker): def load_data_test(what): timerange = ((None, 'line'), None, -100) - data = optimize.load_data(None, ticker_interval=1, pairs=['BTC_UNITEST'], timerange=timerange) - pair = data['BTC_UNITEST'] + data = optimize.load_data(None, ticker_interval=1, pairs=['UNITTEST/BTC'], timerange=timerange) + pair = data['UNITTEST/BTC'] datalen = len(pair) # Depending on the what parameter we now adjust the # loaded data looks: @@ -84,7 +84,7 @@ def load_data_test(what): # 'T': '2017-11-04T23:02:00', 'BV': 0.123}] base = 0.001 if what == 'raise': - return {'BTC_UNITEST': + return {'UNITTEST/BTC': [{'T': pair[x]['T'], # Keep old dates 'V': pair[x]['V'], # Keep old volume 'BV': pair[x]['BV'], # keep too @@ -93,7 +93,7 @@ def load_data_test(what): 'L': x * base - 0.0001, 'C': x * base} for x in range(0, datalen)]} if what == 'lower': - return {'BTC_UNITEST': + return {'UNITTEST/BTC': [{'T': pair[x]['T'], # Keep old dates 'V': pair[x]['V'], # Keep old volume 'BV': pair[x]['BV'], # keep too @@ -103,7 +103,7 @@ def load_data_test(what): 'C': 1 - x * base} for x in range(0, datalen)]} if what == 'sine': hz = 0.1 # frequency - return {'BTC_UNITEST': + return {'UNITTEST/BTC': [{'T': pair[x]['T'], # Keep old dates 'V': pair[x]['V'], # Keep old volume 'BV': pair[x]['BV'], # keep too @@ -133,7 +133,7 @@ def simple_backtest(config, contour, num_results): def test_backtest2(default_conf, mocker, default_strategy): mocker.patch.dict('freqtrade.main._CONF', default_conf) - data = optimize.load_data(None, ticker_interval=5, pairs=['BTC_ETH']) + data = optimize.load_data(None, ticker_interval=5, pairs=['ETH/BTC']) data = trim_dictlist(data, -200) results = backtest({'stake_amount': default_conf['stake_amount'], 'processed': optimize.preprocess(data), @@ -146,7 +146,7 @@ def test_processed(default_conf, mocker, default_strategy): mocker.patch.dict('freqtrade.main._CONF', default_conf) dict_of_tickerrows = load_data_test('raise') dataframes = optimize.preprocess(dict_of_tickerrows) - dataframe = dataframes['BTC_UNITEST'] + dataframe = dataframes['UNITTEST/BTC'] cols = dataframe.columns # assert the dataframe got some of the indicator columns for col in ['close', 'high', 'low', 'open', 'date', @@ -162,13 +162,13 @@ def test_backtest_pricecontours(default_conf, mocker, default_strategy): def mocked_load_data(datadir, pairs=[], ticker_interval=0, refresh_pairs=False, timerange=None): - tickerdata = optimize.load_tickerdata_file(datadir, 'BTC_UNITEST', 1, timerange=timerange) - pairdata = {'BTC_UNITEST': tickerdata} + tickerdata = optimize.load_tickerdata_file(datadir, 'UNITTEST/BTC', 1, timerange=timerange) + pairdata = {'UNITTEST/BTC': tickerdata} return pairdata def test_backtest_start(default_conf, mocker, caplog): - default_conf['exchange']['pair_whitelist'] = ['BTC_UNITEST'] + default_conf['exchange']['pair_whitelist'] = ['UNITTEST/BTC'] mocker.patch.dict('freqtrade.main._CONF', default_conf) mocker.patch('freqtrade.misc.load_config', new=lambda s: default_conf) mocker.patch.multiple('freqtrade.optimize', diff --git a/freqtrade/tests/optimize/test_optimize.py b/freqtrade/tests/optimize/test_optimize.py index e968084bc..329c2e3a3 100644 --- a/freqtrade/tests/optimize/test_optimize.py +++ b/freqtrade/tests/optimize/test_optimize.py @@ -10,7 +10,7 @@ from freqtrade.exchange import Bittrex from freqtrade.optimize.__init__ import make_testdata_path, download_pairs,\ download_backtesting_testdata, load_tickerdata_file, trim_tickerlist, file_dump_json -# Change this if modifying BTC_UNITEST testdatafile +# Change this if modifying UNITTEST/BTC testdatafile _BTC_UNITTEST_LENGTH = 13681 @@ -51,13 +51,13 @@ def test_load_data_30min_ticker(default_conf, ticker_history, mocker, caplog): exchange._API = Bittrex({'key': '', 'secret': ''}) - file = 'freqtrade/tests/testdata/BTC_UNITTEST-30.json' + file = 'freqtrade/tests/testdata/UNITTEST_BTC-30.json' _backup_file(file, copy_file=True) - optimize.load_data(None, pairs=['BTC_UNITTEST'], ticker_interval=30) + optimize.load_data(None, pairs=['UNITTEST/BTC'], ticker_interval=30) assert os.path.isfile(file) is True assert ('freqtrade.optimize', logging.INFO, - 'Download the pair: "BTC_ETH", Interval: 30 min') not in caplog.record_tuples + 'Download the pair: "ETH/BTC", Interval: 30 min') not in caplog.record_tuples _clean_test_file(file) @@ -67,13 +67,13 @@ def test_load_data_5min_ticker(default_conf, ticker_history, mocker, caplog): exchange._API = Bittrex({'key': '', 'secret': ''}) - file = 'freqtrade/tests/testdata/BTC_ETH-5.json' + file = 'freqtrade/tests/testdata/ETH_BTC-5.json' _backup_file(file, copy_file=True) - optimize.load_data(None, pairs=['BTC_ETH'], ticker_interval=5) + optimize.load_data(None, pairs=['ETH/BTC'], ticker_interval=5) assert os.path.isfile(file) is True assert ('freqtrade.optimize', logging.INFO, - 'Download the pair: "BTC_ETH", Interval: 5 min') not in caplog.record_tuples + 'Download the pair: "ETH/BTC", Interval: 5 min') not in caplog.record_tuples _clean_test_file(file) @@ -83,13 +83,13 @@ def test_load_data_1min_ticker(default_conf, ticker_history, mocker, caplog): exchange._API = Bittrex({'key': '', 'secret': ''}) - file = 'freqtrade/tests/testdata/BTC_ETH-1.json' + file = 'freqtrade/tests/testdata/ETH_BTC-1.json' _backup_file(file, copy_file=True) - optimize.load_data(None, ticker_interval=1, pairs=['BTC_ETH']) + optimize.load_data(None, ticker_interval=1, pairs=['ETH/BTC']) assert os.path.isfile(file) is True assert ('freqtrade.optimize', logging.INFO, - 'Download the pair: "BTC_ETH", Interval: 1 min') not in caplog.record_tuples + 'Download the pair: "ETH/BTC", Interval: 1 min') not in caplog.record_tuples _clean_test_file(file) @@ -99,13 +99,13 @@ def test_load_data_with_new_pair_1min(default_conf, ticker_history, mocker, capl exchange._API = Bittrex({'key': '', 'secret': ''}) - file = 'freqtrade/tests/testdata/BTC_MEME-1.json' + file = 'freqtrade/tests/testdata/MEME/BTC-1.json' _backup_file(file) - optimize.load_data(None, ticker_interval=1, pairs=['BTC_MEME']) + optimize.load_data(None, ticker_interval=1, pairs=['MEME/BTC']) assert os.path.isfile(file) is True assert ('freqtrade.optimize', logging.INFO, - 'Download the pair: "BTC_MEME", Interval: 1 min') in caplog.record_tuples + 'Download the pair: "MEME/BTC", Interval: 1 min') in caplog.record_tuples _clean_test_file(file) @@ -118,10 +118,10 @@ def test_download_pairs(default_conf, ticker_history, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf) exchange._API = Bittrex({'key': '', 'secret': ''}) - file1_1 = 'freqtrade/tests/testdata/BTC_MEME-1.json' - file1_5 = 'freqtrade/tests/testdata/BTC_MEME-5.json' - file2_1 = 'freqtrade/tests/testdata/BTC_CFI-1.json' - file2_5 = 'freqtrade/tests/testdata/BTC_CFI-5.json' + file1_1 = 'freqtrade/tests/testdata/MEME_BTC-1.json' + file1_5 = 'freqtrade/tests/testdata/MEME_BTC-5.json' + file2_1 = 'freqtrade/tests/testdata/CFI_BTC-1.json' + file2_5 = 'freqtrade/tests/testdata/CFI_BTC-5.json' _backup_file(file1_1) _backup_file(file1_5) @@ -160,8 +160,8 @@ def test_download_pairs_exception(default_conf, ticker_history, mocker, caplog): mocker.patch.dict('freqtrade.main._CONF', default_conf) exchange._API = Bittrex({'key': '', 'secret': ''}) - file1_1 = 'freqtrade/tests/testdata/BTC_MEME-1.json' - file1_5 = 'freqtrade/tests/testdata/BTC_MEME-5.json' + file1_1 = 'freqtrade/tests/testdata/MEME_BTC-1.json' + file1_5 = 'freqtrade/tests/testdata/MEME_BTC-5.json' _backup_file(file1_1) _backup_file(file1_5) @@ -180,7 +180,7 @@ def test_download_backtesting_testdata(default_conf, ticker_history, mocker): exchange._API = Bittrex({'key': '', 'secret': ''}) # Download a 1 min ticker file - file1 = 'freqtrade/tests/testdata/BTC_XEL-1.json' + file1 = 'freqtrade/tests/testdata/XEL_BTC-1.json' _backup_file(file1) download_backtesting_testdata(None, pair="BTC-XEL", interval=1) assert os.path.isfile(file1) is True @@ -205,12 +205,12 @@ def test_download_backtesting_testdata2(mocker): def test_load_tickerdata_file(): # 7 does not exist in either format. - assert not load_tickerdata_file(None, 'BTC_UNITEST', 7) + assert not load_tickerdata_file(None, 'UNITTEST/BTC', 7) # 1 exists only as a .json - tickerdata = load_tickerdata_file(None, 'BTC_UNITEST', 1) + tickerdata = load_tickerdata_file(None, 'UNITTEST/BTC', 1) assert _BTC_UNITTEST_LENGTH == len(tickerdata) # 8 .json is empty and will fail if it's loaded. .json.gz is a copy of 1.json - tickerdata = load_tickerdata_file(None, 'BTC_UNITEST', 8) + tickerdata = load_tickerdata_file(None, 'UNITTEST/BTC', 8) assert _BTC_UNITTEST_LENGTH == len(tickerdata) @@ -223,14 +223,14 @@ def test_init(default_conf, mocker): def test_tickerdata_to_dataframe(): timerange = ((None, 'line'), None, -100) - tick = load_tickerdata_file(None, 'BTC_UNITEST', 1, timerange=timerange) - tickerlist = {'BTC_UNITEST': tick} + tick = load_tickerdata_file(None, 'UNITTEST/BTC', 1, timerange=timerange) + tickerlist = {'UNITTEST/BTC': tick} data = optimize.tickerdata_to_dataframe(tickerlist) - assert len(data['BTC_UNITEST']) == 100 + assert len(data['UNITTEST/BTC']) == 100 def test_trim_tickerlist(): - with open('freqtrade/tests/testdata/BTC_ETH-1.json') as data_file: + with open('freqtrade/tests/testdata/ETH_BTC-1.json') as data_file: ticker_list = json.load(data_file) ticker_list_len = len(ticker_list) diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 2dacf33ce..53e6ec88b 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -108,7 +108,7 @@ def test_status_handle(default_conf, update, ticker, mocker): _status(bot=MagicMock(), update=update) assert msg_mock.call_count == 1 - assert '[BTC_ETH]' in msg_mock.call_args_list[0][0][0] + assert '[ETH/BTC]' in msg_mock.call_args_list[0][0][0] def test_status_table_handle(default_conf, update, ticker, mocker): @@ -148,7 +148,7 @@ def test_status_table_handle(default_conf, update, ticker, mocker): fields = re.sub('[ ]+', ' ', line[2].strip()).split(' ') assert int(fields[0]) == 1 - assert fields[1] == 'BTC_ETH' + assert fields[1] == 'ETH/BTC' assert msg_mock.call_count == 1 @@ -206,7 +206,7 @@ def test_profit_handle( assert '∙ `0.00006217 BTC (6.20%)`' in msg_mock.call_args_list[-1][0][0] assert '∙ `0.933 USD`' in msg_mock.call_args_list[-1][0][0] - assert '*Best Performing:* `BTC_ETH: 6.20%`' in msg_mock.call_args_list[-1][0][0] + assert '*Best Performing:* `ETH/BTC: 6.20%`' in msg_mock.call_args_list[-1][0][0] def test_forcesell_handle(default_conf, update, ticker, ticker_sell_up, mocker): @@ -239,7 +239,7 @@ def test_forcesell_handle(default_conf, update, ticker, ticker_sell_up, mocker): assert rpc_mock.call_count == 2 assert 'Selling' in rpc_mock.call_args_list[-1][0][0] - assert '[BTC_ETH]' in rpc_mock.call_args_list[-1][0][0] + assert '[ETH/BTC]' in rpc_mock.call_args_list[-1][0][0] assert 'Amount' in rpc_mock.call_args_list[-1][0][0] assert '0.00001172' in rpc_mock.call_args_list[-1][0][0] assert 'profit: 6.11%, 0.00006126' in rpc_mock.call_args_list[-1][0][0] @@ -276,7 +276,7 @@ def test_forcesell_down_handle(default_conf, update, ticker, ticker_sell_down, m assert rpc_mock.call_count == 2 assert 'Selling' in rpc_mock.call_args_list[-1][0][0] - assert '[BTC_ETH]' in rpc_mock.call_args_list[-1][0][0] + assert '[ETH/BTC]' in rpc_mock.call_args_list[-1][0][0] assert 'Amount' in rpc_mock.call_args_list[-1][0][0] assert '0.00001044' in rpc_mock.call_args_list[-1][0][0] assert 'loss: -5.48%, -0.00005492' in rpc_mock.call_args_list[-1][0][0] @@ -294,7 +294,7 @@ def test_exec_forcesell_open_orders(default_conf, ticker, mocker): }), cancel_order=cancel_order_mock) trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', open_rate=1, exchange='BITTREX', open_order_id='123456789', @@ -403,7 +403,7 @@ def test_performance_handle( _performance(bot=MagicMock(), update=update) assert msg_mock.call_count == 1 assert 'Performance' in msg_mock.call_args_list[0][0][0] - assert 'BTC_ETH\t6.20% (1)' in msg_mock.call_args_list[0][0][0] + assert 'ETH/BTC\t6.20% (1)' in msg_mock.call_args_list[0][0][0] def test_daily_handle(default_conf, update, ticker, limit_buy_order, limit_sell_order, mocker): diff --git a/freqtrade/tests/strategy/test_default_strategy.py b/freqtrade/tests/strategy/test_default_strategy.py index f23c1fa48..2ffa60fc8 100644 --- a/freqtrade/tests/strategy/test_default_strategy.py +++ b/freqtrade/tests/strategy/test_default_strategy.py @@ -7,7 +7,7 @@ from freqtrade.analyze import parse_ticker_dataframe @pytest.fixture def result(): - with open('freqtrade/tests/testdata/BTC_ETH-1.json') as data_file: + with open('freqtrade/tests/testdata/ETH_BTC-1.json') as data_file: return parse_ticker_dataframe(json.load(data_file)) diff --git a/freqtrade/tests/test_acl_pair.py b/freqtrade/tests/test_acl_pair.py index b70596091..d5772f495 100644 --- a/freqtrade/tests/test_acl_pair.py +++ b/freqtrade/tests/test_acl_pair.py @@ -12,14 +12,14 @@ def whitelist_conf(): 'stake_currency': 'BTC', 'exchange': { 'pair_whitelist': [ - 'BTC_ETH', - 'BTC_TKN', - 'BTC_TRST', - 'BTC_SWT', - 'BTC_BCC' + 'ETH/BTC', + 'TKN/BTC', + 'TRST/BTC', + 'SWT/BTC', + 'BCC/BTC' ], 'pair_blacklist': [ - 'BTC_BLK' + 'BLK/BTC' ], }, } @@ -90,9 +90,9 @@ def test_refresh_market_pair_not_in_whitelist(mocker): mocker.patch.multiple('freqtrade.main.exchange', get_wallet_health=get_health) refreshedwhitelist = refresh_whitelist( - conf['exchange']['pair_whitelist'] + ['BTC_XXX']) + conf['exchange']['pair_whitelist'] + ['XXX/BTC']) # List ordered by BaseVolume - whitelist = ['BTC_ETH', 'BTC_TKN'] + whitelist = ['ETH/BTC', 'TKN/BTC'] # Ensure all except those in whitelist are removed assert whitelist == refreshedwhitelist @@ -104,7 +104,7 @@ def test_refresh_whitelist(mocker): get_wallet_health=get_health) refreshedwhitelist = refresh_whitelist(conf['exchange']['pair_whitelist']) # List ordered by BaseVolume - whitelist = ['BTC_ETH', 'BTC_TKN'] + whitelist = ['ETH/BTC', 'TKN/BTC'] # Ensure all except those in whitelist are removed assert whitelist == refreshedwhitelist @@ -117,7 +117,7 @@ def test_refresh_whitelist_dynamic(mocker): mocker.patch.multiple('freqtrade.main.exchange', get_market_summaries=get_market_summaries) # argument: use the whitelist dynamically by exchange-volume - whitelist = ['BTC_TKN', 'BTC_ETH'] + whitelist = ['TKN/BTC', 'ETH/BTC'] refreshedwhitelist = refresh_whitelist( gen_pair_whitelist(conf['stake_currency'])) assert whitelist == refreshedwhitelist diff --git a/freqtrade/tests/test_dataframe.py b/freqtrade/tests/test_dataframe.py index 9af42a30e..22a0115de 100644 --- a/freqtrade/tests/test_dataframe.py +++ b/freqtrade/tests/test_dataframe.py @@ -4,7 +4,7 @@ import pandas import freqtrade.optimize from freqtrade import analyze -_pairs = ['BTC_ETH'] +_pairs = ['ETH/BTC'] def load_dataframe_pair(pairs): diff --git a/freqtrade/tests/test_main.py b/freqtrade/tests/test_main.py index ba7f8108f..94506e7e2 100644 --- a/freqtrade/tests/test_main.py +++ b/freqtrade/tests/test_main.py @@ -11,7 +11,6 @@ from sqlalchemy import create_engine import freqtrade.main as main import freqtrade.tests.conftest as tt # test tools from freqtrade import DependencyException, OperationalException -from freqtrade.exchange import Exchanges from freqtrade.main import (_process, check_handle_timedout, create_trade, execute_sell, get_target_bid, handle_trade, init) from freqtrade.misc import State, get_state @@ -250,8 +249,8 @@ def test_create_trade_no_pairs_after_blacklist(default_conf, ticker, mocker): with pytest.raises(DependencyException, match=r'.*No pair in whitelist.*'): conf = copy.deepcopy(default_conf) - conf['exchange']['pair_whitelist'] = ["BTC_ETH"] - conf['exchange']['pair_blacklist'] = ["BTC_ETH"] + conf['exchange']['pair_whitelist'] = ["ETH/BTC"] + conf['exchange']['pair_blacklist'] = ["ETH/BTC"] mocker.patch.dict('freqtrade.main._CONF', conf) create_trade(default_conf['stake_amount'], int(default_conf['ticker_interval'])) @@ -454,7 +453,7 @@ def test_check_handle_timedout_buy(default_conf, ticker, limit_buy_order_old, mo init(default_conf, create_engine('sqlite://')) trade_buy = Trade( - pair='BTC_ETH', + pair='ETH/BTC', open_rate=0.00001099, exchange='BITTREX', open_order_id='123456789', @@ -503,7 +502,7 @@ def test_check_handle_timedout_sell(default_conf, ticker, limit_sell_order_old, init(default_conf, create_engine('sqlite://')) trade_sell = Trade( - pair='BTC_ETH', + pair='ETH/BTC', open_rate=0.00001099, exchange='BITTREX', open_order_id='123456789', @@ -552,7 +551,7 @@ def test_check_handle_timedout_partial(default_conf, ticker, limit_buy_order_old init(default_conf, create_engine('sqlite://')) trade_buy = Trade( - pair='BTC_ETH', + pair='ETH/BTC', open_rate=0.00001099, exchange='BITTREX', open_order_id='123456789', @@ -617,7 +616,7 @@ def test_execute_sell_up(default_conf, ticker, ticker_sell_up, mocker): assert rpc_mock.call_count == 2 assert 'Selling' in rpc_mock.call_args_list[-1][0][0] - assert '[BTC_ETH]' in rpc_mock.call_args_list[-1][0][0] + assert '[ETH/BTC]' in rpc_mock.call_args_list[-1][0][0] assert 'Amount' in rpc_mock.call_args_list[-1][0][0] assert 'Profit' in rpc_mock.call_args_list[-1][0][0] assert '0.00001172' in rpc_mock.call_args_list[-1][0][0] @@ -655,7 +654,7 @@ def test_execute_sell_down(default_conf, ticker, ticker_sell_down, mocker): assert rpc_mock.call_count == 2 assert 'Selling' in rpc_mock.call_args_list[-1][0][0] - assert '[BTC_ETH]' in rpc_mock.call_args_list[-1][0][0] + assert '[ETH/BTC]' in rpc_mock.call_args_list[-1][0][0] assert 'Amount' in rpc_mock.call_args_list[-1][0][0] assert '0.00001044' in rpc_mock.call_args_list[-1][0][0] assert 'loss: -5.48%, -0.00005492' in rpc_mock.call_args_list[-1][0][0] @@ -688,7 +687,7 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, ticker_sell_d assert rpc_mock.call_count == 2 assert 'Selling' in rpc_mock.call_args_list[-1][0][0] - assert '[BTC_ETH]' in rpc_mock.call_args_list[-1][0][0] + assert '[ETH/BTC]' in rpc_mock.call_args_list[-1][0][0] assert '0.00001044' in rpc_mock.call_args_list[-1][0][0] assert 'loss: -5.48%, -0.00005492' in rpc_mock.call_args_list[-1][0][0] @@ -719,7 +718,7 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, ticker_sell_up, assert rpc_mock.call_count == 2 assert 'Selling' in rpc_mock.call_args_list[-1][0][0] - assert '[BTC_ETH]' in rpc_mock.call_args_list[-1][0][0] + assert '[ETH/BTC]' in rpc_mock.call_args_list[-1][0][0] assert 'Amount' in rpc_mock.call_args_list[-1][0][0] assert '0.00001172' in rpc_mock.call_args_list[-1][0][0] assert '(profit: 6.11%, 0.00006126)' in rpc_mock.call_args_list[-1][0][0] diff --git a/freqtrade/tests/test_persistence.py b/freqtrade/tests/test_persistence.py index 401de7acb..a72014ccb 100644 --- a/freqtrade/tests/test_persistence.py +++ b/freqtrade/tests/test_persistence.py @@ -117,7 +117,7 @@ def test_update_with_bittrex(limit_buy_order, limit_sell_order): """ trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, fee=0.0025, exchange=Exchanges.BITTREX, @@ -144,7 +144,7 @@ def test_update_with_bittrex(limit_buy_order, limit_sell_order): def test_calc_open_close_trade_price(limit_buy_order, limit_sell_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, fee=0.0025, exchange=Exchanges.BITTREX, @@ -166,7 +166,7 @@ def test_calc_open_close_trade_price(limit_buy_order, limit_sell_order): def test_calc_close_trade_price_exception(limit_buy_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, fee=0.0025, exchange=Exchanges.BITTREX, @@ -179,7 +179,7 @@ def test_calc_close_trade_price_exception(limit_buy_order): def test_update_open_order(limit_buy_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=1.00, fee=0.1, exchange=Exchanges.BITTREX, @@ -201,7 +201,7 @@ def test_update_open_order(limit_buy_order): def test_update_invalid_order(limit_buy_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=1.00, fee=0.1, exchange=Exchanges.BITTREX, @@ -213,7 +213,7 @@ def test_update_invalid_order(limit_buy_order): def test_calc_open_trade_price(limit_buy_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, fee=0.0025, exchange=Exchanges.BITTREX, @@ -230,7 +230,7 @@ def test_calc_open_trade_price(limit_buy_order): def test_calc_close_trade_price(limit_buy_order, limit_sell_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, fee=0.0025, exchange=Exchanges.BITTREX, @@ -251,7 +251,7 @@ def test_calc_close_trade_price(limit_buy_order, limit_sell_order): def test_calc_profit(limit_buy_order, limit_sell_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, fee=0.0025, exchange=Exchanges.BITTREX, @@ -285,7 +285,7 @@ def test_calc_profit(limit_buy_order, limit_sell_order): def test_calc_profit_percent(limit_buy_order, limit_sell_order): trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, fee=0.0025, exchange=Exchanges.BITTREX, @@ -316,7 +316,7 @@ def test_clean_dry_run_db(default_conf): # Simulate dry_run entries trade = Trade( - pair='BTC_ETH', + pair='ETH/BTC', stake_amount=0.001, amount=123.0, fee=0.0025, @@ -327,7 +327,7 @@ def test_clean_dry_run_db(default_conf): Trade.session.add(trade) trade = Trade( - pair='BTC_ETC', + pair='ETC/BTC', stake_amount=0.001, amount=123.0, fee=0.0025, @@ -339,7 +339,7 @@ def test_clean_dry_run_db(default_conf): # Simulate prod entry trade = Trade( - pair='BTC_ETC', + pair='ETC/BTC', stake_amount=0.001, amount=123.0, fee=0.0025, diff --git a/freqtrade/tests/testdata/download_backtest_data.py b/freqtrade/tests/testdata/download_backtest_data.py index 0cb545b3a..631ba13aa 100755 --- a/freqtrade/tests/testdata/download_backtest_data.py +++ b/freqtrade/tests/testdata/download_backtest_data.py @@ -10,10 +10,10 @@ from freqtrade import misc parser = misc.common_args_parser('download utility') parser.add_argument( - '-p', '--pair', - help='JSON file containing pairs to download', - dest='pair', - default=None + '-p', '--pair', + help='JSON file containing pairs to download', + dest='pair', + default=None ) args = parser.parse_args(sys.argv[1:]) @@ -34,5 +34,6 @@ for pair in PAIRS: for tick_interval in TICKER_INTERVALS: print('downloading pair %s, interval %s' % (pair, tick_interval)) data = exchange.get_ticker_history(pair, tick_interval) - filename = '{}-{}.json'.format(pair, tick_interval) + pair_print = pair.replace('/', '_') + filename = '{}-{}.json'.format(pair_print, tick_interval) misc.file_dump_json(filename, data) diff --git a/freqtrade/tests/testdata/pairs.json b/freqtrade/tests/testdata/pairs.json index 5eb7b0205..f4bab6dc5 100644 --- a/freqtrade/tests/testdata/pairs.json +++ b/freqtrade/tests/testdata/pairs.json @@ -1,26 +1,26 @@ [ - "BTC_ADA", - "BTC_BAT", - "BTC_DASH", - "BTC_ETC", - "BTC_ETH", - "BTC_GBYTE", - "BTC_LSK", - "BTC_LTC", - "BTC_NEO", - "BTC_NXT", - "BTC_POWR", - "BTC_STORJ", - "BTC_QTUM", - "BTC_WAVES", - "BTC_VTC", - "BTC_XLM", - "BTC_XMR", - "BTC_XVG", - "BTC_XRP", - "BTC_ZEC", - "USDT_BTC", - "USDT_LTC", - "USDT_ETH" + "ADA/BTC", + "BAT/BTC", + "DASH/BTC", + "ETC/BTC", + "ETH/BTC", + "GBYTE/BTC", + "LSK/BTC", + "LTC/BTC", + "NEO/BTC", + "NXT/BTC", + "POWR/BTC", + "STORJ/BTC", + "QTUM/BTC", + "WAVES/BTC", + "VTC/BTC", + "XLM/BTC", + "XMR/BTC", + "XVG/BTC", + "XRP/BTC", + "ZEC/BTC", + "BTC/USDT", + "LTC/USDT", + "ETH/USDT" ] diff --git a/user_data/hyperopt_conf.py b/user_data/hyperopt_conf.py index 8e044e549..1e9ab88a4 100644 --- a/user_data/hyperopt_conf.py +++ b/user_data/hyperopt_conf.py @@ -26,16 +26,16 @@ def hyperopt_optimize_conf() -> dict: }, "exchange": { "pair_whitelist": [ - "BTC_ETH", - "BTC_LTC", - "BTC_ETC", - "BTC_DASH", - "BTC_ZEC", - "BTC_XLM", - "BTC_NXT", - "BTC_POWR", - "BTC_ADA", - "BTC_XMR" + "ETH/BTC", + "LTC/BTC", + "ETC/BTC", + "DASH/BTC", + "ZEC/BTC", + "XLM/BTC", + "NXT/BTC", + "POWR/BTC", + "ADA/BTC", + "XMR/BTC" ] } }