Exemplo n.º 1
0
      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;
      }
Exemplo n.º 2
0
      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;
      }