MarketClearingTimespan getClearingTimespanIfMarketSuspended(DateTime dateTimeServer) { MarketClearingTimespan ret = null; if (this.ClearingTimespans == null) { return(ret); } foreach (MarketClearingTimespan clearingTimespan in this.ClearingTimespans) { if (clearingTimespan.SuspendServerTimeOfDay == DateTime.MinValue) { continue; } if (clearingTimespan.ResumeServerTimeOfDay == DateTime.MinValue) { continue; } if (clearingTimespan.ClearingHappensOnDayOfWeek(dateTimeServer.DayOfWeek) == false) { ret = null; break; } bool afterSuspend = dateTimeServer.TimeOfDay >= clearingTimespan.SuspendServerTimeOfDay.TimeOfDay; bool beforeResume = dateTimeServer.TimeOfDay < clearingTimespan.ResumeServerTimeOfDay.TimeOfDay; if (afterSuspend && beforeResume) { ret = clearingTimespan; break; } } return(ret); }
public DateTime AdvanceToWhenClearingResumes(DateTime dateTimeServer, MarketClearingTimespan clearingTimespan) { DateTime ret = new DateTime(dateTimeServer.Year, dateTimeServer.Month, dateTimeServer.Day, clearingTimespan.ResumeServerTimeOfDay.Hour, clearingTimespan.ResumeServerTimeOfDay.Minute, clearingTimespan.ResumeServerTimeOfDay.Second); if (ret.TimeOfDay < dateTimeServer.TimeOfDay) { ret = ret.AddDays(1); } return(ret); }
public DateTime AdvanceToWhenClearingResumes(DateTime dateTimeServer, MarketClearingTimespan clearingTimespan) { DateTime ret = new DateTime(dateTimeServer.Year, dateTimeServer.Month, dateTimeServer.Day, clearingTimespan.ResumeServerTimeOfDay.Hour, clearingTimespan.ResumeServerTimeOfDay.Minute, clearingTimespan.ResumeServerTimeOfDay.Second); if (ret.TimeOfDay < dateTimeServer.TimeOfDay) { ret = ret.AddDays(1); } return ret; }
public DateTime GetNextMarketServerTimeStamp(DateTime serverDateTime, BarScaleInterval scale, out MarketClearingTimespan clearingTimespan) { if (serverDateTime == DateTime.MinValue) { throw new Exception("IRefuse: NextTimeStamp for DateTime.MinValue"); //serverDateTime = this.ConvertLocalTimeToServer(DateTime.Now); } DateTime ret = serverDateTime; bool addNextRank = false; int year = ret.Year; int nextMonth = ret.Month + 1; int intervalsCeiled = 0; int valueCeiled = 0; //MarketClearingTimespan clearingTimespan = null; switch (scale.Scale) { case BarScale.Tick: throw new ArgumentException("Tick scale is not supported"); case BarScale.Second: intervalsCeiled = (int)Math.Floor((double)(serverDateTime.Second / scale.Interval)); valueCeiled = (intervalsCeiled + 1) * scale.Interval; if (valueCeiled >= 60) { addNextRank = true; valueCeiled -= 60; } ret = new DateTime(serverDateTime.Year, serverDateTime.Month, serverDateTime.Day, serverDateTime.Hour, serverDateTime.Minute, valueCeiled); if (addNextRank) ret = ret.AddMinutes(1); clearingTimespan = getClearingTimespanIfMarketSuspended(ret); if (clearingTimespan != null) { ret = this.AdvanceToWhenClearingResumes(ret, clearingTimespan); //ret = ret.AddSeconds((double)scale.Interval); } if (this.isMarketAfterCloseServerTime(ret)) { ret = this.AdvanceToNextDayOpen(ret); //ret = ret.AddSeconds((double)scale.Interval); } break; case BarScale.Minute: intervalsCeiled = (int)Math.Floor((double)(serverDateTime.Minute / scale.Interval)); valueCeiled = (intervalsCeiled + 1) * scale.Interval; if (valueCeiled >= 60) { addNextRank = true; valueCeiled -= 60; } ret = new DateTime(serverDateTime.Year, serverDateTime.Month, serverDateTime.Day, serverDateTime.Hour, valueCeiled, 0); if (addNextRank) ret = ret.AddHours(1); clearingTimespan = getClearingTimespanIfMarketSuspended(ret); if (clearingTimespan != null) { ret = this.AdvanceToWhenClearingResumes(ret, clearingTimespan); //ret = ret.AddMinutes((double)scale.Interval); } bool afterClose = this.isMarketAfterCloseServerTime(ret); bool beforeOpen = this.isMarketBeforeOpenServerTime(ret); if (beforeOpen) { ret = this.AdvanceToThisDayOpen(ret); } else { if (afterClose) { ret = this.AdvanceToNextDayOpen(ret); } } break; case BarScale.Hour: intervalsCeiled = (int)Math.Floor((double)(serverDateTime.Minute / scale.Interval)); valueCeiled = (intervalsCeiled + 1) * scale.Interval; if (valueCeiled >= 24) { addNextRank = true; valueCeiled -= 24; } ret = new DateTime(serverDateTime.Year, serverDateTime.Month, serverDateTime.Day, serverDateTime.Hour, valueCeiled, 0); if (addNextRank) ret = ret.AddDays(1); clearingTimespan = getClearingTimespanIfMarketSuspended(ret); if (clearingTimespan != null) { ret = this.AdvanceToWhenClearingResumes(ret, clearingTimespan); //ret = ret.AddHours((double)scale.Interval); } if (this.isMarketAfterCloseServerTime(ret)) { ret = this.AdvanceToNextDayOpen(ret); //ret = ret.AddHours((double)scale.Interval); } break; case BarScale.Daily: ret = this.AdvanceToNextDayOpen(ret); break; case BarScale.Weekly: ret = this.AdvanceToNextDayOpen(ret); while (ret.DayOfWeek != DayOfWeek.Friday) { ret = ret.AddDays(1.0); } if (this.IsTradeableDayServerTime(ret) == false) { if (ret.Day == serverDateTime.Day - 1) { ret = ret.AddDays(7.0); if (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } } else { ret = ret.AddDays(-1.0); } } break; case BarScale.Monthly: if (nextMonth == 13) { nextMonth = 1; year++; } ret = new DateTime(year, nextMonth, 1, 0, 0, 0); ret = this.AdvanceToNextDayOpen(ret); ret = ret.AddDays(-1.0); while (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } break; case BarScale.Quarterly: if (nextMonth == 13) { year++; nextMonth = 1; } else { nextMonth = ((int)Math.Floor((double)ret.Month / 3)) * 3; } ret = new DateTime(year, nextMonth, 28); do { ret = ret.AddDays(1.0); } while (ret.Month == nextMonth); ret = ret.AddDays(-1.0); ret = this.AdvanceToNextDayOpen(ret); while (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } break; case BarScale.Yearly: ret = new DateTime(ret.Year + 1, 12, 31); ret = this.AdvanceToNextDayOpen(ret); while (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } break; } return ret; }
bool isMarketSuspendedForClearing(DateTime dateTimeServer) { MarketClearingTimespan suspendedNow = getClearingTimespanIfMarketSuspended(dateTimeServer); return((suspendedNow != null) ? true : false); }
public DateTime GetNextMarketServerTimeStamp(DateTime serverDateTime, BarScaleInterval scale, out MarketClearingTimespan clearingTimespan) { if (serverDateTime == DateTime.MinValue) { throw new Exception("IRefuse: NextTimeStamp for DateTime.MinValue"); //serverDateTime = this.ConvertLocalTimeToServer(DateTime.Now); } DateTime ret = serverDateTime; bool addNextRank = false; int year = ret.Year; int nextMonth = ret.Month + 1; int intervalsCeiled = 0; int valueCeiled = 0; //MarketClearingTimespan clearingTimespan = null; switch (scale.Scale) { case BarScale.Tick: throw new ArgumentException("Tick scale is not supported"); case BarScale.Second: intervalsCeiled = (int)Math.Floor((double)(serverDateTime.Second / scale.Interval)); valueCeiled = (intervalsCeiled + 1) * scale.Interval; if (valueCeiled >= 60) { addNextRank = true; valueCeiled -= 60; } ret = new DateTime(serverDateTime.Year, serverDateTime.Month, serverDateTime.Day, serverDateTime.Hour, serverDateTime.Minute, valueCeiled); if (addNextRank) { ret = ret.AddMinutes(1); } clearingTimespan = getClearingTimespanIfMarketSuspended(ret); if (clearingTimespan != null) { ret = this.AdvanceToWhenClearingResumes(ret, clearingTimespan); //ret = ret.AddSeconds((double)scale.Interval); } if (this.isMarketAfterCloseServerTime(ret)) { ret = this.AdvanceToNextDayOpen(ret); //ret = ret.AddSeconds((double)scale.Interval); } break; case BarScale.Minute: intervalsCeiled = (int)Math.Floor((double)(serverDateTime.Minute / scale.Interval)); valueCeiled = (intervalsCeiled + 1) * scale.Interval; if (valueCeiled >= 60) { addNextRank = true; valueCeiled -= 60; } ret = new DateTime(serverDateTime.Year, serverDateTime.Month, serverDateTime.Day, serverDateTime.Hour, valueCeiled, 0); if (addNextRank) { ret = ret.AddHours(1); } clearingTimespan = getClearingTimespanIfMarketSuspended(ret); if (clearingTimespan != null) { ret = this.AdvanceToWhenClearingResumes(ret, clearingTimespan); //ret = ret.AddMinutes((double)scale.Interval); } bool afterClose = this.isMarketAfterCloseServerTime(ret); bool beforeOpen = this.isMarketBeforeOpenServerTime(ret); if (beforeOpen) { ret = this.AdvanceToThisDayOpen(ret); } else { if (afterClose) { ret = this.AdvanceToNextDayOpen(ret); } } break; case BarScale.Hour: intervalsCeiled = (int)Math.Floor((double)(serverDateTime.Minute / scale.Interval)); valueCeiled = (intervalsCeiled + 1) * scale.Interval; if (valueCeiled >= 24) { addNextRank = true; valueCeiled -= 24; } ret = new DateTime(serverDateTime.Year, serverDateTime.Month, serverDateTime.Day, serverDateTime.Hour, valueCeiled, 0); if (addNextRank) { ret = ret.AddDays(1); } clearingTimespan = getClearingTimespanIfMarketSuspended(ret); if (clearingTimespan != null) { ret = this.AdvanceToWhenClearingResumes(ret, clearingTimespan); //ret = ret.AddHours((double)scale.Interval); } if (this.isMarketAfterCloseServerTime(ret)) { ret = this.AdvanceToNextDayOpen(ret); //ret = ret.AddHours((double)scale.Interval); } break; case BarScale.Daily: ret = this.AdvanceToNextDayOpen(ret); break; case BarScale.Weekly: ret = this.AdvanceToNextDayOpen(ret); while (ret.DayOfWeek != DayOfWeek.Friday) { ret = ret.AddDays(1.0); } if (this.IsTradeableDayServerTime(ret) == false) { if (ret.Day == serverDateTime.Day - 1) { ret = ret.AddDays(7.0); if (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } } else { ret = ret.AddDays(-1.0); } } break; case BarScale.Monthly: if (nextMonth == 13) { nextMonth = 1; year++; } ret = new DateTime(year, nextMonth, 1, 0, 0, 0); ret = this.AdvanceToNextDayOpen(ret); ret = ret.AddDays(-1.0); while (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } break; case BarScale.Quarterly: if (nextMonth == 13) { year++; nextMonth = 1; } else { nextMonth = ((int)Math.Floor((double)ret.Month / 3)) * 3; } ret = new DateTime(year, nextMonth, 28); do { ret = ret.AddDays(1.0); } while (ret.Month == nextMonth); ret = ret.AddDays(-1.0); ret = this.AdvanceToNextDayOpen(ret); while (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } break; case BarScale.Yearly: ret = new DateTime(ret.Year + 1, 12, 31); ret = this.AdvanceToNextDayOpen(ret); while (!this.IsTradeableDayServerTime(ret)) { ret = ret.AddDays(-1.0); } break; } return(ret); }