21 using System.Collections.Generic;
38 : base(securities, timeZone, marketHoursDatabase)
55 return dates.Select(date =>
94 return At(
new TimeSpan(hour, minute, second),
TimeZone);
106 return At(
new TimeSpan(hour, minute, 0), timeZone);
117 public ITimeRule At(
int hour,
int minute,
int second, DateTimeZone timeZone)
119 return At(
new TimeSpan(hour, minute, second), timeZone);
130 var name =
string.Join(
",", timeOfDay.TotalHours.ToStringInvariant(
"0.##"));
131 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates =>
133 let localEventTime = date + timeOfDay
134 let utcEventTime = localEventTime.ConvertToUtc(timeZone)
147 if (interval <= TimeSpan.Zero)
149 throw new ArgumentException(
"TimeRules.Every(): time span interval can not be zero or less");
151 var name = Invariant($
"Every {interval.TotalMinutes:0.##} min");
152 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates => EveryIntervalIterator(dates, interval,
TimeZone);
165 var type = extendedMarketOpen ?
"ExtendedMarketOpen" :
"MarketOpen";
166 var name = Invariant($
"{symbol}: {minutesAfterOpen:0.##} min after {type}");
169 var timeAfterOpen = TimeSpan.FromMinutes(minutesAfterOpen);
170 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates =>
172 let marketOpen = exchangeHours.GetNextMarketOpen(date, extendedMarketOpen)
174 where exchangeHours.IsDateOpen(date) && marketOpen.Date == date.Date
175 let localEventTime = marketOpen + timeAfterOpen
176 let utcEventTime = localEventTime.ConvertToUtc(exchangeHours.TimeZone)
191 var type = extendedMarketClose ?
"ExtendedMarketClose" :
"MarketClose";
192 var name = Invariant($
"{symbol}: {minutesBeforeClose:0.##} min before {type}");
195 var timeBeforeClose = TimeSpan.FromMinutes(minutesBeforeClose);
196 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates =>
198 let marketClose = exchangeHours.GetNextMarketClose(date, extendedMarketClose)
200 where exchangeHours.IsDateOpen(date) && marketClose.Date == date.Date
201 let localEventTime = marketClose - timeBeforeClose
202 let utcEventTime = localEventTime.ConvertToUtc(exchangeHours.TimeZone)
214 private static IEnumerable<DateTime> EveryIntervalIterator(IEnumerable<DateTime> dates, TimeSpan interval, DateTimeZone timeZone)
216 if (interval <= TimeSpan.Zero)
218 throw new ArgumentException(
"TimeRules.EveryIntervalIterator(): time span interval can not be zero or less");
220 foreach (var date
in dates)
222 for (var time = TimeSpan.Zero; time <
Time.
OneDay; time += interval)
224 yield
return (date + time).ConvertToUtc(timeZone);