/// <summary> /// Set the time for the realtime event handler. /// </summary> /// <param name="time">Current time.</param> public void SetTime(DateTime time) { // poke each event to see if it has fired, be sure to invoke these in time order foreach (var scheduledEvent in GetScheduledEventsSortedByTime()) { _isolatorLimitProvider.Consume(scheduledEvent, time); } }
/// <summary> /// Set the time for the realtime event handler. /// </summary> /// <param name="time">Current time.</param> public void SetTime(DateTime time) { var scheduledEvents = GetScheduledEventsSortedByTime(); // the first element is always the next while (scheduledEvents.Count > 0 && scheduledEvents[0].NextEventUtcTime <= time) { _isolatorLimitProvider.Consume(scheduledEvents[0], time, _timeMonitor); SortFirstElement(scheduledEvents); } }
/// <summary> /// Execute the live realtime event thread montioring. /// It scans every second monitoring for an event trigger. /// </summary> private void Run() { IsActive = true; // continue thread until cancellation is requested while (!_cancellationTokenSource.IsCancellationRequested) { var time = DateTime.UtcNow; // pause until the next second var nextSecond = time.RoundUp(TimeSpan.FromSeconds(1)); var delay = Convert.ToInt32((nextSecond - time).TotalMilliseconds); Thread.Sleep(delay < 0 ? 1 : delay); // poke each event to see if it should fire, we order by unique id to be deterministic foreach (var kvp in ScheduledEvents.OrderBySafe(pair => pair.Value)) { var scheduledEvent = kvp.Key; try { _isolatorLimitProvider.Consume(scheduledEvent, time, _timeMonitor); } catch (Exception exception) { Algorithm.SetRuntimeError(exception, $"Scheduled event: '{scheduledEvent.Name}' at {time}"); } } } IsActive = false; Log.Trace("LiveTradingRealTimeHandler.Run(): Exiting thread... Exit triggered: " + _cancellationTokenSource.IsCancellationRequested); }
/// <summary> /// Set the time for the realtime event handler. /// </summary> /// <param name="time">Current time.</param> public void SetTime(DateTime time) { var scheduledEvents = GetScheduledEventsSortedByTime(); // the first element is always the next while (scheduledEvents.Count > 0 && scheduledEvents[0].NextEventUtcTime <= time) { try { _isolatorLimitProvider.Consume(scheduledEvents[0], time, _timeMonitor); } catch (Exception exception) { Algorithm.SetRuntimeError(exception, $"Scheduled event: '{scheduledEvents[0].Name}' at {time}"); break; } SortFirstElement(scheduledEvents); } }
/// <summary> /// Convenience method for invoking a scheduled event's Scan method inside the <see cref="IsolatorLimitResultProvider"/> /// </summary> public static void Consume( this IIsolatorLimitResultProvider isolatorLimitProvider, ScheduledEvent scheduledEvent, DateTime scanTimeUtc ) { // perform initial filtering to prevent starting a task when not necessary if (scheduledEvent.NextEventUtcTime > scanTimeUtc) { return; } var timeProvider = RealTimeProvider.Instance; isolatorLimitProvider.Consume(timeProvider, () => scheduledEvent.Scan(scanTimeUtc)); }
/// <summary> /// Execute the live realtime event thread montioring. /// It scans every second monitoring for an event trigger. /// </summary> public void Run() { IsActive = true; // continue thread until cancellation is requested while (!_cancellationTokenSource.IsCancellationRequested) { var time = DateTime.UtcNow; // pause until the next second var nextSecond = time.RoundUp(TimeSpan.FromSeconds(1)); var delay = Convert.ToInt32((nextSecond - time).TotalMilliseconds); Thread.Sleep(delay < 0 ? 1 : delay); // poke each event to see if it should fire, we order by unique id to be deterministic foreach (var kvp in ScheduledEvents.OrderBy(pair => pair.Value)) { var scheduledEvent = kvp.Key; try { _isolatorLimitProvider.Consume(scheduledEvent, time); } catch (ScheduledEventException scheduledEventException) { var errorMessage = "LiveTradingRealTimeHandler.Run(): There was an error in a scheduled " + $"event {scheduledEvent.Name}. The error was {scheduledEventException.Message}"; Log.Error(scheduledEventException, errorMessage); ResultHandler.RuntimeError(errorMessage); // Errors in scheduled event should be treated as runtime error // Runtime errors should end Lean execution Algorithm.RunTimeError = new Exception(errorMessage); } } } IsActive = false; Log.Trace("LiveTradingRealTimeHandler.Run(): Exiting thread... Exit triggered: " + _cancellationTokenSource.IsCancellationRequested); }