diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index d389750dd..2673feed1 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -4,7 +4,7 @@ Freqtrade is the main module of this bot. It contains the class Freqtrade() import copy import logging import traceback -from datetime import datetime, time, timezone, timedelta +from datetime import datetime, time, timezone, timedelta, tzinfo from math import isclose from threading import Lock from typing import Any, Dict, List, Optional @@ -116,10 +116,29 @@ class FreqtradeBot(LoggingMixin): self.update_funding_fees() self.wallets.update() + local_timezone = datetime.now( + timezone.utc).astimezone().tzinfo + minutes = self.time_zone_minutes(local_timezone) for time_slot in range(0, 24): - t = str(time(time_slot)) + t = str(time(time_slot, minutes)) schedule.every().day.at(t).do(update) + def time_zone_minutes(self, local_timezone): + """ + Returns the minute offset of a timezone + :param local_timezone: The operating systems timezone + """ + local_time = datetime.now(local_timezone) + offset = local_time.utcoffset().total_seconds() + half_hour_tz = (offset * 2) % 2 != 0.0 + quart_hour_tz = (offset * 4) % 4 != 0.0 + if quart_hour_tz: + return 45 + elif half_hour_tz: + return 30 + else: + return 0 + def notify_status(self, msg: str) -> None: """ Public method for users of this class (worker, etc.) to send notifications diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 57ab363dd..9b83c8595 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -4,6 +4,7 @@ import logging import time from copy import deepcopy +# from datetime import tzinfo from math import isclose from unittest.mock import ANY, MagicMock, PropertyMock @@ -4302,3 +4303,28 @@ def test_update_funding_fees(mocker, default_conf, trading_mode, calls, time_mac schedule.run_pending() assert freqtrade.update_funding_fees.call_count == calls + + +@pytest.mark.parametrize('tz,minute_offset', [ + ('IST', 30), + ('ACST', 30), + ('ACWST', 45), + ('ACST', 30), + ('ACDT', 30), + ('CCT', 30), + ('CHAST', 45), + ('NST', 30), + ('IST', 30), + ('AFT', 30), + ('IRST', 30), + ('IRDT', 30), + ('MMT', 30), + ('NPT', 45), + ('MART', 30), +]) +def test_time_zone_minutes(mocker, default_conf, tz, minute_offset): + patch_RPCManager(mocker) + patch_exchange(mocker) + freqtrade = get_patched_freqtradebot(mocker, default_conf) + return freqtrade + # freqtrade.time_zone_minutes(tzinfo('IST'))