Lean  $LEAN_TAG$
CompositeTimeProvider.cs
1 /*
2  * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
3  * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14 */
15 
16 using System;
17 using System.Linq;
18 using System.Collections.Generic;
19 
21 {
22  /// <summary>
23  /// The composite time provider will source it's current time using the smallest time from the given providers
24  /// </summary>
26  {
27  private readonly ITimeProvider[] _timeProviders;
28 
29  /// <summary>
30  /// Creates a new instance
31  /// </summary>
32  /// <param name="timeProviders">The time providers to use. Will default to the real time provider if empty</param>
33  public CompositeTimeProvider(IEnumerable<ITimeProvider> timeProviders)
34  {
35  _timeProviders = timeProviders.DefaultIfEmpty(RealTimeProvider.Instance).ToArray();
36  }
37 
38  /// <summary>
39  /// Gets the current time in UTC
40  /// </summary>
41  /// <returns>The current time in UTC</returns>
42  public DateTime GetUtcNow()
43  {
44  var result = DateTime.MaxValue;
45  for (var i = 0; i < _timeProviders.Length; i++)
46  {
47  var utcNow = _timeProviders[i].GetUtcNow();
48 
49  if (utcNow < result)
50  {
51  // we return the smallest
52  result = utcNow;
53  }
54  }
55  return result;
56  }
57  }
58 }