Example #1
0
        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);
        }
Example #2
0
        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;
		}
Example #5
0
        bool isMarketSuspendedForClearing(DateTime dateTimeServer)
        {
            MarketClearingTimespan suspendedNow = getClearingTimespanIfMarketSuspended(dateTimeServer);

            return((suspendedNow != null) ? true : false);
        }
Example #6
0
        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);
        }