mirror of
https://github.com/freqtrade/freqtrade.git
synced 2024-11-13 03:33:55 +00:00
Fix remaining arrow testcases
This commit is contained in:
parent
3ec55885bd
commit
261822147c
|
@ -954,7 +954,7 @@ class IStrategy(ABC, HyperStrategyMixin):
|
||||||
|
|
||||||
latest_date = dataframe['date'].max()
|
latest_date = dataframe['date'].max()
|
||||||
latest = dataframe.loc[dataframe['date'] == latest_date].iloc[-1]
|
latest = dataframe.loc[dataframe['date'] == latest_date].iloc[-1]
|
||||||
# Explicitly convert to arrow object to ensure the below comparison does not fail
|
# Explicitly convert to datetime object to ensure the below comparison does not fail
|
||||||
latest_date = latest_date.to_pydatetime()
|
latest_date = latest_date.to_pydatetime()
|
||||||
|
|
||||||
# Check if dataframe is out of date
|
# Check if dataframe is out of date
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from unittest.mock import MagicMock, PropertyMock
|
from unittest.mock import MagicMock, PropertyMock
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
import arrow
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from freqtrade.commands import (start_backtesting_show, start_convert_data, start_convert_trades,
|
from freqtrade.commands import (start_backtesting_show, start_convert_data, start_convert_trades,
|
||||||
|
@ -25,6 +24,7 @@ from freqtrade.enums import RunMode
|
||||||
from freqtrade.exceptions import OperationalException
|
from freqtrade.exceptions import OperationalException
|
||||||
from freqtrade.persistence.models import init_db
|
from freqtrade.persistence.models import init_db
|
||||||
from freqtrade.persistence.pairlock_middleware import PairLocks
|
from freqtrade.persistence.pairlock_middleware import PairLocks
|
||||||
|
from freqtrade.util import dt_floor_day, dt_now, dt_utc
|
||||||
from tests.conftest import (CURRENT_TEST_STRATEGY, EXMS, create_mock_trades, get_args, log_has,
|
from tests.conftest import (CURRENT_TEST_STRATEGY, EXMS, create_mock_trades, get_args, log_has,
|
||||||
log_has_re, patch_exchange, patched_configuration_load_config_file)
|
log_has_re, patch_exchange, patched_configuration_load_config_file)
|
||||||
from tests.conftest_trades import MOCK_TRADE_COUNT
|
from tests.conftest_trades import MOCK_TRADE_COUNT
|
||||||
|
@ -689,7 +689,7 @@ def test_download_data_timerange(mocker, markets):
|
||||||
start_download_data(pargs)
|
start_download_data(pargs)
|
||||||
assert dl_mock.call_count == 1
|
assert dl_mock.call_count == 1
|
||||||
# 20days ago
|
# 20days ago
|
||||||
days_ago = arrow.get(arrow.now().shift(days=-20).date()).int_timestamp
|
days_ago = dt_floor_day(dt_now() - timedelta(days=20)).timestamp()
|
||||||
assert dl_mock.call_args_list[0][1]['timerange'].startts == days_ago
|
assert dl_mock.call_args_list[0][1]['timerange'].startts == days_ago
|
||||||
|
|
||||||
dl_mock.reset_mock()
|
dl_mock.reset_mock()
|
||||||
|
@ -704,8 +704,7 @@ def test_download_data_timerange(mocker, markets):
|
||||||
start_download_data(pargs)
|
start_download_data(pargs)
|
||||||
assert dl_mock.call_count == 1
|
assert dl_mock.call_count == 1
|
||||||
|
|
||||||
assert dl_mock.call_args_list[0][1]['timerange'].startts == arrow.Arrow(
|
assert dl_mock.call_args_list[0][1]['timerange'].startts == int(dt_utc(2020, 1, 1).timestamp())
|
||||||
2020, 1, 1).int_timestamp
|
|
||||||
|
|
||||||
|
|
||||||
def test_download_data_no_markets(mocker, caplog):
|
def test_download_data_no_markets(mocker, caplog):
|
||||||
|
|
|
@ -8,7 +8,6 @@ from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from unittest.mock import MagicMock, Mock, PropertyMock
|
from unittest.mock import MagicMock, Mock, PropertyMock
|
||||||
|
|
||||||
import arrow
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -1693,8 +1692,8 @@ def limit_buy_order_old():
|
||||||
'type': 'limit',
|
'type': 'limit',
|
||||||
'side': 'buy',
|
'side': 'buy',
|
||||||
'symbol': 'mocked',
|
'symbol': 'mocked',
|
||||||
'datetime': arrow.utcnow().shift(minutes=-601).isoformat(),
|
'datetime': (dt_now() - timedelta(minutes=601)).isoformat(),
|
||||||
'timestamp': arrow.utcnow().shift(minutes=-601).int_timestamp * 1000,
|
'timestamp': dt_ts(dt_now() - timedelta(minutes=601)),
|
||||||
'price': 0.00001099,
|
'price': 0.00001099,
|
||||||
'amount': 90.99181073,
|
'amount': 90.99181073,
|
||||||
'filled': 0.0,
|
'filled': 0.0,
|
||||||
|
@ -1710,8 +1709,8 @@ def limit_sell_order_old():
|
||||||
'type': 'limit',
|
'type': 'limit',
|
||||||
'side': 'sell',
|
'side': 'sell',
|
||||||
'symbol': 'ETH/BTC',
|
'symbol': 'ETH/BTC',
|
||||||
'timestamp': arrow.utcnow().shift(minutes=-601).int_timestamp * 1000,
|
'timestamp': dt_ts(dt_now() - timedelta(minutes=601)),
|
||||||
'datetime': arrow.utcnow().shift(minutes=-601).isoformat(),
|
'datetime': (dt_now() - timedelta(minutes=601)).isoformat(),
|
||||||
'price': 0.00001099,
|
'price': 0.00001099,
|
||||||
'amount': 90.99181073,
|
'amount': 90.99181073,
|
||||||
'filled': 0.0,
|
'filled': 0.0,
|
||||||
|
@ -1727,8 +1726,8 @@ def limit_buy_order_old_partial():
|
||||||
'type': 'limit',
|
'type': 'limit',
|
||||||
'side': 'buy',
|
'side': 'buy',
|
||||||
'symbol': 'ETH/BTC',
|
'symbol': 'ETH/BTC',
|
||||||
'timestamp': arrow.utcnow().shift(minutes=-601).int_timestamp * 1000,
|
'timestamp': dt_ts(dt_now() - timedelta(minutes=601)),
|
||||||
'datetime': arrow.utcnow().shift(minutes=-601).isoformat(),
|
'datetime': (dt_now() - timedelta(minutes=601)).isoformat(),
|
||||||
'price': 0.00001099,
|
'price': 0.00001099,
|
||||||
'amount': 90.99181073,
|
'amount': 90.99181073,
|
||||||
'filled': 23.0,
|
'filled': 23.0,
|
||||||
|
@ -1758,8 +1757,8 @@ def limit_buy_order_canceled_empty(request):
|
||||||
'info': {},
|
'info': {},
|
||||||
'id': 'AZNPFF-4AC4N-7MKTAT',
|
'id': 'AZNPFF-4AC4N-7MKTAT',
|
||||||
'clientOrderId': None,
|
'clientOrderId': None,
|
||||||
'timestamp': arrow.utcnow().shift(minutes=-601).int_timestamp * 1000,
|
'timestamp': dt_ts(dt_now() - timedelta(minutes=601)),
|
||||||
'datetime': arrow.utcnow().shift(minutes=-601).isoformat(),
|
'datetime': dt_now() - timedelta(minutes=601).isoformat(),
|
||||||
'lastTradeTimestamp': None,
|
'lastTradeTimestamp': None,
|
||||||
'status': 'canceled',
|
'status': 'canceled',
|
||||||
'symbol': 'LTC/USDT',
|
'symbol': 'LTC/USDT',
|
||||||
|
@ -1779,8 +1778,8 @@ def limit_buy_order_canceled_empty(request):
|
||||||
'info': {},
|
'info': {},
|
||||||
'id': '1234512345',
|
'id': '1234512345',
|
||||||
'clientOrderId': 'alb1234123',
|
'clientOrderId': 'alb1234123',
|
||||||
'timestamp': arrow.utcnow().shift(minutes=-601).int_timestamp * 1000,
|
'timestamp': dt_ts(dt_now() - timedelta(minutes=601)),
|
||||||
'datetime': arrow.utcnow().shift(minutes=-601).isoformat(),
|
'datetime': dt_now() - timedelta(minutes=601).isoformat(),
|
||||||
'lastTradeTimestamp': None,
|
'lastTradeTimestamp': None,
|
||||||
'symbol': 'LTC/USDT',
|
'symbol': 'LTC/USDT',
|
||||||
'type': 'limit',
|
'type': 'limit',
|
||||||
|
@ -1800,8 +1799,8 @@ def limit_buy_order_canceled_empty(request):
|
||||||
'info': {},
|
'info': {},
|
||||||
'id': '1234512345',
|
'id': '1234512345',
|
||||||
'clientOrderId': 'alb1234123',
|
'clientOrderId': 'alb1234123',
|
||||||
'timestamp': arrow.utcnow().shift(minutes=-601).int_timestamp * 1000,
|
'timestamp': dt_ts(dt_now() - timedelta(minutes=601)),
|
||||||
'datetime': arrow.utcnow().shift(minutes=-601).isoformat(),
|
'datetime': (dt_now() - timedelta(minutes=601)).isoformat(),
|
||||||
'lastTradeTimestamp': None,
|
'lastTradeTimestamp': None,
|
||||||
'symbol': 'LTC/USDT',
|
'symbol': 'LTC/USDT',
|
||||||
'type': 'limit',
|
'type': 'limit',
|
||||||
|
@ -2488,8 +2487,8 @@ def buy_order_fee():
|
||||||
'type': 'limit',
|
'type': 'limit',
|
||||||
'side': 'buy',
|
'side': 'buy',
|
||||||
'symbol': 'mocked',
|
'symbol': 'mocked',
|
||||||
'timestamp': arrow.utcnow().shift(minutes=-601).int_timestamp * 1000,
|
'timestamp': dt_ts(dt_now() - timedelta(minutes=601)),
|
||||||
'datetime': arrow.utcnow().shift(minutes=-601).isoformat(),
|
'datetime': (dt_now() - timedelta(minutes=601)).isoformat(),
|
||||||
'price': 0.245441,
|
'price': 0.245441,
|
||||||
'amount': 8.0,
|
'amount': 8.0,
|
||||||
'cost': 1.963528,
|
'cost': 1.963528,
|
||||||
|
|
|
@ -3,7 +3,6 @@ from pathlib import Path
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from arrow import Arrow
|
|
||||||
from pandas import DataFrame, DateOffset, Timestamp, to_datetime
|
from pandas import DataFrame, DateOffset, Timestamp, to_datetime
|
||||||
|
|
||||||
from freqtrade.configuration import TimeRange
|
from freqtrade.configuration import TimeRange
|
||||||
|
@ -19,6 +18,7 @@ from freqtrade.data.metrics import (calculate_cagr, calculate_calmar, calculate_
|
||||||
calculate_underwater, combine_dataframes_with_mean,
|
calculate_underwater, combine_dataframes_with_mean,
|
||||||
create_cum_profit)
|
create_cum_profit)
|
||||||
from freqtrade.exceptions import OperationalException
|
from freqtrade.exceptions import OperationalException
|
||||||
|
from freqtrade.util import dt_utc
|
||||||
from tests.conftest import CURRENT_TEST_STRATEGY, create_mock_trades
|
from tests.conftest import CURRENT_TEST_STRATEGY, create_mock_trades
|
||||||
from tests.conftest_trades import MOCK_TRADE_COUNT
|
from tests.conftest_trades import MOCK_TRADE_COUNT
|
||||||
|
|
||||||
|
@ -421,7 +421,7 @@ def test_calculate_max_drawdown2():
|
||||||
-0.025782, 0.010400, 0.012374, 0.012467, 0.114741, 0.010303, 0.010088,
|
-0.025782, 0.010400, 0.012374, 0.012467, 0.114741, 0.010303, 0.010088,
|
||||||
-0.033961, 0.010680, 0.010886, -0.029274, 0.011178, 0.010693, 0.010711]
|
-0.033961, 0.010680, 0.010886, -0.029274, 0.011178, 0.010693, 0.010711]
|
||||||
|
|
||||||
dates = [Arrow(2020, 1, 1).shift(days=i) for i in range(len(values))]
|
dates = [dt_utc(2020, 1, 1) + timedelta(days=i) for i in range(len(values))]
|
||||||
df = DataFrame(zip(values, dates), columns=['profit', 'open_date'])
|
df = DataFrame(zip(values, dates), columns=['profit', 'open_date'])
|
||||||
# sort by profit and reset index
|
# sort by profit and reset index
|
||||||
df = df.sort_values('profit').reset_index(drop=True)
|
df = df.sort_values('profit').reset_index(drop=True)
|
||||||
|
|
|
@ -6,7 +6,6 @@ from pathlib import Path
|
||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
from unittest.mock import MagicMock, PropertyMock
|
from unittest.mock import MagicMock, PropertyMock
|
||||||
|
|
||||||
import arrow
|
|
||||||
import pytest
|
import pytest
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
from pandas.testing import assert_frame_equal
|
from pandas.testing import assert_frame_equal
|
||||||
|
@ -26,6 +25,7 @@ from freqtrade.enums import CandleType
|
||||||
from freqtrade.exchange import timeframe_to_minutes
|
from freqtrade.exchange import timeframe_to_minutes
|
||||||
from freqtrade.misc import file_dump_json
|
from freqtrade.misc import file_dump_json
|
||||||
from freqtrade.resolvers import StrategyResolver
|
from freqtrade.resolvers import StrategyResolver
|
||||||
|
from freqtrade.util import dt_utc
|
||||||
from tests.conftest import (CURRENT_TEST_STRATEGY, EXMS, get_patched_exchange, log_has, log_has_re,
|
from tests.conftest import (CURRENT_TEST_STRATEGY, EXMS, get_patched_exchange, log_has, log_has_re,
|
||||||
patch_exchange)
|
patch_exchange)
|
||||||
|
|
||||||
|
@ -198,7 +198,6 @@ def test_load_cached_data_for_updating(mocker, testdatadir) -> None:
|
||||||
fill_missing=False, drop_incomplete=False)
|
fill_missing=False, drop_incomplete=False)
|
||||||
# now = last cached item + 1 hour
|
# now = last cached item + 1 hour
|
||||||
now_ts = test_data[-1][0] / 1000 + 60 * 60
|
now_ts = test_data[-1][0] / 1000 + 60 * 60
|
||||||
mocker.patch('arrow.utcnow', return_value=arrow.get(now_ts))
|
|
||||||
|
|
||||||
# timeframe starts earlier than the cached data
|
# timeframe starts earlier than the cached data
|
||||||
# should fully update data
|
# should fully update data
|
||||||
|
@ -353,10 +352,10 @@ def test_download_backtesting_data_exception(mocker, caplog, default_conf, tmpdi
|
||||||
|
|
||||||
def test_load_partial_missing(testdatadir, caplog) -> None:
|
def test_load_partial_missing(testdatadir, caplog) -> None:
|
||||||
# Make sure we start fresh - test missing data at start
|
# Make sure we start fresh - test missing data at start
|
||||||
start = arrow.get('2018-01-01T00:00:00')
|
start = dt_utc(2018, 1, 1)
|
||||||
end = arrow.get('2018-01-11T00:00:00')
|
end = dt_utc(2018, 1, 11)
|
||||||
data = load_data(testdatadir, '5m', ['UNITTEST/BTC'], startup_candles=20,
|
data = load_data(testdatadir, '5m', ['UNITTEST/BTC'], startup_candles=20,
|
||||||
timerange=TimeRange('date', 'date', start.int_timestamp, end.int_timestamp))
|
timerange=TimeRange('date', 'date', start.timestamp(), end.timestamp()))
|
||||||
assert log_has(
|
assert log_has(
|
||||||
'Using indicator startup period: 20 ...', caplog
|
'Using indicator startup period: 20 ...', caplog
|
||||||
)
|
)
|
||||||
|
@ -369,16 +368,16 @@ def test_load_partial_missing(testdatadir, caplog) -> None:
|
||||||
caplog)
|
caplog)
|
||||||
# Make sure we start fresh - test missing data at end
|
# Make sure we start fresh - test missing data at end
|
||||||
caplog.clear()
|
caplog.clear()
|
||||||
start = arrow.get('2018-01-10T00:00:00')
|
start = dt_utc(2018, 1, 10)
|
||||||
end = arrow.get('2018-02-20T00:00:00')
|
end = dt_utc(2018, 2, 20)
|
||||||
data = load_data(datadir=testdatadir, timeframe='5m', pairs=['UNITTEST/BTC'],
|
data = load_data(datadir=testdatadir, timeframe='5m', pairs=['UNITTEST/BTC'],
|
||||||
timerange=TimeRange('date', 'date', start.int_timestamp, end.int_timestamp))
|
timerange=TimeRange('date', 'date', start.timestamp(), end.timestamp()))
|
||||||
# timedifference in 5 minutes
|
# timedifference in 5 minutes
|
||||||
td = ((end - start).total_seconds() // 60 // 5) + 1
|
td = ((end - start).total_seconds() // 60 // 5) + 1
|
||||||
assert td != len(data['UNITTEST/BTC'])
|
assert td != len(data['UNITTEST/BTC'])
|
||||||
|
|
||||||
# Shift endtime with +5
|
# Shift endtime with +5
|
||||||
end_real = arrow.get(data['UNITTEST/BTC'].iloc[-1, 0])
|
end_real = data['UNITTEST/BTC'].iloc[-1, 0].to_pydatetime()
|
||||||
assert log_has(f'UNITTEST/BTC, spot, 5m, '
|
assert log_has(f'UNITTEST/BTC, spot, 5m, '
|
||||||
f'data ends at {end_real.strftime(DATETIME_PRINT_FORMAT)}',
|
f'data ends at {end_real.strftime(DATETIME_PRINT_FORMAT)}',
|
||||||
caplog)
|
caplog)
|
||||||
|
|
|
@ -5,7 +5,6 @@ import logging
|
||||||
import math
|
import math
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import arrow
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pytest
|
import pytest
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
|
@ -14,7 +13,7 @@ from freqtrade.data.converter import ohlcv_to_dataframe
|
||||||
from freqtrade.edge import Edge, PairInfo
|
from freqtrade.edge import Edge, PairInfo
|
||||||
from freqtrade.enums import ExitType
|
from freqtrade.enums import ExitType
|
||||||
from freqtrade.exceptions import OperationalException
|
from freqtrade.exceptions import OperationalException
|
||||||
from freqtrade.util.datetime_helpers import dt_ts
|
from freqtrade.util.datetime_helpers import dt_ts, dt_utc
|
||||||
from tests.conftest import EXMS, get_patched_freqtradebot, log_has
|
from tests.conftest import EXMS, get_patched_freqtradebot, log_has
|
||||||
from tests.optimize import (BTContainer, BTrade, _build_backtest_dataframe,
|
from tests.optimize import (BTContainer, BTrade, _build_backtest_dataframe,
|
||||||
_get_frame_time_from_offset)
|
_get_frame_time_from_offset)
|
||||||
|
@ -28,7 +27,7 @@ from tests.optimize import (BTContainer, BTrade, _build_backtest_dataframe,
|
||||||
# 5) Stoploss and sell are hit. should sell on stoploss
|
# 5) Stoploss and sell are hit. should sell on stoploss
|
||||||
####################################################################
|
####################################################################
|
||||||
|
|
||||||
tests_start_time = arrow.get(2018, 10, 3)
|
tests_start_time = dt_utc(2018, 10, 3)
|
||||||
timeframe_in_minute = 60
|
timeframe_in_minute = 60
|
||||||
|
|
||||||
# End helper functions
|
# End helper functions
|
||||||
|
|
|
@ -5,7 +5,6 @@ from datetime import datetime, timedelta, timezone
|
||||||
from random import randint
|
from random import randint
|
||||||
from unittest.mock import MagicMock, Mock, PropertyMock, patch
|
from unittest.mock import MagicMock, Mock, PropertyMock, patch
|
||||||
|
|
||||||
import arrow
|
|
||||||
import ccxt
|
import ccxt
|
||||||
import pytest
|
import pytest
|
||||||
from ccxt import DECIMAL_PLACES, ROUND, ROUND_UP, TICK_SIZE, TRUNCATE
|
from ccxt import DECIMAL_PLACES, ROUND, ROUND_UP, TICK_SIZE, TRUNCATE
|
||||||
|
@ -2079,7 +2078,7 @@ def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_
|
||||||
exchange = get_patched_exchange(mocker, default_conf, id=exchange_name)
|
exchange = get_patched_exchange(mocker, default_conf, id=exchange_name)
|
||||||
ohlcv = [
|
ohlcv = [
|
||||||
[
|
[
|
||||||
arrow.utcnow().int_timestamp * 1000, # unix timestamp ms
|
dt_ts(), # unix timestamp ms
|
||||||
1, # open
|
1, # open
|
||||||
2, # high
|
2, # high
|
||||||
3, # low
|
3, # low
|
||||||
|
@ -2099,7 +2098,7 @@ def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_
|
||||||
ret = exchange.get_historic_ohlcv(
|
ret = exchange.get_historic_ohlcv(
|
||||||
pair,
|
pair,
|
||||||
"5m",
|
"5m",
|
||||||
int((arrow.utcnow().int_timestamp - since) * 1000),
|
dt_ts(dt_now() - timedelta(seconds=since)),
|
||||||
candle_type=candle_type
|
candle_type=candle_type
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -2117,7 +2116,7 @@ def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_
|
||||||
ret = exchange.get_historic_ohlcv(
|
ret = exchange.get_historic_ohlcv(
|
||||||
pair,
|
pair,
|
||||||
"5m",
|
"5m",
|
||||||
int((arrow.utcnow().int_timestamp - since) * 1000),
|
dt_ts(dt_now() - timedelta(seconds=since)),
|
||||||
candle_type=candle_type
|
candle_type=candle_type
|
||||||
)
|
)
|
||||||
assert log_has_re(r"Async code raised an exception: .*", caplog)
|
assert log_has_re(r"Async code raised an exception: .*", caplog)
|
||||||
|
@ -2169,7 +2168,7 @@ async def test__async_get_historic_ohlcv(default_conf, mocker, caplog, exchange_
|
||||||
def test_refresh_latest_ohlcv(mocker, default_conf, caplog, candle_type) -> None:
|
def test_refresh_latest_ohlcv(mocker, default_conf, caplog, candle_type) -> None:
|
||||||
ohlcv = [
|
ohlcv = [
|
||||||
[
|
[
|
||||||
(arrow.utcnow().shift(minutes=-5).int_timestamp) * 1000, # unix timestamp ms
|
dt_ts(dt_now() - timedelta(minutes=5)), # unix timestamp ms
|
||||||
1, # open
|
1, # open
|
||||||
2, # high
|
2, # high
|
||||||
3, # low
|
3, # low
|
||||||
|
@ -2177,7 +2176,7 @@ def test_refresh_latest_ohlcv(mocker, default_conf, caplog, candle_type) -> None
|
||||||
5, # volume (in quote currency)
|
5, # volume (in quote currency)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
arrow.utcnow().int_timestamp * 1000, # unix timestamp ms
|
dt_ts(), # unix timestamp ms
|
||||||
3, # open
|
3, # open
|
||||||
1, # high
|
1, # high
|
||||||
4, # low
|
4, # low
|
||||||
|
@ -2367,7 +2366,7 @@ def test_refresh_latest_ohlcv_cache(mocker, default_conf, candle_type, time_mach
|
||||||
async def test__async_get_candle_history(default_conf, mocker, caplog, exchange_name):
|
async def test__async_get_candle_history(default_conf, mocker, caplog, exchange_name):
|
||||||
ohlcv = [
|
ohlcv = [
|
||||||
[
|
[
|
||||||
arrow.utcnow().int_timestamp * 1000, # unix timestamp ms
|
dt_ts(), # unix timestamp ms
|
||||||
1, # open
|
1, # open
|
||||||
2, # high
|
2, # high
|
||||||
3, # low
|
3, # low
|
||||||
|
@ -2404,7 +2403,7 @@ async def test__async_get_candle_history(default_conf, mocker, caplog, exchange_
|
||||||
api_mock.fetch_ohlcv = MagicMock(side_effect=ccxt.BaseError("Unknown error"))
|
api_mock.fetch_ohlcv = MagicMock(side_effect=ccxt.BaseError("Unknown error"))
|
||||||
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
||||||
await exchange._async_get_candle_history(pair, "5m", CandleType.SPOT,
|
await exchange._async_get_candle_history(pair, "5m", CandleType.SPOT,
|
||||||
(arrow.utcnow().int_timestamp - 2000) * 1000)
|
dt_ts(dt_now() - timedelta(seconds=2000)))
|
||||||
|
|
||||||
exchange.close()
|
exchange.close()
|
||||||
|
|
||||||
|
@ -2413,7 +2412,7 @@ async def test__async_get_candle_history(default_conf, mocker, caplog, exchange_
|
||||||
api_mock.fetch_ohlcv = MagicMock(side_effect=ccxt.NotSupported("Not supported"))
|
api_mock.fetch_ohlcv = MagicMock(side_effect=ccxt.NotSupported("Not supported"))
|
||||||
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
||||||
await exchange._async_get_candle_history(pair, "5m", CandleType.SPOT,
|
await exchange._async_get_candle_history(pair, "5m", CandleType.SPOT,
|
||||||
(arrow.utcnow().int_timestamp - 2000) * 1000)
|
dt_ts(dt_now() - timedelta(seconds=2000)))
|
||||||
exchange.close()
|
exchange.close()
|
||||||
|
|
||||||
|
|
||||||
|
@ -2436,7 +2435,7 @@ async def test__async_kucoin_get_candle_history(default_conf, mocker, caplog):
|
||||||
with pytest.raises(DDosProtection, match=r'429 Too Many Requests'):
|
with pytest.raises(DDosProtection, match=r'429 Too Many Requests'):
|
||||||
await exchange._async_get_candle_history(
|
await exchange._async_get_candle_history(
|
||||||
"ETH/BTC", "5m", CandleType.SPOT,
|
"ETH/BTC", "5m", CandleType.SPOT,
|
||||||
since_ms=(arrow.utcnow().int_timestamp - 2000) * 1000, count=3)
|
since_ms=dt_ts(dt_now() - timedelta(seconds=2000)), count=3)
|
||||||
assert num_log_has_re(msg, caplog) == 3
|
assert num_log_has_re(msg, caplog) == 3
|
||||||
|
|
||||||
caplog.clear()
|
caplog.clear()
|
||||||
|
@ -2453,7 +2452,7 @@ async def test__async_kucoin_get_candle_history(default_conf, mocker, caplog):
|
||||||
with pytest.raises(DDosProtection, match=r'429 Too Many Requests'):
|
with pytest.raises(DDosProtection, match=r'429 Too Many Requests'):
|
||||||
await exchange._async_get_candle_history(
|
await exchange._async_get_candle_history(
|
||||||
"ETH/BTC", "5m", CandleType.SPOT,
|
"ETH/BTC", "5m", CandleType.SPOT,
|
||||||
(arrow.utcnow().int_timestamp - 2000) * 1000, count=3)
|
dt_ts(dt_now() - timedelta(seconds=2000)), count=3)
|
||||||
# Expect the "returned exception" message 12 times (4 retries * 3 (loop))
|
# Expect the "returned exception" message 12 times (4 retries * 3 (loop))
|
||||||
assert num_log_has_re(msg, caplog) == 12
|
assert num_log_has_re(msg, caplog) == 12
|
||||||
assert num_log_has_re(msg2, caplog) == 9
|
assert num_log_has_re(msg2, caplog) == 9
|
||||||
|
@ -2911,14 +2910,14 @@ async def test__async_fetch_trades(default_conf, mocker, caplog, exchange_name,
|
||||||
with pytest.raises(OperationalException, match=r'Could not fetch trade data*'):
|
with pytest.raises(OperationalException, match=r'Could not fetch trade data*'):
|
||||||
api_mock.fetch_trades = MagicMock(side_effect=ccxt.BaseError("Unknown error"))
|
api_mock.fetch_trades = MagicMock(side_effect=ccxt.BaseError("Unknown error"))
|
||||||
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
||||||
await exchange._async_fetch_trades(pair, since=(arrow.utcnow().int_timestamp - 2000) * 1000)
|
await exchange._async_fetch_trades(pair, since=dt_ts(dt_now() - timedelta(seconds=2000)))
|
||||||
exchange.close()
|
exchange.close()
|
||||||
|
|
||||||
with pytest.raises(OperationalException, match=r'Exchange.* does not support fetching '
|
with pytest.raises(OperationalException, match=r'Exchange.* does not support fetching '
|
||||||
r'historical trade data\..*'):
|
r'historical trade data\..*'):
|
||||||
api_mock.fetch_trades = MagicMock(side_effect=ccxt.NotSupported("Not supported"))
|
api_mock.fetch_trades = MagicMock(side_effect=ccxt.NotSupported("Not supported"))
|
||||||
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
||||||
await exchange._async_fetch_trades(pair, since=(arrow.utcnow().int_timestamp - 2000) * 1000)
|
await exchange._async_fetch_trades(pair, since=dt_ts(dt_now() - timedelta(seconds=2000)))
|
||||||
exchange.close()
|
exchange.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ from unittest.mock import MagicMock, PropertyMock
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import pytest
|
import pytest
|
||||||
from arrow import Arrow
|
|
||||||
|
|
||||||
from freqtrade import constants
|
from freqtrade import constants
|
||||||
from freqtrade.commands.optimize_commands import setup_optimize_configuration, start_backtesting
|
from freqtrade.commands.optimize_commands import setup_optimize_configuration, start_backtesting
|
||||||
|
@ -347,7 +346,7 @@ def test_backtest_abort(default_conf, mocker, testdatadir) -> None:
|
||||||
|
|
||||||
def test_backtesting_start(default_conf, mocker, caplog) -> None:
|
def test_backtesting_start(default_conf, mocker, caplog) -> None:
|
||||||
def get_timerange(input1):
|
def get_timerange(input1):
|
||||||
return Arrow(2017, 11, 14, 21, 17), Arrow(2017, 11, 14, 22, 59)
|
return dt_utc(2017, 11, 14, 21, 17), dt_utc(2017, 11, 14, 22, 59)
|
||||||
|
|
||||||
mocker.patch('freqtrade.data.history.get_timerange', get_timerange)
|
mocker.patch('freqtrade.data.history.get_timerange', get_timerange)
|
||||||
patch_exchange(mocker)
|
patch_exchange(mocker)
|
||||||
|
@ -386,7 +385,7 @@ def test_backtesting_start(default_conf, mocker, caplog) -> None:
|
||||||
|
|
||||||
def test_backtesting_start_no_data(default_conf, mocker, caplog, testdatadir) -> None:
|
def test_backtesting_start_no_data(default_conf, mocker, caplog, testdatadir) -> None:
|
||||||
def get_timerange(input1):
|
def get_timerange(input1):
|
||||||
return Arrow(2017, 11, 14, 21, 17), Arrow(2017, 11, 14, 22, 59)
|
return dt_utc(2017, 11, 14, 21, 17), dt_utc(2017, 11, 14, 22, 59)
|
||||||
|
|
||||||
mocker.patch('freqtrade.data.history.history_utils.load_pair_history',
|
mocker.patch('freqtrade.data.history.history_utils.load_pair_history',
|
||||||
MagicMock(return_value=pd.DataFrame()))
|
MagicMock(return_value=pd.DataFrame()))
|
||||||
|
|
|
@ -6,7 +6,6 @@ from unittest.mock import ANY, MagicMock, PropertyMock
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import pytest
|
import pytest
|
||||||
from arrow import Arrow
|
|
||||||
from filelock import Timeout
|
from filelock import Timeout
|
||||||
from skopt.space import Integer
|
from skopt.space import Integer
|
||||||
|
|
||||||
|
@ -380,8 +379,8 @@ def test_hyperopt_format_results(hyperopt):
|
||||||
'backtest_end_time': 1619718665,
|
'backtest_end_time': 1619718665,
|
||||||
}
|
}
|
||||||
results_metrics = generate_strategy_stats(['XRP/BTC'], '', bt_result,
|
results_metrics = generate_strategy_stats(['XRP/BTC'], '', bt_result,
|
||||||
Arrow(2017, 11, 14, 19, 32, 00),
|
dt_utc(2017, 11, 14, 19, 32, 00),
|
||||||
Arrow(2017, 12, 14, 19, 32, 00), market_change=0)
|
dt_utc(2017, 12, 14, 19, 32, 00), market_change=0)
|
||||||
|
|
||||||
results_explanation = HyperoptTools.format_results_explanation_string(results_metrics, 'BTC')
|
results_explanation = HyperoptTools.format_results_explanation_string(results_metrics, 'BTC')
|
||||||
total_profit = results_metrics['profit_total_abs']
|
total_profit = results_metrics['profit_total_abs']
|
||||||
|
@ -454,7 +453,7 @@ def test_generate_optimizer(mocker, hyperopt_conf) -> None:
|
||||||
|
|
||||||
mocker.patch('freqtrade.optimize.hyperopt.Backtesting.backtest', return_value=backtest_result)
|
mocker.patch('freqtrade.optimize.hyperopt.Backtesting.backtest', return_value=backtest_result)
|
||||||
mocker.patch('freqtrade.optimize.hyperopt.get_timerange',
|
mocker.patch('freqtrade.optimize.hyperopt.get_timerange',
|
||||||
return_value=(Arrow(2017, 12, 10), Arrow(2017, 12, 13)))
|
return_value=(dt_utc(2017, 12, 10), dt_utc(2017, 12, 13)))
|
||||||
patch_exchange(mocker)
|
patch_exchange(mocker)
|
||||||
mocker.patch.object(Path, 'open')
|
mocker.patch.object(Path, 'open')
|
||||||
mocker.patch('freqtrade.configuration.config_validation.validate_config_schema')
|
mocker.patch('freqtrade.configuration.config_validation.validate_config_schema')
|
||||||
|
@ -514,8 +513,8 @@ def test_generate_optimizer(mocker, hyperopt_conf) -> None:
|
||||||
}
|
}
|
||||||
|
|
||||||
hyperopt = Hyperopt(hyperopt_conf)
|
hyperopt = Hyperopt(hyperopt_conf)
|
||||||
hyperopt.min_date = Arrow(2017, 12, 10)
|
hyperopt.min_date = dt_utc(2017, 12, 10)
|
||||||
hyperopt.max_date = Arrow(2017, 12, 13)
|
hyperopt.max_date = dt_utc(2017, 12, 13)
|
||||||
hyperopt.init_spaces()
|
hyperopt.init_spaces()
|
||||||
generate_optimizer_value = hyperopt.generate_optimizer(list(optimizer_param.values()))
|
generate_optimizer_value = hyperopt.generate_optimizer(list(optimizer_param.values()))
|
||||||
assert generate_optimizer_value == response_expected
|
assert generate_optimizer_value == response_expected
|
||||||
|
|
|
@ -12,7 +12,6 @@ from random import choice, randint
|
||||||
from string import ascii_uppercase
|
from string import ascii_uppercase
|
||||||
from unittest.mock import ANY, AsyncMock, MagicMock
|
from unittest.mock import ANY, AsyncMock, MagicMock
|
||||||
|
|
||||||
import arrow
|
|
||||||
import pytest
|
import pytest
|
||||||
import time_machine
|
import time_machine
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
|
@ -260,7 +259,7 @@ async def test_telegram_status(default_conf, update, mocker) -> None:
|
||||||
'pair': 'ETH/BTC',
|
'pair': 'ETH/BTC',
|
||||||
'base_currency': 'ETH',
|
'base_currency': 'ETH',
|
||||||
'quote_currency': 'BTC',
|
'quote_currency': 'BTC',
|
||||||
'open_date': arrow.utcnow(),
|
'open_date': dt_now(),
|
||||||
'close_date': None,
|
'close_date': None,
|
||||||
'open_rate': 1.099e-05,
|
'open_rate': 1.099e-05,
|
||||||
'close_rate': None,
|
'close_rate': None,
|
||||||
|
@ -2073,7 +2072,7 @@ def test_send_msg_sell_notification(default_conf, mocker) -> None:
|
||||||
'enter_tag': 'buy_signal1',
|
'enter_tag': 'buy_signal1',
|
||||||
'exit_reason': ExitType.STOP_LOSS.value,
|
'exit_reason': ExitType.STOP_LOSS.value,
|
||||||
'open_date': dt_now() - timedelta(hours=1),
|
'open_date': dt_now() - timedelta(hours=1),
|
||||||
'close_date': arrow.utcnow(),
|
'close_date': dt_now(),
|
||||||
})
|
})
|
||||||
assert msg_mock.call_args[0][0] == (
|
assert msg_mock.call_args[0][0] == (
|
||||||
'\N{WARNING SIGN} *Binance (dry):* Exiting KEY/ETH (#1)\n'
|
'\N{WARNING SIGN} *Binance (dry):* Exiting KEY/ETH (#1)\n'
|
||||||
|
@ -2109,7 +2108,7 @@ def test_send_msg_sell_notification(default_conf, mocker) -> None:
|
||||||
'enter_tag': 'buy_signal1',
|
'enter_tag': 'buy_signal1',
|
||||||
'exit_reason': ExitType.STOP_LOSS.value,
|
'exit_reason': ExitType.STOP_LOSS.value,
|
||||||
'open_date': dt_now() - timedelta(days=1, hours=2, minutes=30),
|
'open_date': dt_now() - timedelta(days=1, hours=2, minutes=30),
|
||||||
'close_date': arrow.utcnow(),
|
'close_date': dt_now(),
|
||||||
'stake_amount': 0.01,
|
'stake_amount': 0.01,
|
||||||
'sub_trade': True,
|
'sub_trade': True,
|
||||||
})
|
})
|
||||||
|
@ -2146,7 +2145,7 @@ def test_send_msg_sell_notification(default_conf, mocker) -> None:
|
||||||
'enter_tag': 'buy_signal1',
|
'enter_tag': 'buy_signal1',
|
||||||
'exit_reason': ExitType.STOP_LOSS.value,
|
'exit_reason': ExitType.STOP_LOSS.value,
|
||||||
'open_date': dt_now() - timedelta(days=1, hours=2, minutes=30),
|
'open_date': dt_now() - timedelta(days=1, hours=2, minutes=30),
|
||||||
'close_date': arrow.utcnow(),
|
'close_date': dt_now(),
|
||||||
})
|
})
|
||||||
assert msg_mock.call_args[0][0] == (
|
assert msg_mock.call_args[0][0] == (
|
||||||
'\N{WARNING SIGN} *Binance (dry):* Exiting KEY/ETH (#1)\n'
|
'\N{WARNING SIGN} *Binance (dry):* Exiting KEY/ETH (#1)\n'
|
||||||
|
@ -2228,7 +2227,7 @@ def test_send_msg_sell_fill_notification(default_conf, mocker, direction,
|
||||||
'enter_tag': enter_signal,
|
'enter_tag': enter_signal,
|
||||||
'exit_reason': ExitType.STOP_LOSS.value,
|
'exit_reason': ExitType.STOP_LOSS.value,
|
||||||
'open_date': dt_now() - timedelta(days=1, hours=2, minutes=30),
|
'open_date': dt_now() - timedelta(days=1, hours=2, minutes=30),
|
||||||
'close_date': arrow.utcnow(),
|
'close_date': dt_now(),
|
||||||
})
|
})
|
||||||
|
|
||||||
leverage_text = f'*Leverage:* `{leverage}`\n' if leverage and leverage != 1.0 else ''
|
leverage_text = f'*Leverage:* `{leverage}`\n' if leverage and leverage != 1.0 else ''
|
||||||
|
@ -2365,7 +2364,7 @@ def test_send_msg_sell_notification_no_fiat(
|
||||||
'enter_tag': enter_signal,
|
'enter_tag': enter_signal,
|
||||||
'exit_reason': ExitType.STOP_LOSS.value,
|
'exit_reason': ExitType.STOP_LOSS.value,
|
||||||
'open_date': dt_now() - timedelta(hours=2, minutes=35, seconds=3),
|
'open_date': dt_now() - timedelta(hours=2, minutes=35, seconds=3),
|
||||||
'close_date': arrow.utcnow(),
|
'close_date': dt_now(),
|
||||||
})
|
})
|
||||||
|
|
||||||
leverage_text = f'*Leverage:* `{leverage}`\n' if leverage and leverage != 1.0 else ''
|
leverage_text = f'*Leverage:* `{leverage}`\n' if leverage and leverage != 1.0 else ''
|
||||||
|
|
|
@ -4,7 +4,6 @@ from datetime import datetime, timedelta, timezone
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import arrow
|
|
||||||
import pytest
|
import pytest
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
# pragma pylint: disable=missing-docstring, C0103
|
# pragma pylint: disable=missing-docstring, C0103
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
import arrow
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from freqtrade.configuration import TimeRange
|
from freqtrade.configuration import TimeRange
|
||||||
|
|
Loading…
Reference in New Issue
Block a user