private async Task<TenorDates> GoDate(DateTime date_, TenorDates record, CarbonClient cc_, bool force_ = true, bool persistToServer_ = true) { if (record == null) throw new ArgumentNullException("record"); if (record != null && record.Dates != null && record.Dates.HasKey(date_) && !force_) return record; Logger.Info( string.Format("Generating tenor Dates for [Cal={0}, SpotDays={1}, Date={2}]", record.HolidayCode, record.SpotStart, date_.ToString("dd-MMM-yyyy")), typeof(DatesWorker)); var allTenors = (CurveDateIndex[])Enum.GetValues(typeof(CurveDateIndex)); if (record.Dates == null) // this shouldnt' happen record.Dates = new ConstructGenGen<DateTime, DateTime>(allTenors.Select(x => x.ToString()).ToArray()); // need to get the spot date first as all other dates are calculated off this var spot = await cc_.RollDateAsync( date: date_.ToNodaLocalDate(), count: record.SpotStart, unit: Symmetry.Carbon.Model.DateUnit.Bd, convention: Symmetry.Carbon.Model.BusinessDayConvention.Following, calendar: record.HolidayCode); record.Dates.SetValue(date_, (int)CurveDateIndex.Spot, spot.ToDateTime()); // then work out each tenor date and store in record foreach (var tenor in allTenors.Where(x => x != CurveDateIndex.Spot)) { var fwdDate = spot.ToDateTime().AddYears((int) tenor); //var fwdDate = await cc_.RollDateAsync( // date: spot, // count: (int)tenor, // unit: Symmetry.Carbon.Model.DateUnit.Y, // convention: Symmetry.Carbon.Model.BusinessDayConvention.Following, // calendar: record.HolidayCode); record.Dates.SetValue(date_, (int)tenor, fwdDate); } if (persistToServer_) await TenorDatesCache.Instance().AddOrUpdateDefinition(record); return record; }
public async Task<TenorDates> GoAll(string otHolidayCode_, int daysToSpot_, CarbonClient cc_, bool force_ = false) { var date = START_DATE; var record = TenorDatesCache.Instance() .InnerList.FirstOrDefault( x => x.SpotStart == daysToSpot_ && string.Compare(otHolidayCode_, x.HolidayCode, StringComparison.OrdinalIgnoreCase) == 0); var allTenors = (CurveDateIndex[])Enum.GetValues(typeof(CurveDateIndex)); var updated = false; if (record == null) { record = new TenorDates() { HolidayCode = otHolidayCode_, SpotStart = daysToSpot_, Dates = new ConstructGenGen<DateTime, DateTime>(allTenors.Select(x => x.ToString()).ToArray()) }; record.Dates.Name = string.Format("{0} tenor dates with spotStart={1}", otHolidayCode_, daysToSpot_); } else { // if we're not forcing a rebuild, then we can move the date to the last date in the series if(!force_) date = record.Dates.Keys.Last(); } while (date < END_DATE) { updated = true; await GoDate( date_: date, record: record, cc_: cc_, force_: force_, persistToServer_: false); var plusOne = await cc_.RollDateAsync(date.ToNodaLocalDate(), 1, Symmetry.Carbon.Model.DateUnit.Bd, Symmetry.Carbon.Model.BusinessDayConvention.Following, otHolidayCode_); date = plusOne.ToDateTime(); } try { if (updated) { var result = await TenorDatesCache.Instance().AddOrUpdateDefinition(record); Logger.Info( string.Format("Updated cache for {0} with {1}. Result = {2}", otHolidayCode_, daysToSpot_, result), typeof(DatesWorker)); } else { Logger.Info( string.Format("Not updating dates cache {0}.{1} as already up to date", otHolidayCode_, daysToSpot_), typeof (DatesWorker)); } } catch (Exception ex_) { Logger.Error("Error updating cache", typeof(DatesWorker), ex_); } return record; }