25 using System.Collections.Generic;
26 using Timer = System.Timers.Timer;
37 private readonly Random _random =
new Random();
38 private int _dataPointsPerSecondPerSymbol;
40 private readonly Timer _timer;
45 private readonly Dictionary<Symbol, TimeZoneOffsetProvider> _symbolExchangeTimeZones;
67 _aggregator = dataAggregator;
68 _dataPointsPerSecondPerSymbol = dataPointsPerSecondPerSymbol;
72 if (historyManager ==
null)
77 optionChainProvider.Initialize(
new(mapFileProvider, historyManager));
78 _optionChainProvider = optionChainProvider;
81 _symbolExchangeTimeZones =
new Dictionary<Symbol, TimeZoneOffsetProvider>();
83 _subscriptionManager.SubscribeImpl += (s, t) =>
true;
84 _subscriptionManager.UnsubscribeImpl += (s, t) =>
true;
94 var lastTime = DateTime.UtcNow;
95 _timer.Elapsed += (sender, args) =>
97 var elapsed = (DateTime.UtcNow - lastTime);
98 var ticksPerSecond = (_count - lastCount)/elapsed.TotalSeconds;
99 Log.
Trace(
"TICKS PER SECOND:: " + ticksPerSecond.ToStringInvariant(
"000000.0") +
" ITEMS IN QUEUE:: " + 0);
101 lastTime = DateTime.UtcNow;
107 catch (ObjectDisposedException)
122 var enumerator = _aggregator.Add(dataConfig, newDataAvailableHandler);
123 _subscriptionManager.Subscribe(dataConfig);
142 _subscriptionManager.Unsubscribe(dataConfig);
143 _aggregator.Remove(dataConfig);
158 _timer.DisposeSafely();
164 private void PopulateQueue()
166 var symbols = _subscriptionManager.GetSubscribedSymbols();
169 foreach (var symbol
in symbols)
171 if (symbol.IsCanonical() || symbol.Contains(
"UNIVERSE"))
175 var offsetProvider = GetTimeZoneOffsetProvider(symbol);
180 for (var i = 0; i < _dataPointsPerSecondPerSymbol; i++)
183 var exchangeTime = offsetProvider.ConvertFromUtc(now);
184 var lastTrade = 100 + (decimal)Math.Abs(Math.Sin(now.TimeOfDay.TotalMilliseconds));
188 _aggregator.Update(
new Tick
194 Quantity = _random.Next(10, (
int)_timer.Interval)
201 var bidPrice = lastTrade * 0.95m;
202 var askPrice = lastTrade * 1.05m;
203 var bidSize = _random.Next(10, (
int) _timer.Interval);
204 var askSize = _random.Next(10, (
int)_timer.Interval);
205 _aggregator.Update(
new Tick(exchangeTime, symbol,
"",
"", bidSize: bidSize, bidPrice: bidPrice, askPrice: askPrice, askSize: askSize));
211 private TimeZoneOffsetProvider GetTimeZoneOffsetProvider(Symbol symbol)
213 TimeZoneOffsetProvider offsetProvider;
214 if (!_symbolExchangeTimeZones.TryGetValue(symbol, out offsetProvider))
217 var exchangeTimeZone = _marketHoursDatabase.GetExchangeHours(symbol.ID.Market, symbol, symbol.SecurityType).TimeZone;
218 _symbolExchangeTimeZones[symbol] = offsetProvider =
new TimeZoneOffsetProvider(exchangeTimeZone,
TimeProvider.
GetUtcNow(), Time.EndOfTime);
220 return offsetProvider;
230 public IEnumerable<Symbol>
LookupSymbols(
Symbol symbol,
bool includeExpired,
string securityCurrency =
null)
237 foreach (var result
in _optionChainProvider.GetOptionContractList(symbol, DateTime.UtcNow.Date))