Beispiel #1
0
 /// <summary>
 /// Local holiday keeper and loader
 /// </summary>
 /// <param name="exchangename"></param>
 /// <param name="regular"></param>
 public LocalHoliday(string exchangename, LocalMarketSessionDay regular)
 {
     _exchangename      = exchangename;
     _knownHolidays     = new Dictionary <DateTime, LocalMarketSessionDay>();
     _marketHoursConfig = Config.MarketHourConfig.FirstOrDefault(x => x.Exchanges.Contains(exchangename));
     _regular           = regular;
 }
Beispiel #2
0
        /// <summary>
        /// Load all market session days for holidays derived from configurations
        /// </summary>
        /// <param name="year"></param>
        /// <param name="configfiles"></param>
        /// <returns></returns>
        public static Dictionary <MarketHoursHolidayConfig, DateTime> GetHolidaySessions(int year, IEnumerable <MarketHoursHolidayConfig> configfiles, LocalMarketSessionDay regular)
        {
            //Save found holidays for depended holidays
            Dictionary <MarketHoursHolidayConfig, DateTime> knownholidays = new Dictionary <MarketHoursHolidayConfig, DateTime>();

            //Check on regular holidays
            foreach (var config in configfiles.Where(x => !x.Date.DaysAfterHoliday.HasValue && !x.Date.DaysBeforeHoliday.HasValue))
            {
                //Set current date
                DateTime day = Time.Year(year);

                //Get day of week, if applicable
                DayOfWeek?dow = null;
                if (!string.IsNullOrWhiteSpace(config.Date.DayOfWeek))
                {
                    dow = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), config.Date.DayOfWeek);
                }

                //Check config
                if (config.Name.ToLower() == "easter sunday")
                {
                    day = EasterSunday(year);
                }

                //Fixed Month
                if (config.Date.Month.HasValue)
                {
                    day = day.AddMonths(config.Date.Month.Value - 1);
                }
                //Fixed day in month
                if (config.Date.Day.HasValue)
                {
                    day = day.AddDays(config.Date.Day.Value - 1);
                }
                //Check for week of month
                if (config.Date.WeekOfMonth.HasValue)
                {
                    day = day.AddDays(7 * (config.Date.WeekOfMonth.Value - 1));
                }
                //Fixed day of week that occurred
                if (config.Date.DayOccurance.HasValue && dow != null)
                {
                    //Find the moment this day of week occurs
                    int occurance = day.DayOfWeek == dow ? 1 : 0;

                    while (occurance != config.Date.DayOccurance.Value)
                    {
                        day = day.AddDays(1);
                        if (day.DayOfWeek == dow)
                        {
                            occurance++;
                        }
                    }
                }
                //Check last day occurrence
                if (config.Date.IsLastDayOccurance.HasValue && config.Date.IsLastDayOccurance.Value)
                {
                    //Find the moment this day of week occurs
                    DateTime lasttimefound      = day;
                    DateTime nextmonthoccurance = day.AddDays(60);

                    while (lasttimefound < nextmonthoccurance)
                    {
                        day = day.Add(Time.OneDay);
                        if (day.DayOfWeek == dow && day.Month == lasttimefound.Month)
                        {
                            lasttimefound = day;
                        }
                    }

                    //Set last time we found this day in that month
                    day = lasttimefound;
                }
                //Check if this holiday is only every x amount of years
                if (config.Date.StartYear.HasValue && config.Date.EveryXYear.HasValue)
                {
                    int startyear  = config.Date.StartYear.Value;
                    int everyxyear = config.Date.EveryXYear.Value;

                    //Skip it if it is not in our year
                    if ((year - startyear) % everyxyear > 0)
                    {
                        continue;
                    }
                }

                //Add to known holidays
                knownholidays.Add(config, day);
            }

            //Check on derived holidays
            foreach (var config in configfiles.Where(x => x.Date.DaysAfterHoliday.HasValue || x.Date.DaysBeforeHoliday.HasValue))
            {
                //Set current date
                DateTime day = Time.Year(year);

                //Get holiday if known
                DateTime referencedholiday = knownholidays.First(x => String.Equals(x.Key.Name, config.Date.BeforeHoliday, StringComparison.CurrentCultureIgnoreCase) ||
                                                                 String.Equals(x.Key.Name, config.Date.AfterHoliday, StringComparison.CurrentCultureIgnoreCase))
                                             .Value;

                //Before holiday?
                if (config.Date.DaysBeforeHoliday.HasValue)
                {
                    day = referencedholiday.AddDays(-config.Date.DaysBeforeHoliday.Value);
                }
                //After holiday?
                else if (config.Date.DaysAfterHoliday.HasValue)
                {
                    day = referencedholiday.AddDays(config.Date.DaysAfterHoliday.Value);
                }

                //Add to known holidays
                knownholidays.Add(config, day);
            }

            //Return what we know
            return(knownholidays);
        }