28be3bbe3d
In order to continue to provide debugging support in the QC cloud, the scheduled events were moved from inside of a task to the algorithm's main execution thread. This necesitated a different methodology for managing timeouts. Instead of raising an exception when attempting to request additional time when none is remaining, we're now simply allowing the isolator's limit to be reached by virtue of not incrementing the additional minutes in the time manager. This uncovered a bug in LEAN engine where if the isolator terminates an algorithm, then the status of the algorithm (on the algorithm manager instance) isn't properly updated to indicate RuntimeError. This is in direct conflict with the status update that is provided to the api, which is RuntimeError, so this change remedies that issue as well. One of the regression algorithms depends on this status value being properly flipped to RuntimeError in the event that the isolator limit is reached. See #3319
52 lines
2.0 KiB
C#
52 lines
2.0 KiB
C#
/*
|
|
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
|
|
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
using System;
|
|
|
|
namespace QuantConnect
|
|
{
|
|
/// <summary>
|
|
/// Represents the result of the <see cref="Isolator"/> limiter callback
|
|
/// </summary>
|
|
public class IsolatorLimitResult
|
|
{
|
|
/// <summary>
|
|
/// Gets the amount of time spent on the current time step
|
|
/// </summary>
|
|
public TimeSpan CurrentTimeStepElapsed { get; }
|
|
|
|
/// <summary>
|
|
/// Gets the error message or an empty string if no error on the current time step
|
|
/// </summary>
|
|
public string ErrorMessage { get; }
|
|
|
|
/// <summary>
|
|
/// Returns true if there are no errors in the current time step
|
|
/// </summary>
|
|
public bool IsWithinCustomLimits => string.IsNullOrEmpty(ErrorMessage);
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="IsolatorLimitResult"/> class
|
|
/// </summary>
|
|
/// <param name="currentTimeStepElapsed">The amount of time spent on the current time step</param>
|
|
/// <param name="errorMessage">The error message or an empty string if no error on the current time step</param>
|
|
public IsolatorLimitResult(TimeSpan currentTimeStepElapsed, string errorMessage)
|
|
{
|
|
ErrorMessage = errorMessage;
|
|
CurrentTimeStepElapsed = currentTimeStepElapsed;
|
|
}
|
|
}
|
|
}
|