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();
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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))
 {
 }