Ejemplo n.º 1
0
def test_convert_trades_to_ohlcv(mocker, default_conf, testdatadir, caplog):

    pair = 'XRP/ETH'
    file1 = testdatadir / 'XRP_ETH-1m.json'
    file5 = testdatadir / 'XRP_ETH-5m.json'
    # Compare downloaded dataset with converted dataset
    dfbak_1m = load_pair_history(datadir=testdatadir,
                                 timeframe="1m",
                                 pair=pair)
    dfbak_5m = load_pair_history(datadir=testdatadir,
                                 timeframe="5m",
                                 pair=pair)

    _backup_file(file1, copy_file=True)
    _backup_file(file5)

    tr = TimeRange.parse_timerange('20191011-20191012')

    convert_trades_to_ohlcv([pair],
                            timeframes=['1m', '5m'],
                            datadir=testdatadir,
                            timerange=tr,
                            erase=True)

    assert log_has("Deleting existing data for pair XRP/ETH, interval 1m.",
                   caplog)
    # Load new data
    df_1m = load_pair_history(datadir=testdatadir, timeframe="1m", pair=pair)
    df_5m = load_pair_history(datadir=testdatadir, timeframe="5m", pair=pair)

    assert df_1m.equals(dfbak_1m)
    assert df_5m.equals(dfbak_5m)

    _clean_test_file(file1)
    _clean_test_file(file5)
Ejemplo n.º 2
0
def test_load_data_with_new_pair_1min(ticker_history_list, mocker, caplog,
                                      default_conf, testdatadir) -> None:
    """
    Test load_pair_history() with 1 min ticker
    """
    mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv',
                 return_value=ticker_history_list)
    exchange = get_patched_exchange(mocker, default_conf)
    file = testdatadir / 'MEME_BTC-1m.json'

    _backup_file(file)
    # do not download a new pair if refresh_pairs isn't set
    load_pair_history(datadir=testdatadir, timeframe='1m', pair='MEME/BTC')
    assert not file.is_file()
    assert log_has(
        'No history data for pair: "MEME/BTC", timeframe: 1m. '
        'Use `freqtrade download-data` to download the data', caplog)

    # download a new pair if refresh_pairs is set
    refresh_data(datadir=testdatadir,
                 timeframe='1m',
                 pairs=['MEME/BTC'],
                 exchange=exchange)
    load_pair_history(datadir=testdatadir, timeframe='1m', pair='MEME/BTC')
    assert file.is_file()
    assert log_has_re(
        'Download history data for pair: "MEME/BTC", timeframe: 1m '
        'and store in .*', caplog)
    _clean_test_file(file)
Ejemplo n.º 3
0
def test_load_data_startup_candles(mocker, caplog, default_conf, testdatadir) -> None:
    ltfmock = mocker.patch('freqtrade.data.history.load_tickerdata_file',
                           MagicMock(return_value=None))
    timerange = TimeRange('date', None, 1510639620, 0)
    history.load_pair_history(pair='UNITTEST/BTC', timeframe='1m',
                              datadir=testdatadir, timerange=timerange,
                              startup_candles=20,
                              )

    assert ltfmock.call_count == 1
    assert ltfmock.call_args_list[0][1]['timerange'] != timerange
    # startts is 20 minutes earlier
    assert ltfmock.call_args_list[0][1]['timerange'].startts == timerange.startts - 20 * 60
Ejemplo n.º 4
0
def test_load_data_30min_ticker(mocker, caplog, default_conf, testdatadir) -> None:
    ld = history.load_pair_history(pair='UNITTEST/BTC', timeframe='30m', datadir=testdatadir)
    assert isinstance(ld, DataFrame)
    assert not log_has(
        'Download history data for pair: "UNITTEST/BTC", timeframe: 30m '
        'and store in None.', caplog
    )
Ejemplo n.º 5
0
def test_add_indicators(default_conf, caplog):
    pair = "UNITTEST/BTC"
    timerange = TimeRange(None, 'line', 0, -1000)

    data = history.load_pair_history(pair=pair, ticker_interval='1m',
                                     datadir=None, timerange=timerange)
    indicators1 = ["ema10"]
    indicators2 = ["macd"]

    # Generate buy/sell signals and indicators
    strat = DefaultStrategy(default_conf)
    data = strat.analyze_ticker(data, {'pair': pair})
    fig = generage_empty_figure()

    # Row 1
    fig1 = add_indicators(fig=deepcopy(fig), row=1, indicators=indicators1, data=data)
    figure = fig1.layout.figure
    ema10 = find_trace_in_fig_data(figure.data, "ema10")
    assert isinstance(ema10, go.Scatter)
    assert ema10.yaxis == "y"

    fig2 = add_indicators(fig=deepcopy(fig), row=3, indicators=indicators2, data=data)
    figure = fig2.layout.figure
    macd = find_trace_in_fig_data(figure.data, "macd")
    assert isinstance(macd, go.Scatter)
    assert macd.yaxis == "y3"

    # No indicator found
    fig3 = add_indicators(fig=deepcopy(fig), row=3, indicators=['no_indicator'], data=data)
    assert fig == fig3
    assert log_has_re(r'Indicator "no_indicator" ignored\..*', caplog)
Ejemplo n.º 6
0
def test_generate_candlestick_graph_no_signals_no_trades(default_conf, mocker, testdatadir, caplog):
    row_mock = mocker.patch('freqtrade.plot.plotting.add_indicators',
                            MagicMock(side_effect=fig_generating_mock))
    trades_mock = mocker.patch('freqtrade.plot.plotting.plot_trades',
                               MagicMock(side_effect=fig_generating_mock))

    pair = "UNITTEST/BTC"
    timerange = TimeRange(None, 'line', 0, -1000)
    data = history.load_pair_history(pair=pair, timeframe='1m',
                                     datadir=testdatadir, timerange=timerange)
    data['buy'] = 0
    data['sell'] = 0

    indicators1 = []
    indicators2 = []
    fig = generate_candlestick_graph(pair=pair, data=data, trades=None,
                                     indicators1=indicators1, indicators2=indicators2)
    assert isinstance(fig, go.Figure)
    assert fig.layout.title.text == pair
    figure = fig.layout.figure

    assert len(figure.data) == 2
    # Candlesticks are plotted first
    candles = find_trace_in_fig_data(figure.data, "Price")
    assert isinstance(candles, go.Candlestick)

    volume = find_trace_in_fig_data(figure.data, "Volume")
    assert isinstance(volume, go.Bar)

    assert row_mock.call_count == 2
    assert trades_mock.call_count == 1

    assert log_has("No buy-signals found.", caplog)
    assert log_has("No sell-signals found.", caplog)
Ejemplo n.º 7
0
def test_add_indicators(default_conf, testdatadir, caplog):
    pair = "UNITTEST/BTC"
    timerange = TimeRange(None, 'line', 0, -1000)

    data = history.load_pair_history(pair=pair, timeframe='1m',
                                     datadir=testdatadir, timerange=timerange)
    indicators1 = {"ema10": {}}
    indicators2 = {"macd": {"color": "red"}}

    strategy = StrategyResolver.load_strategy(default_conf)

    # Generate buy/sell signals and indicators
    data = strategy.analyze_ticker(data, {'pair': pair})
    fig = generate_empty_figure()

    # Row 1
    fig1 = add_indicators(fig=deepcopy(fig), row=1, indicators=indicators1, data=data)
    figure = fig1.layout.figure
    ema10 = find_trace_in_fig_data(figure.data, "ema10")
    assert isinstance(ema10, go.Scatter)
    assert ema10.yaxis == "y"

    fig2 = add_indicators(fig=deepcopy(fig), row=3, indicators=indicators2, data=data)
    figure = fig2.layout.figure
    macd = find_trace_in_fig_data(figure.data, "macd")
    assert isinstance(macd, go.Scatter)
    assert macd.yaxis == "y3"
    assert macd.line.color == "red"

    # No indicator found
    fig3 = add_indicators(fig=deepcopy(fig), row=3, indicators={'no_indicator': {}}, data=data)
    assert fig == fig3
    assert log_has_re(r'Indicator "no_indicator" ignored\..*', caplog)
Ejemplo n.º 8
0
def load_data_test(what, testdatadir):
    timerange = TimeRange.parse_timerange('1510694220-1510700340')
    data = history.load_pair_history(pair='UNITTEST/BTC', datadir=testdatadir,
                                     timeframe='1m', timerange=timerange,
                                     drop_incomplete=False,
                                     fill_up_missing=False)

    base = 0.001
    if what == 'raise':
        data.loc[:, 'open'] = data.index * base
        data.loc[:, 'high'] = data.index * base + 0.0001
        data.loc[:, 'low'] = data.index * base - 0.0001
        data.loc[:, 'close'] = data.index * base

    if what == 'lower':
        data.loc[:, 'open'] = 1 - data.index * base
        data.loc[:, 'high'] = 1 - data.index * base + 0.0001
        data.loc[:, 'low'] = 1 - data.index * base - 0.0001
        data.loc[:, 'close'] = 1 - data.index * base

    if what == 'sine':
        hz = 0.1  # frequency
        data.loc[:, 'open'] = np.sin(data.index * hz) / 1000 + base
        data.loc[:, 'high'] = np.sin(data.index * hz) / 1000 + base + 0.0001
        data.loc[:, 'low'] = np.sin(data.index * hz) / 1000 + base - 0.0001
        data.loc[:, 'close'] = np.sin(data.index * hz) / 1000 + base

    return {'UNITTEST/BTC': clean_ohlcv_dataframe(data, timeframe='1m', pair='UNITTEST/BTC',
                                                  fill_missing=True)}
Ejemplo n.º 9
0
def test_add_profit(testdatadir):
    filename = testdatadir / "backtest-result_test.json"
    bt_data = load_backtest_data(filename)
    timerange = TimeRange.parse_timerange("20180110-20180112")

    df = history.load_pair_history(pair="TRX/BTC",
                                   ticker_interval='5m',
                                   datadir=testdatadir,
                                   timerange=timerange)
    fig = generate_empty_figure()

    cum_profits = create_cum_profit(df.set_index('date'),
                                    bt_data[bt_data["pair"] == 'TRX/BTC'],
                                    "cum_profits",
                                    timeframe="5m")

    fig1 = add_profit(fig,
                      row=2,
                      data=cum_profits,
                      column='cum_profits',
                      name='Profits')
    figure = fig1.layout.figure
    profits = find_trace_in_fig_data(figure.data, "Profits")
    assert isinstance(profits, go.Scatter)
    assert profits.yaxis == "y2"
Ejemplo n.º 10
0
def test_extract_trades_of_period():
    pair = "UNITTEST/BTC"
    timerange = TimeRange(None, 'line', 0, -1000)

    data = load_pair_history(pair=pair, ticker_interval='1m',
                             datadir=None, timerange=timerange)

    # timerange = 2017-11-14 06:07 - 2017-11-14 22:58:00
    trades = DataFrame(
        {'pair': [pair, pair, pair, pair],
         'profit_percent': [0.0, 0.1, -0.2, -0.5],
         'profit_abs': [0.0, 1, -2, -5],
         'open_time': to_datetime([Arrow(2017, 11, 13, 15, 40, 0).datetime,
                                   Arrow(2017, 11, 14, 9, 41, 0).datetime,
                                   Arrow(2017, 11, 14, 14, 20, 0).datetime,
                                   Arrow(2017, 11, 15, 3, 40, 0).datetime,
                                   ], utc=True
                                  ),
         'close_time': to_datetime([Arrow(2017, 11, 13, 16, 40, 0).datetime,
                                    Arrow(2017, 11, 14, 10, 41, 0).datetime,
                                    Arrow(2017, 11, 14, 15, 25, 0).datetime,
                                    Arrow(2017, 11, 15, 3, 55, 0).datetime,
                                    ], utc=True)
         })
    trades1 = extract_trades_of_period(data, trades)
    # First and last trade are dropped as they are out of range
    assert len(trades1) == 2
    assert trades1.iloc[0].open_time == Arrow(2017, 11, 14, 9, 41, 0).datetime
    assert trades1.iloc[0].close_time == Arrow(2017, 11, 14, 10, 41, 0).datetime
    assert trades1.iloc[-1].open_time == Arrow(2017, 11, 14, 14, 20, 0).datetime
    assert trades1.iloc[-1].close_time == Arrow(2017, 11, 14, 15, 25, 0).datetime
Ejemplo n.º 11
0
def test_create_cum_profit1(testdatadir):
    filename = testdatadir / "backtest-result_test.json"
    bt_data = load_backtest_data(filename)
    # Move close-time to "off" the candle, to make sure the logic still works
    bt_data.loc[:, 'close_date'] = bt_data.loc[:, 'close_date'] + DateOffset(
        seconds=20)
    timerange = TimeRange.parse_timerange("20180110-20180112")

    df = load_pair_history(pair="TRX/BTC",
                           timeframe='5m',
                           datadir=testdatadir,
                           timerange=timerange)

    cum_profits = create_cum_profit(df.set_index('date'),
                                    bt_data[bt_data["pair"] == 'TRX/BTC'],
                                    "cum_profits",
                                    timeframe="5m")
    assert "cum_profits" in cum_profits.columns
    assert cum_profits.iloc[0]['cum_profits'] == 0
    assert cum_profits.iloc[-1]['cum_profits'] == 0.0798005

    with pytest.raises(ValueError, match='Trade dataframe empty.'):
        create_cum_profit(df.set_index('date'),
                          bt_data[bt_data["pair"] == 'NOTAPAIR'],
                          "cum_profits",
                          timeframe="5m")
Ejemplo n.º 12
0
def test_load_data_30min_ticker(mocker, caplog, default_conf) -> None:
    ld = history.load_pair_history(pair='UNITTEST/BTC',
                                   ticker_interval='30m',
                                   datadir=None)
    assert isinstance(ld, DataFrame)
    assert not log_has('Download the pair: "UNITTEST/BTC", Interval: 30m',
                       caplog.record_tuples)
Ejemplo n.º 13
0
def test_load_data_7min_ticker(mocker, caplog, default_conf) -> None:
    ld = history.load_pair_history(pair='UNITTEST/BTC', ticker_interval='7m', datadir=None)
    assert not isinstance(ld, DataFrame)
    assert ld is None
    assert log_has(
        'No data for pair: "UNITTEST/BTC", Interval: 7m. '
        'Use --refresh-pairs-cached to download the data', caplog.record_tuples)
Ejemplo n.º 14
0
 def historic_ohlcv(self,
                    pair: str,
                    timeframe: str = None,
                    candle_type: str = '') -> DataFrame:
     """
     Get stored historical candle (OHLCV) data
     :param pair: pair to get the data for
     :param timeframe: timeframe to get data for
     :param candle_type: '', mark, index, premiumIndex, or funding_rate
     """
     _candle_type = CandleType.from_string(
         candle_type
     ) if candle_type != '' else self._config['candle_type_def']
     saved_pair = (pair, str(timeframe), _candle_type)
     if saved_pair not in self.__cached_pairs_backtesting:
         timerange = TimeRange.parse_timerange(None if self._config.get(
             'timerange') is None else str(self._config.get('timerange')))
         # Move informative start time respecting startup_candle_count
         timerange.subtract_start(
             timeframe_to_seconds(str(timeframe)) *
             self._config.get('startup_candle_count', 0))
         self.__cached_pairs_backtesting[saved_pair] = load_pair_history(
             pair=pair,
             timeframe=timeframe or self._config['timeframe'],
             datadir=self._config['datadir'],
             timerange=timerange,
             data_format=self._config.get('dataformat_ohlcv', 'json'),
             candle_type=_candle_type,
         )
     return self.__cached_pairs_backtesting[saved_pair].copy()
Ejemplo n.º 15
0
def test_add_areas(default_conf, testdatadir, caplog):
    pair = "UNITTEST/BTC"
    timerange = TimeRange(None, 'line', 0, -1000)

    data = history.load_pair_history(pair=pair,
                                     timeframe='1m',
                                     datadir=testdatadir,
                                     timerange=timerange)
    indicators = {
        "macd": {
            "color": "red",
            "fill_color": "black",
            "fill_to": "macdhist",
            "fill_label": "MACD Fill"
        }
    }

    ind_no_label = {"macd": {"fill_color": "red", "fill_to": "macdhist"}}

    ind_plain = {"macd": {"fill_to": "macdhist"}}
    default_conf.update({'strategy': 'DefaultStrategy'})
    strategy = StrategyResolver.load_strategy(default_conf)

    # Generate buy/sell signals and indicators
    data = strategy.analyze_ticker(data, {'pair': pair})
    fig = generate_empty_figure()

    # indicator mentioned in fill_to does not exist
    fig1 = add_areas(fig, 1, data, {'ema10': {'fill_to': 'no_fill_indicator'}})
    assert fig == fig1
    assert log_has_re(r'fill_to: "no_fill_indicator" ignored\..*', caplog)

    # indicator does not exist
    fig2 = add_areas(fig, 1, data, {'no_indicator': {'fill_to': 'ema10'}})
    assert fig == fig2
    assert log_has_re(r'Indicator "no_indicator" ignored\..*', caplog)

    # everythin given in plot config, row 3
    fig3 = add_areas(fig, 3, data, indicators)
    figure = fig3.layout.figure
    fill_macd = find_trace_in_fig_data(figure.data, "MACD Fill")
    assert isinstance(fill_macd, go.Scatter)
    assert fill_macd.yaxis == "y3"
    assert fill_macd.fillcolor == "black"

    # label missing, row 1
    fig4 = add_areas(fig, 1, data, ind_no_label)
    figure = fig4.layout.figure
    fill_macd = find_trace_in_fig_data(figure.data, "macd<>macdhist")
    assert isinstance(fill_macd, go.Scatter)
    assert fill_macd.yaxis == "y"
    assert fill_macd.fillcolor == "red"

    # fit_to only
    fig5 = add_areas(fig, 1, data, ind_plain)
    figure = fig5.layout.figure
    fill_macd = find_trace_in_fig_data(figure.data, "macd<>macdhist")
    assert isinstance(fill_macd, go.Scatter)
    assert fill_macd.yaxis == "y"
Ejemplo n.º 16
0
def test_load_data_7min_ticker(mocker, caplog, default_conf, testdatadir) -> None:
    ld = history.load_pair_history(pair='UNITTEST/BTC', timeframe='7m', datadir=testdatadir)
    assert not isinstance(ld, DataFrame)
    assert ld is None
    assert log_has(
        'No history data for pair: "UNITTEST/BTC", timeframe: 7m. '
        'Use `freqtrade download-data` to download the data', caplog
    )
Ejemplo n.º 17
0
def test_load_data_7min_ticker(mocker, caplog, default_conf) -> None:
    ld = history.load_pair_history(pair='UNITTEST/BTC',
                                   ticker_interval='7m',
                                   datadir=None)
    assert not isinstance(ld, DataFrame)
    assert ld is None
    assert log_has(
        'No history data for pair: "UNITTEST/BTC", interval: 7m. '
        'Use --refresh-pairs-cached option or `freqtrade download-data` '
        'script to download the data', caplog)
Ejemplo n.º 18
0
 def historic_ohlcv(self, pair: str, timeframe: str = None) -> DataFrame:
     """
     Get stored historic ohlcv data
     :param pair: pair to get the data for
     :param timeframe: timeframe to get data for
     """
     return load_pair_history(pair=pair,
                              timeframe=timeframe or self._config['ticker_interval'],
                              datadir=Path(self._config['datadir'])
                              )
Ejemplo n.º 19
0
 def historic_ohlcv(self, pair: str, timeframe: str = None) -> DataFrame:
     """
     Get stored historical candle (OHLCV) data
     :param pair: pair to get the data for
     :param timeframe: timeframe to get data for
     """
     return load_pair_history(pair=pair,
                              timeframe=timeframe
                              or self._config['timeframe'],
                              datadir=self._config['datadir'])
Ejemplo n.º 20
0
 def historic_ohlcv(self, pair: str, ticker_interval: str) -> DataFrame:
     """
     get stored historic ohlcv data
     :param pair: pair to get the data for
     :param ticker_interval: ticker_interval to get pair for
     """
     return load_pair_history(pair=pair,
                              ticker_interval=ticker_interval,
                              refresh_pairs=False,
                              datadir=Path(self._config['datadir'])
                              if self._config.get('datadir') else None)
Ejemplo n.º 21
0
def test_load_data_with_new_pair_1min(ticker_history_list, mocker, caplog, default_conf) -> None:
    """
    Test load_pair_history() with 1 min ticker
    """
    mocker.patch('freqtrade.exchange.Exchange.get_history', return_value=ticker_history_list)
    exchange = get_patched_exchange(mocker, default_conf)
    file = os.path.join(os.path.dirname(__file__), '..', 'testdata', 'MEME_BTC-1m.json')

    _backup_file(file)
    # do not download a new pair if refresh_pairs isn't set
    history.load_pair_history(datadir=None,
                              ticker_interval='1m',
                              refresh_pairs=False,
                              pair='MEME/BTC')
    assert os.path.isfile(file) is False
    assert log_has('No data for pair: "MEME/BTC", Interval: 1m. '
                   'Use --refresh-pairs-cached to download the data',
                   caplog.record_tuples)

    # download a new pair if refresh_pairs is set
    history.load_pair_history(datadir=None,
                              ticker_interval='1m',
                              refresh_pairs=True,
                              exchange=exchange,
                              pair='MEME/BTC')
    assert os.path.isfile(file) is True
    assert log_has('Download the pair: "MEME/BTC", Interval: 1m', caplog.record_tuples)
    with pytest.raises(OperationalException, match=r'Exchange needs to be initialized when.*'):
        history.load_pair_history(datadir=None,
                                  ticker_interval='1m',
                                  refresh_pairs=True,
                                  exchange=None,
                                  pair='MEME/BTC')
    _clean_test_file(file)
Ejemplo n.º 22
0
def test_generate_candlestick_graph_no_trades(default_conf, mocker,
                                              testdatadir):
    row_mock = mocker.patch('freqtrade.plot.plotting.add_indicators',
                            MagicMock(side_effect=fig_generating_mock))
    trades_mock = mocker.patch('freqtrade.plot.plotting.plot_trades',
                               MagicMock(side_effect=fig_generating_mock))
    pair = 'UNITTEST/BTC'
    timerange = TimeRange(None, 'line', 0, -1000)
    data = history.load_pair_history(pair=pair,
                                     timeframe='1m',
                                     datadir=testdatadir,
                                     timerange=timerange)

    default_conf.update({'strategy': 'DefaultStrategy'})
    strategy = StrategyResolver.load_strategy(default_conf)

    # Generate buy/sell signals and indicators
    data = strategy.analyze_ticker(data, {'pair': pair})

    indicators1 = []
    indicators2 = []
    fig = generate_candlestick_graph(pair=pair,
                                     data=data,
                                     trades=None,
                                     indicators1=indicators1,
                                     indicators2=indicators2)
    assert isinstance(fig, go.Figure)
    assert fig.layout.title.text == pair
    figure = fig.layout.figure

    assert len(figure.data) == 6
    # Candlesticks are plotted first
    candles = find_trace_in_fig_data(figure.data, "Price")
    assert isinstance(candles, go.Candlestick)

    volume = find_trace_in_fig_data(figure.data, "Volume")
    assert isinstance(volume, go.Bar)

    buy = find_trace_in_fig_data(figure.data, "buy")
    assert isinstance(buy, go.Scatter)
    # All buy-signals should be plotted
    assert int(data.buy.sum()) == len(buy.x)

    sell = find_trace_in_fig_data(figure.data, "sell")
    assert isinstance(sell, go.Scatter)
    # All buy-signals should be plotted
    assert int(data.sell.sum()) == len(sell.x)

    assert find_trace_in_fig_data(figure.data, "Bollinger Band")

    assert row_mock.call_count == 2
    assert trades_mock.call_count == 1
Ejemplo n.º 23
0
def test_create_cum_profit():
    filename = make_testdata_path(None) / "backtest-result_test.json"
    bt_data = load_backtest_data(filename)
    timerange = TimeRange.parse_timerange("20180110-20180112")

    df = load_pair_history(pair="POWR/BTC", ticker_interval='5m',
                           datadir=None, timerange=timerange)

    cum_profits = create_cum_profit(df.set_index('date'),
                                    bt_data[bt_data["pair"] == 'POWR/BTC'],
                                    "cum_profits")
    assert "cum_profits" in cum_profits.columns
    assert cum_profits.iloc[0]['cum_profits'] == 0
    assert cum_profits.iloc[-1]['cum_profits'] == 0.0798005
Ejemplo n.º 24
0
def test_create_cum_profit(testdatadir):
    filename = testdatadir / "backtest-result_test.json"
    bt_data = load_backtest_data(filename)
    timerange = TimeRange.parse_timerange("20180110-20180112")

    df = load_pair_history(pair="TRX/BTC",
                           timeframe='5m',
                           datadir=testdatadir,
                           timerange=timerange)

    cum_profits = create_cum_profit(df.set_index('date'),
                                    bt_data[bt_data["pair"] == 'TRX/BTC'],
                                    "cum_profits",
                                    timeframe="5m")
    assert "cum_profits" in cum_profits.columns
    assert cum_profits.iloc[0]['cum_profits'] == 0
    assert cum_profits.iloc[-1]['cum_profits'] == 0.0798005
Ejemplo n.º 25
0
def test_ohlcv_fill_up_missing_data(testdatadir, caplog):
    data = load_pair_history(datadir=testdatadir,
                             timeframe='1m',
                             pair='UNITTEST/BTC',
                             fill_up_missing=False)
    caplog.set_level(logging.DEBUG)
    data2 = ohlcv_fill_up_missing_data(data, '1m', 'UNITTEST/BTC')
    assert len(data2) > len(data)
    # Column names should not change
    assert (data.columns == data2.columns).all()

    assert log_has(f"Missing data fillup for UNITTEST/BTC: before: "
                   f"{len(data)} - after: {len(data2)}", caplog)

    # Test fillup actually fixes invalid backtest data
    min_date, max_date = get_timerange({'UNITTEST/BTC': data})
    assert validate_backtest_data(data, 'UNITTEST/BTC', min_date, max_date, 1)
    assert not validate_backtest_data(data2, 'UNITTEST/BTC', min_date, max_date, 1)
Ejemplo n.º 26
0
def test_extract_trades_of_period(testdatadir):
    pair = "UNITTEST/BTC"
    # 2018-11-14 06:07:00
    timerange = TimeRange('date', None, 1510639620, 0)

    data = load_pair_history(pair=pair,
                             timeframe='1m',
                             datadir=testdatadir,
                             timerange=timerange)

    trades = DataFrame({
        'pair': [pair, pair, pair, pair],
        'profit_ratio': [0.0, 0.1, -0.2, -0.5],
        'profit_abs': [0.0, 1, -2, -5],
        'open_date':
        to_datetime([
            Arrow(2017, 11, 13, 15, 40, 0).datetime,
            Arrow(2017, 11, 14, 9, 41, 0).datetime,
            Arrow(2017, 11, 14, 14, 20, 0).datetime,
            Arrow(2017, 11, 15, 3, 40, 0).datetime,
        ],
                    utc=True),
        'close_date':
        to_datetime([
            Arrow(2017, 11, 13, 16, 40, 0).datetime,
            Arrow(2017, 11, 14, 10, 41, 0).datetime,
            Arrow(2017, 11, 14, 15, 25, 0).datetime,
            Arrow(2017, 11, 15, 3, 55, 0).datetime,
        ],
                    utc=True)
    })
    trades1 = extract_trades_of_period(data, trades)
    # First and last trade are dropped as they are out of range
    assert len(trades1) == 2
    assert trades1.iloc[0].open_date == Arrow(2017, 11, 14, 9, 41, 0).datetime
    assert trades1.iloc[0].close_date == Arrow(2017, 11, 14, 10, 41,
                                               0).datetime
    assert trades1.iloc[-1].open_date == Arrow(2017, 11, 14, 14, 20,
                                               0).datetime
    assert trades1.iloc[-1].close_date == Arrow(2017, 11, 14, 15, 25,
                                                0).datetime
Ejemplo n.º 27
0
 def historic_ohlcv(self, pair: str, timeframe: str = None) -> DataFrame:
     """
     Get stored historical candle (OHLCV) data
     :param pair: pair to get the data for
     :param timeframe: timeframe to get data for
     """
     saved_pair = (pair, str(timeframe))
     if saved_pair not in self.__cached_pairs_backtesting:
         timerange = TimeRange.parse_timerange(None if self._config.get(
             'timerange') is None else str(self._config.get('timerange')))
         # Move informative start time respecting startup_candle_count
         timerange.subtract_start(
             timeframe_to_seconds(str(timeframe)) *
             self._config.get('startup_candle_count', 0))
         self.__cached_pairs_backtesting[saved_pair] = load_pair_history(
             pair=pair,
             timeframe=timeframe or self._config['timeframe'],
             datadir=self._config['datadir'],
             timerange=timerange,
             data_format=self._config.get('dataformat_ohlcv', 'json'))
     return self.__cached_pairs_backtesting[saved_pair].copy()
Ejemplo n.º 28
0
def test_ohlcv_fill_up_missing_data(caplog):
    data = load_pair_history(datadir=None,
                             ticker_interval='1m',
                             refresh_pairs=False,
                             pair='UNITTEST/BTC',
                             fill_up_missing=False)
    caplog.set_level(logging.DEBUG)
    data2 = ohlcv_fill_up_missing_data(data, '1m')
    assert len(data2) > len(data)
    # Column names should not change
    assert (data.columns == data2.columns).all()

    assert log_has(
        f"Missing data fillup: before: {len(data)} - after: {len(data2)}",
        caplog.record_tuples)

    # Test fillup actually fixes invalid backtest data
    min_date, max_date = get_timeframe({'UNITTEST/BTC': data})
    assert validate_backtest_data({'UNITTEST/BTC': data}, min_date, max_date,
                                  1)
    assert not validate_backtest_data({'UNITTEST/BTC': data2}, min_date,
                                      max_date, 1)
def process_candles_data(pairs, filter_price):
    full_dataframe = pd.DataFrame()

    for pair in pairs:

        print(data_location)
        print(config["timeframe"])
        print(pair)

        candles = load_pair_history(datadir=data_location,
                                    timeframe=config["timeframe"],
                                    pair=pair,
                                    data_format="hdf5")

        if len(candles):
            # Not sure about AgeFilter
            # apply price filter make price 0 to ignore this pair after calculation of quoteVolume
            candles.loc[(candles.close < filter_price), 'close'] = 0
            column_name = pair
            candles[column_name] = candles['volume'] * candles['close']

            if full_dataframe.empty:
                full_dataframe = candles[['date', column_name]].copy()
            else:
                full_dataframe = pd.merge(full_dataframe,
                                          candles[['date',
                                                   column_name]].copy(),
                                          on='date',
                                          how='left')
            # print("Loaded " + str(len(candles)) + f" rows of data for {pair} from {data_location}")
            # print(full_dataframe.tail(1))

    print(full_dataframe.head())

    full_dataframe['date'] = full_dataframe['date'].dt.tz_localize(None)

    return full_dataframe
Ejemplo n.º 30
0
def test_load_data_with_new_pair_1min(ticker_history_list, mocker, caplog,
                                      default_conf, testdatadir) -> None:
    """
    Test load_pair_history() with 1 min ticker
    """
    mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv',
                 return_value=ticker_history_list)
    exchange = get_patched_exchange(mocker, default_conf)
    file = testdatadir / 'MEME_BTC-1m.json'

    _backup_file(file)
    # do not download a new pair if refresh_pairs isn't set
    history.load_pair_history(datadir=testdatadir,
                              ticker_interval='1m',
                              pair='MEME/BTC')
    assert not file.is_file()
    assert log_has(
        'No history data for pair: "MEME/BTC", interval: 1m. '
        'Use `freqtrade download-data` to download the data', caplog)

    # download a new pair if refresh_pairs is set
    history.load_pair_history(datadir=testdatadir,
                              ticker_interval='1m',
                              refresh_pairs=True,
                              exchange=exchange,
                              pair='MEME/BTC')
    assert file.is_file()
    assert log_has_re(
        'Download history data for pair: "MEME/BTC", interval: 1m '
        'and store in .*', caplog)
    with pytest.raises(OperationalException,
                       match=r'Exchange needs to be initialized when.*'):
        history.load_pair_history(datadir=testdatadir,
                                  ticker_interval='1m',
                                  refresh_pairs=True,
                                  exchange=None,
                                  pair='MEME/BTC')
    _clean_test_file(file)