Merge pull request #7708 from freqtrade/improve_iteration
Improve iteration logic
This commit is contained in:
commit
ce3959a0c6
@ -150,14 +150,20 @@ class Worker:
|
|||||||
if timeframe:
|
if timeframe:
|
||||||
next_tf = timeframe_to_next_date(timeframe)
|
next_tf = timeframe_to_next_date(timeframe)
|
||||||
# Maximum throttling should be until new candle arrives
|
# Maximum throttling should be until new candle arrives
|
||||||
# Offset of 0.2s is added to ensure a new candle has been issued.
|
# Offset is added to ensure a new candle has been issued.
|
||||||
next_tf_with_offset = next_tf.timestamp() - time.time() + timeframe_offset
|
next_tft = next_tf.timestamp() - time.time()
|
||||||
|
next_tf_with_offset = next_tft + timeframe_offset
|
||||||
|
if next_tft < sleep_duration and sleep_duration < next_tf_with_offset:
|
||||||
|
# Avoid hitting a new loop between the new candle and the candle with offset
|
||||||
|
sleep_duration = next_tf_with_offset
|
||||||
sleep_duration = min(sleep_duration, next_tf_with_offset)
|
sleep_duration = min(sleep_duration, next_tf_with_offset)
|
||||||
sleep_duration = max(sleep_duration, 0.0)
|
sleep_duration = max(sleep_duration, 0.0)
|
||||||
# next_iter = datetime.now(timezone.utc) + timedelta(seconds=sleep_duration)
|
# next_iter = datetime.now(timezone.utc) + timedelta(seconds=sleep_duration)
|
||||||
|
|
||||||
logger.debug(f"Throttling with '{func.__name__}()': sleep for {sleep_duration:.2f} s, "
|
logger.debug(f"Throttling with '{func.__name__}()': sleep for {sleep_duration:.2f} s, "
|
||||||
f"last iteration took {time_passed:.2f} s.")
|
f"last iteration took {time_passed:.2f} s."
|
||||||
|
# f"next: {next_iter}"
|
||||||
|
)
|
||||||
self._sleep(sleep_duration)
|
self._sleep(sleep_duration)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@ -113,6 +113,16 @@ def test_throttle_sleep_time(mocker, default_conf, caplog) -> None:
|
|||||||
# 300 (5m) - 60 (1m - see set time above) - 5 (duration of throttled_func) = 235
|
# 300 (5m) - 60 (1m - see set time above) - 5 (duration of throttled_func) = 235
|
||||||
assert 235.2 < sleep_mock.call_args[0][0] < 235.6
|
assert 235.2 < sleep_mock.call_args[0][0] < 235.6
|
||||||
|
|
||||||
|
t.move_to("2022-09-01 05:04:51 +00:00")
|
||||||
|
sleep_mock.reset_mock()
|
||||||
|
# Offset of 5s, so we hit the sweet-spot between "candle" and "candle offset"
|
||||||
|
# Which should not get a throttle iteration to avoid late candle fetching
|
||||||
|
assert worker._throttle(throttled_func, throttle_secs=10, timeframe='5m',
|
||||||
|
timeframe_offset=5, x=1.2) == 42
|
||||||
|
assert sleep_mock.call_count == 1
|
||||||
|
# Time is slightly bigger than throttle secs due to the high timeframe offset.
|
||||||
|
assert 11.1 < sleep_mock.call_args[0][0] < 13.2
|
||||||
|
|
||||||
|
|
||||||
def test_throttle_with_assets(mocker, default_conf) -> None:
|
def test_throttle_with_assets(mocker, default_conf) -> None:
|
||||||
def throttled_func(nb_assets=-1):
|
def throttled_func(nb_assets=-1):
|
||||||
|
Loading…
Reference in New Issue
Block a user