public void DoesNotSetRunTimeErrorWhenReconnectMessageComesThrough() { var algorithm = new AlgorithmStub(equities: new List<string> { "SPY" }); var referenceTime = DateTime.UtcNow; algorithm.SetDateTime(referenceTime); var localReferencTime = referenceTime.ConvertFromUtc(TimeZones.NewYork); var open = localReferencTime.AddSeconds(1).TimeOfDay; var closed = TimeSpan.FromDays(1); var marketHours = new MarketHoursSegment(MarketHoursState.Market, open, closed); algorithm.Securities[Symbols.SPY].Exchange.SetMarketHours(new [] {marketHours}, localReferencTime.DayOfWeek); var job = new LiveNodePacket(); var results = new TestResultHandler();//packet => Console.WriteLine(FieldsToString(packet))); var api = new Api.Api(); var handler = new DefaultBrokerageMessageHandler(algorithm, job, results, api, TimeSpan.FromMinutes(15), TimeSpan.FromSeconds(.25)); Assert.IsNull(algorithm.RunTimeError); handler.Handle(BrokerageMessageEvent.Disconnected("Disconnection!")); Thread.Sleep(100); handler.Handle(BrokerageMessageEvent.Reconnected("Reconnected!")); Thread.Sleep(500); Assert.IsNull(algorithm.RunTimeError); results.Exit(); }
/// <summary> /// Helper to access the market hours field based on the day of week /// </summary> /// <param name="localDateTime">The local date time to retrieve market hours for</param> public LocalMarketHours GetMarketHours(DateTime localDateTime) { LocalMarketHours marketHours; switch (localDateTime.DayOfWeek) { case DayOfWeek.Sunday: marketHours = _sunday; break; case DayOfWeek.Monday: marketHours = _monday; break; case DayOfWeek.Tuesday: marketHours = _tuesday; break; case DayOfWeek.Wednesday: marketHours = _wednesday; break; case DayOfWeek.Thursday: marketHours = _thursday; break; case DayOfWeek.Friday: marketHours = _friday; break; case DayOfWeek.Saturday: marketHours = _saturday; break; default: throw new ArgumentOutOfRangeException(nameof(localDateTime), localDateTime, null); } // If the earlyCloseTime is between a segment, change the close time with it // and add it after the segments prior to the earlyCloseTime // Otherwise, just take the segments prior to the earlyCloseTime if (_earlyCloses.TryGetValue(localDateTime.Date, out var earlyCloseTime)) { var index = marketHours.Segments.Count; MarketHoursSegment newSegment = null; for (var i = 0; i < marketHours.Segments.Count; i++) { var segment = marketHours.Segments[i]; if (segment.Start <= earlyCloseTime && earlyCloseTime <= segment.End) { newSegment = new MarketHoursSegment(segment.State, segment.Start, earlyCloseTime); index = i; break; } else if (earlyCloseTime < segment.Start) { // we will drop any remaining segment starting by this one index = i - 1; break; } } var newSegments = new List <MarketHoursSegment>(marketHours.Segments.Take(index)); if (newSegment != null) { newSegments.Add(newSegment); } marketHours = new LocalMarketHours(localDateTime.DayOfWeek, newSegments); } // If the lateOpenTime is between a segment, change the start time with it // and add it before the segments previous to the lateOpenTime // Otherwise, just take the segments previous to the lateOpenTime if (_lateOpens.TryGetValue(localDateTime.Date, out var lateOpenTime)) { var index = 0; var newSegments = new List <MarketHoursSegment>(); for (var i = 0; i < marketHours.Segments.Count; i++) { var segment = marketHours.Segments[i]; if (segment.Start <= lateOpenTime && lateOpenTime <= segment.End) { newSegments.Add(new (segment.State, lateOpenTime, segment.End)); index = i + 1; break; } else if (lateOpenTime < segment.Start) { index = i; break; } } newSegments.AddRange(marketHours.Segments.TakeLast(marketHours.Segments.Count - index)); marketHours = new LocalMarketHours(localDateTime.DayOfWeek, newSegments); } return(marketHours); }
/// <summary> /// Initializes a new instance of the <see cref="LocalMarketHours"/> class from the specified open/close times /// </summary> /// <param name="day">The day of week these hours apply to</param> /// <param name="extendedMarketOpen">The extended market open time</param> /// <param name="marketOpen">The regular market open time, must be greater than or equal to the extended market open time</param> /// <param name="marketClose">The regular market close time, must be greater than the regular market open time</param> /// <param name="extendedMarketClose">The extended market close time, must be greater than or equal to the regular market close time</param> public LocalMarketHours(DayOfWeek day, TimeSpan extendedMarketOpen, TimeSpan marketOpen, TimeSpan marketClose, TimeSpan extendedMarketClose) : this(day, MarketHoursSegment.GetMarketHoursSegments(extendedMarketOpen, marketOpen, marketClose, extendedMarketClose)) { }