Lean  $LEAN_TAG$
CachingOptionChainProvider.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.Collections.Concurrent;
18 using System.Collections.Generic;
19 using System.Linq;
21 
23 {
24  /// <summary>
25  /// An implementation of <see cref="IOptionChainProvider"/> that will cache by date option contracts returned by another option chain provider.
26  /// </summary>
28  {
29  private readonly ConcurrentDictionary<Symbol, OptionChainCacheEntry> _cache = new ConcurrentDictionary<Symbol, OptionChainCacheEntry>();
30  private readonly IOptionChainProvider _optionChainProvider;
31 
32  /// <summary>
33  /// Initializes a new instance of the <see cref="CachingOptionChainProvider"/> class
34  /// </summary>
35  /// <param name="optionChainProvider"></param>
37  {
38  _optionChainProvider = optionChainProvider;
39  }
40 
41  /// <summary>
42  /// Gets the list of option contracts for a given underlying symbol
43  /// </summary>
44  /// <param name="symbol">The option or the underlying symbol to get the option chain for.
45  /// Providing the option allows targetting an option ticker different than the default e.g. SPXW</param>
46  /// <param name="date">The date for which to request the option chain (only used in backtesting)</param>
47  /// <returns>The list of option contracts</returns>
48  public IEnumerable<Symbol> GetOptionContractList(Symbol symbol, DateTime date)
49  {
50  List<Symbol> symbols;
51 
52  OptionChainCacheEntry entry;
53  if (!_cache.TryGetValue(symbol, out entry) || date.Date != entry.Date)
54  {
55  symbols = _optionChainProvider.GetOptionContractList(symbol, date.Date).ToList();
56  _cache[symbol] = new OptionChainCacheEntry(date.Date, symbols);
57  }
58  else
59  {
60  symbols = entry.Symbols;
61  }
62 
63  return symbols;
64  }
65 
66  private class OptionChainCacheEntry
67  {
68  public DateTime Date { get; }
69  public List<Symbol> Symbols { get; }
70 
71  public OptionChainCacheEntry(DateTime date, List<Symbol> symbols)
72  {
73  Date = date;
74  Symbols = symbols;
75  }
76  }
77  }
78 }