2018-12-25 13:23:59 +00:00
|
|
|
from unittest.mock import MagicMock
|
2018-12-25 12:56:30 +00:00
|
|
|
|
|
|
|
from pandas import DataFrame
|
|
|
|
|
|
|
|
from freqtrade.data.dataprovider import DataProvider
|
2018-12-29 08:13:20 +00:00
|
|
|
from freqtrade.state import RunMode
|
2018-12-25 13:23:59 +00:00
|
|
|
from freqtrade.tests.conftest import get_patched_exchange
|
2018-12-25 12:56:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_ohlcv(mocker, default_conf, ticker_history):
|
2019-01-22 05:56:54 +00:00
|
|
|
default_conf["runmode"] = RunMode.DRY_RUN
|
2019-04-07 13:14:40 +00:00
|
|
|
ticker_interval = default_conf["ticker_interval"]
|
2018-12-25 12:56:30 +00:00
|
|
|
exchange = get_patched_exchange(mocker, default_conf)
|
2019-04-07 13:14:40 +00:00
|
|
|
exchange._klines[("XRP/BTC", ticker_interval)] = ticker_history
|
|
|
|
exchange._klines[("UNITTEST/BTC", ticker_interval)] = ticker_history
|
2019-08-18 10:06:21 +00:00
|
|
|
|
2018-12-25 12:56:30 +00:00
|
|
|
dp = DataProvider(default_conf, exchange)
|
2018-12-29 08:13:20 +00:00
|
|
|
assert dp.runmode == RunMode.DRY_RUN
|
2019-04-07 13:14:40 +00:00
|
|
|
assert ticker_history.equals(dp.ohlcv("UNITTEST/BTC", ticker_interval))
|
|
|
|
assert isinstance(dp.ohlcv("UNITTEST/BTC", ticker_interval), DataFrame)
|
|
|
|
assert dp.ohlcv("UNITTEST/BTC", ticker_interval) is not ticker_history
|
|
|
|
assert dp.ohlcv("UNITTEST/BTC", ticker_interval, copy=False) is ticker_history
|
|
|
|
assert not dp.ohlcv("UNITTEST/BTC", ticker_interval).empty
|
|
|
|
assert dp.ohlcv("NONESENSE/AAA", ticker_interval).empty
|
2018-12-30 06:15:49 +00:00
|
|
|
|
|
|
|
# Test with and without parameter
|
2019-04-07 13:14:40 +00:00
|
|
|
assert dp.ohlcv("UNITTEST/BTC", ticker_interval).equals(dp.ohlcv("UNITTEST/BTC"))
|
2018-12-29 08:13:20 +00:00
|
|
|
|
2019-01-22 05:56:54 +00:00
|
|
|
default_conf["runmode"] = RunMode.LIVE
|
2018-12-29 08:13:20 +00:00
|
|
|
dp = DataProvider(default_conf, exchange)
|
|
|
|
assert dp.runmode == RunMode.LIVE
|
2019-04-07 13:14:40 +00:00
|
|
|
assert isinstance(dp.ohlcv("UNITTEST/BTC", ticker_interval), DataFrame)
|
2018-12-29 08:13:20 +00:00
|
|
|
|
2019-01-22 05:56:54 +00:00
|
|
|
default_conf["runmode"] = RunMode.BACKTEST
|
2018-12-29 08:13:20 +00:00
|
|
|
dp = DataProvider(default_conf, exchange)
|
|
|
|
assert dp.runmode == RunMode.BACKTEST
|
2019-04-07 13:14:40 +00:00
|
|
|
assert dp.ohlcv("UNITTEST/BTC", ticker_interval).empty
|
2018-12-25 12:56:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_historic_ohlcv(mocker, default_conf, ticker_history):
|
|
|
|
historymock = MagicMock(return_value=ticker_history)
|
2019-01-22 05:56:54 +00:00
|
|
|
mocker.patch("freqtrade.data.dataprovider.load_pair_history", historymock)
|
2018-12-25 12:56:30 +00:00
|
|
|
|
|
|
|
dp = DataProvider(default_conf, None)
|
2019-01-22 05:56:54 +00:00
|
|
|
data = dp.historic_ohlcv("UNITTEST/BTC", "5m")
|
2018-12-25 12:56:30 +00:00
|
|
|
assert isinstance(data, DataFrame)
|
|
|
|
assert historymock.call_count == 1
|
2019-01-22 05:56:54 +00:00
|
|
|
assert historymock.call_args_list[0][1]["datadir"] is None
|
|
|
|
assert historymock.call_args_list[0][1]["refresh_pairs"] is False
|
|
|
|
assert historymock.call_args_list[0][1]["ticker_interval"] == "5m"
|
2018-12-26 13:23:21 +00:00
|
|
|
|
|
|
|
|
2019-08-17 09:59:27 +00:00
|
|
|
def test_get_pair_dataframe(mocker, default_conf, ticker_history):
|
|
|
|
default_conf["runmode"] = RunMode.DRY_RUN
|
|
|
|
ticker_interval = default_conf["ticker_interval"]
|
|
|
|
exchange = get_patched_exchange(mocker, default_conf)
|
|
|
|
exchange._klines[("XRP/BTC", ticker_interval)] = ticker_history
|
|
|
|
exchange._klines[("UNITTEST/BTC", ticker_interval)] = ticker_history
|
2019-08-18 10:06:21 +00:00
|
|
|
|
2019-08-17 09:59:27 +00:00
|
|
|
dp = DataProvider(default_conf, exchange)
|
|
|
|
assert dp.runmode == RunMode.DRY_RUN
|
|
|
|
assert ticker_history.equals(dp.get_pair_dataframe("UNITTEST/BTC", ticker_interval))
|
|
|
|
assert isinstance(dp.get_pair_dataframe("UNITTEST/BTC", ticker_interval), DataFrame)
|
|
|
|
assert dp.get_pair_dataframe("UNITTEST/BTC", ticker_interval) is not ticker_history
|
|
|
|
assert not dp.get_pair_dataframe("UNITTEST/BTC", ticker_interval).empty
|
|
|
|
assert dp.get_pair_dataframe("NONESENSE/AAA", ticker_interval).empty
|
|
|
|
|
|
|
|
# Test with and without parameter
|
|
|
|
assert dp.get_pair_dataframe("UNITTEST/BTC",
|
|
|
|
ticker_interval).equals(dp.get_pair_dataframe("UNITTEST/BTC"))
|
|
|
|
|
|
|
|
default_conf["runmode"] = RunMode.LIVE
|
|
|
|
dp = DataProvider(default_conf, exchange)
|
|
|
|
assert dp.runmode == RunMode.LIVE
|
|
|
|
assert isinstance(dp.get_pair_dataframe("UNITTEST/BTC", ticker_interval), DataFrame)
|
|
|
|
assert dp.get_pair_dataframe("NONESENSE/AAA", ticker_interval).empty
|
|
|
|
|
|
|
|
historymock = MagicMock(return_value=ticker_history)
|
|
|
|
mocker.patch("freqtrade.data.dataprovider.load_pair_history", historymock)
|
|
|
|
default_conf["runmode"] = RunMode.BACKTEST
|
|
|
|
dp = DataProvider(default_conf, exchange)
|
|
|
|
assert dp.runmode == RunMode.BACKTEST
|
|
|
|
assert isinstance(dp.get_pair_dataframe("UNITTEST/BTC", ticker_interval), DataFrame)
|
|
|
|
# assert dp.get_pair_dataframe("NONESENSE/AAA", ticker_interval).empty
|
|
|
|
|
|
|
|
|
2018-12-26 13:23:21 +00:00
|
|
|
def test_available_pairs(mocker, default_conf, ticker_history):
|
|
|
|
exchange = get_patched_exchange(mocker, default_conf)
|
2019-04-07 13:14:40 +00:00
|
|
|
ticker_interval = default_conf["ticker_interval"]
|
|
|
|
exchange._klines[("XRP/BTC", ticker_interval)] = ticker_history
|
|
|
|
exchange._klines[("UNITTEST/BTC", ticker_interval)] = ticker_history
|
2018-12-26 13:23:21 +00:00
|
|
|
|
2019-08-18 10:06:21 +00:00
|
|
|
dp = DataProvider(default_conf, exchange)
|
2018-12-26 13:23:21 +00:00
|
|
|
assert len(dp.available_pairs) == 2
|
2019-01-22 05:56:54 +00:00
|
|
|
assert dp.available_pairs == [
|
2019-04-07 13:14:40 +00:00
|
|
|
("XRP/BTC", ticker_interval),
|
|
|
|
("UNITTEST/BTC", ticker_interval),
|
2019-01-22 05:56:54 +00:00
|
|
|
]
|
2019-01-22 05:55:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_refresh(mocker, default_conf, ticker_history):
|
|
|
|
refresh_mock = MagicMock()
|
2019-01-22 05:56:54 +00:00
|
|
|
mocker.patch("freqtrade.exchange.Exchange.refresh_latest_ohlcv", refresh_mock)
|
2019-01-22 05:55:40 +00:00
|
|
|
|
2019-01-22 05:56:54 +00:00
|
|
|
exchange = get_patched_exchange(mocker, default_conf, id="binance")
|
2019-04-07 13:14:40 +00:00
|
|
|
ticker_interval = default_conf["ticker_interval"]
|
|
|
|
pairs = [("XRP/BTC", ticker_interval), ("UNITTEST/BTC", ticker_interval)]
|
2019-01-22 05:55:40 +00:00
|
|
|
|
2019-04-07 13:14:40 +00:00
|
|
|
pairs_non_trad = [("ETH/USDT", ticker_interval), ("BTC/TUSD", "1h")]
|
2019-01-22 05:55:40 +00:00
|
|
|
|
|
|
|
dp = DataProvider(default_conf, exchange)
|
|
|
|
dp.refresh(pairs)
|
|
|
|
|
|
|
|
assert refresh_mock.call_count == 1
|
|
|
|
assert len(refresh_mock.call_args[0]) == 1
|
|
|
|
assert len(refresh_mock.call_args[0][0]) == len(pairs)
|
|
|
|
assert refresh_mock.call_args[0][0] == pairs
|
|
|
|
|
|
|
|
refresh_mock.reset_mock()
|
|
|
|
dp.refresh(pairs, pairs_non_trad)
|
|
|
|
assert refresh_mock.call_count == 1
|
|
|
|
assert len(refresh_mock.call_args[0]) == 1
|
|
|
|
assert len(refresh_mock.call_args[0][0]) == len(pairs) + len(pairs_non_trad)
|
|
|
|
assert refresh_mock.call_args[0][0] == pairs + pairs_non_trad
|