Skip to content

Commit ff59030

Browse files
Fix: backtest is aborted in the middle with half of report (#539)
* feat: compare backtest result when run it in cloud * feat: use delay between is_backtest_done validation * refactor: more performance in is_backtest_done * refactor: more readable and reset counter in is_backtest_done * Update cloud_runner.py --------- Co-authored-by: Martin-Molinero <[email protected]>
1 parent 17556ea commit ff59030

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

lean/components/cloud/cloud_runner.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,44 @@ def __init__(self, logger: Logger, api_client: APIClient, task_manager: TaskMana
3636
self._logger = logger
3737
self._api_client = api_client
3838
self._task_manager = task_manager
39+
self._mismatch_counter = 0
40+
41+
def is_backtest_done(self, backtest_data: QCBacktest, delay: float = 10.0):
42+
"""Checks if the backtest is complete.
43+
44+
:param backtest_data: The current state of the backtest.
45+
:param delay: The delay in seconds between consecutive checks. Default is 60 seconds (1 minute).
46+
:return: True if the backtest is complete and the state has changed, False otherwise.
47+
"""
48+
try:
49+
if backtest_data.error or backtest_data.stacktrace:
50+
self._mismatch_counter = 0
51+
return True
52+
53+
is_complete = backtest_data.is_complete()
54+
self._logger.debug(f"[Backtest ID: {backtest_data.backtestId}] Completion status: {is_complete}")
55+
56+
if is_complete:
57+
if backtest_data.totalPerformance:
58+
self._mismatch_counter = 0
59+
return True
60+
61+
if self._mismatch_counter >= 6:
62+
self._logger.error(f"[Backtest ID: {backtest_data.backtestId}] We could not retrieve "
63+
f"the complete backtest results, please try again later.")
64+
self._mismatch_counter = 0
65+
return True
66+
67+
self._mismatch_counter += 1
68+
self._logger.debug(f"[Backtest ID: {backtest_data.backtestId}] Incremented mismatch counter to "
69+
f"{self._mismatch_counter}. Will re-check after {delay} seconds.")
70+
import time
71+
time.sleep(delay)
72+
73+
return False
74+
except Exception as e:
75+
self._logger.error(f"Error checking backtest completion status for ID {backtest_data.backtestId}: {e}")
76+
raise
3977

4078
def run_backtest(self, project: QCProject, name: str) -> QCBacktest:
4179
"""Runs a backtest in the cloud.
@@ -53,7 +91,7 @@ def run_backtest(self, project: QCProject, name: str) -> QCBacktest:
5391
try:
5492
return self._task_manager.poll(
5593
make_request=lambda: self._api_client.backtests.get(project.projectId, created_backtest.backtestId),
56-
is_done=lambda data: data.is_complete(),
94+
is_done=self.is_backtest_done,
5795
get_progress=lambda data: data.progress
5896
)
5997
except KeyboardInterrupt as e:

0 commit comments

Comments
 (0)