21 using System.Collections.Generic;
31 private DateTimeZone _timeZone;
42 _securities = securities;
59 return dates.Select(date =>
65 return _securities.UtcTime;
86 return At(timeOfDay, _timeZone);
98 return At(
new TimeSpan(hour, minute, second), _timeZone);
110 return At(
new TimeSpan(hour, minute, 0), timeZone);
121 public ITimeRule At(
int hour,
int minute,
int second, DateTimeZone timeZone)
123 return At(
new TimeSpan(hour, minute, second), timeZone);
134 var name =
string.Join(
",", timeOfDay.TotalHours.ToStringInvariant(
"0.##"));
135 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates =>
137 let localEventTime = date + timeOfDay
138 let utcEventTime = localEventTime.ConvertToUtc(timeZone)
151 if (interval <= TimeSpan.Zero)
153 throw new ArgumentException(
"TimeRules.Every(): time span interval can not be zero or less");
155 var name = Invariant($
"Every {interval.TotalMinutes:0.##} min");
156 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates => EveryIntervalIterator(dates, interval, _timeZone);
169 var security = GetSecurity(symbol);
171 var type = extendedMarketOpen ?
"ExtendedMarketOpen" :
"MarketOpen";
172 var name = Invariant($
"{symbol}: {minutesAfterOpen:0.##} min after {type}");
174 var timeAfterOpen = TimeSpan.FromMinutes(minutesAfterOpen);
175 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates =>
177 let marketOpen = security.Exchange.Hours.GetNextMarketOpen(date, extendedMarketOpen)
179 where security.Exchange.DateIsOpen(date) && marketOpen.Date == date.Date
180 let localEventTime = marketOpen + timeAfterOpen
181 let utcEventTime = localEventTime.ConvertToUtc(security.Exchange.TimeZone)
196 var security = GetSecurity(symbol);
198 var type = extendedMarketClose ?
"ExtendedMarketClose" :
"MarketClose";
199 var name = Invariant($
"{security.Symbol}: {minutesBeforeClose:0.##} min before {type}");
201 var timeBeforeClose = TimeSpan.FromMinutes(minutesBeforeClose);
202 Func<IEnumerable<DateTime>, IEnumerable<DateTime>> applicator = dates =>
204 let marketClose = security.Exchange.Hours.GetNextMarketClose(date, extendedMarketClose)
206 where security.Exchange.DateIsOpen(date) && marketClose.Date == date.Date
207 let localEventTime = marketClose - timeBeforeClose
208 let utcEventTime = localEventTime.ConvertToUtc(security.Exchange.TimeZone)
217 if (!_securities.TryGetValue(symbol, out security))
219 throw new KeyNotFoundException($
"{symbol} not found in portfolio. Request this data when initializing the algorithm.");
230 private static IEnumerable<DateTime> EveryIntervalIterator(IEnumerable<DateTime> dates, TimeSpan interval, DateTimeZone timeZone)
232 if (interval <= TimeSpan.Zero)
234 throw new ArgumentException(
"TimeRules.EveryIntervalIterator(): time span interval can not be zero or less");
236 foreach (var date
in dates)
238 for (var time = TimeSpan.Zero; time < Time.OneDay; time += interval)
240 yield
return (date + time).ConvertToUtc(timeZone);