Lean  $LEAN_TAG$
FuncBenchmark.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 Python.Runtime;
18 
20 {
21  /// <summary>
22  /// Creates a benchmark defined by a function
23  /// </summary>
24  public class FuncBenchmark : IBenchmark
25  {
26  private readonly Func<DateTime, decimal> _benchmark;
27 
28  /// <summary>
29  /// Initializes a new instance of the <see cref="FuncBenchmark"/> class
30  /// </summary>
31  /// <param name="benchmark">The functional benchmark implementation</param>
32  public FuncBenchmark(Func<DateTime, decimal> benchmark)
33  {
34  if (benchmark == null)
35  {
36  throw new ArgumentNullException(nameof(benchmark));
37  }
38  _benchmark = benchmark;
39  }
40 
41  /// <summary>
42  /// Create a function benchmark from a Python function
43  /// </summary>
44  /// <param name="pyFunc"></param>
45  public FuncBenchmark(PyObject pyFunc)
46  {
47  if (!pyFunc.TryConvertToDelegate(out _benchmark))
48  {
49  throw new ArgumentException($"FuncBenchmark(): {Messages.FuncBenchmark.UnableToConvertPythonFunctionToBenchmarkFunction}");
50  }
51  }
52 
53  /// <summary>
54  /// Evaluates this benchmark at the specified time
55  /// </summary>
56  /// <param name="time">The time to evaluate the benchmark at</param>
57  /// <returns>The value of the benchmark at the specified time</returns>
58  public decimal Evaluate(DateTime time)
59  {
60  return _benchmark(time);
61  }
62  }
63 }