diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 3d2bf07c7..abb03b86d 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -793,6 +793,20 @@ def timeframe_to_msecs(ticker_interval: str) -> int: return ccxt.Exchange.parse_timeframe(ticker_interval) * 1000 +def timeframe_to_prev_date(timeframe: str, date: datetime = None): + """ + Use Timeframe and determine last possible candle. + """ + if not date: + date = datetime.utcnow() + timeframe_secs = timeframe_to_seconds(timeframe) + # Get offset based on timerame_secs + offset = date.timestamp() % timeframe_secs + # Subtract seconds passed since last offset + new_timestamp = date.timestamp() - offset + return datetime.fromtimestamp(new_timestamp, tz=timezone.utc) + + def timeframe_to_next_date(timeframe: str, date: datetime = None): """ Use Timeframe and determine next candle. @@ -800,6 +814,8 @@ def timeframe_to_next_date(timeframe: str, date: datetime = None): if not date: date = datetime.utcnow() timeframe_secs = timeframe_to_seconds(timeframe) + # Get offset to prev timeframe offset = date.timestamp() % timeframe_secs + # Add remaining seconds to next timeframe new_timestamp = date.timestamp() + (timeframe_secs - offset) return datetime.fromtimestamp(new_timestamp, tz=timezone.utc) diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index 23384aebe..e342af604 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -14,10 +14,10 @@ from pandas import DataFrame from freqtrade import (DependencyException, InvalidOrderException, OperationalException, TemporaryError) from freqtrade.exchange import Binance, Exchange, Kraken -from freqtrade.exchange.exchange import (API_RETRY_COUNT, - timeframe_to_next_date, - timeframe_to_minutes, +from freqtrade.exchange.exchange import (API_RETRY_COUNT, timeframe_to_minutes, timeframe_to_msecs, + timeframe_to_next_date, + timeframe_to_prev_date, timeframe_to_seconds) from freqtrade.resolvers.exchange_resolver import ExchangeResolver from freqtrade.tests.conftest import get_patched_exchange, log_has, log_has_re @@ -1567,6 +1567,30 @@ def test_timeframe_to_msecs(): assert timeframe_to_msecs("1d") == 86400000 +def test_timeframe_to_prev_date(): + # 2019-08-12 13:22:08 + date = datetime.fromtimestamp(1565616128, tz=timezone.utc) + + # 5m -> 2019-08-12 13:20:00 + assert timeframe_to_prev_date("5m", date) == datetime( + 2019, 8, 12, 13, 20, 0, tzinfo=timezone.utc) + # 10m -> 2019-08-12 13:20:00 + assert timeframe_to_prev_date("10m", date) == datetime( + 2019, 8, 12, 13, 20, 0, tzinfo=timezone.utc) + # 1h -> 2019-08-12 13:00:00 + assert timeframe_to_prev_date("1h", date) == datetime( + 2019, 8, 12, 13, 00, 0, tzinfo=timezone.utc) + # 2h -> 2019-08-12 12:00:00 + assert timeframe_to_prev_date("2h", date) == datetime( + 2019, 8, 12, 12, 00, 0, tzinfo=timezone.utc) + # 4h -> 2019-08-12 12:00:00 + assert timeframe_to_prev_date("4h", date) == datetime( + 2019, 8, 12, 12, 00, 0, tzinfo=timezone.utc) + # 1d -> 2019-08-12 00:00:00 + assert timeframe_to_prev_date("1d", date) == datetime( + 2019, 8, 12, 0, 0, 0, tzinfo=timezone.utc) + + def test_timeframe_to_next_date(): # 2019-08-12 13:22:08 date = datetime.fromtimestamp(1565616128, tz=timezone.utc)