예제 #1
0
    public static SymmetryTSInstrument Get(string curvename_)
    {
      if (m_cache.ContainsKey(curvename_))
        return m_cache[curvename_];

      return m_cache[curvename_] = new SymmetryTSInstrument(SwapCurveDefinitions.Get(curvename_).FrontOfCurveSymmetryCode);
    }
예제 #2
0
      public async Task<DFs> GoAll(string holidayCode_, int spotStart_, CurveIDs curve_, CarbonClient cc_, bool forceReRead_=false)
      {
        Logger.Info(string.Format("Considering {0} DFs...", curve_.CarbonCurveName), typeof (DFsWorker));

        // first we need to get the list of dates for the given holidaycode
        var datesRecord =
          TenorDatesCache.Instance()
            .InnerList.FirstOrDefault(
              x =>
                x.SpotStart == spotStart_ &&
                string.Compare(holidayCode_, x.HolidayCode, StringComparison.OrdinalIgnoreCase) == 0);

        if (datesRecord == null)
        {
          Logger.Error(
            string.Format("cannot update DFs as can't find a calendar object with params [spotStart={0},Calendar={1}]",
              spotStart_, holidayCode_), typeof (DFsWorker));
          return null;
        }

        var taDFs = DFsCache.Instance().InnerList.FirstOrDefault(x =>
          String.Compare(x.Curvename, curve_.CarbonCurveName, StringComparison.OrdinalIgnoreCase) == 0);

        if (taDFs == null)
        {
          taDFs = new DFs()
          {
            Curvename=curve_.CarbonCurveName,
          };
        }

        var carbonDFs = await CarbonCurveRetriever.Instance().GetDailyCurveDFs(cc_, datesRecord, curve_.CarbonCurveName);

        if (carbonDFs == null)
        {
          Logger.Error(string.Format("Did not successfully retrieve DFs for {0} from carbon", curve_.CarbonCurveName),
            typeof (DFsWorker));
          return null;
        }

        bool updated = false;

        if (taDFs.DFValues == null || forceReRead_)
        {
          updated = true;
          taDFs.DFValues = carbonDFs;
        }
        else
        {
          foreach (var date in carbonDFs.Dates)
          {
            bool needToSet = !taDFs.DFValues.HasDate(date);

            if (!needToSet && date>DateTime.Today.AddMonths(-1))
            {
              needToSet = true;

              var current = taDFs.DFValues.ValueOnExactDate(date);
              var carbon = carbonDFs.ValueOnExactDate(date);

              if (current!=null && carbon!=null && current.Data!=null && carbon.Data!=null && (current.Data.Sum() - carbon.Data.Sum()).IsZero())
              {
                needToSet = false;
              }
              else
                Logger.Debug(
                  string.Format("Going to update dfs for {0} on {1}", curve_.CarbonCurveName, date.ToString("dd-MMM-yyyy")),
                  typeof(DFsWorker));
            }

            if (!needToSet) continue;

            Logger.Debug(
              string.Format("Adding in dfs for {0} on {1}", curve_.CarbonCurveName, date.ToString("dd-MMM-yyyy")),
              typeof (DFsWorker));
            updated = true;
            taDFs.DFValues.SetValueOnDate(date, carbonDFs.ValueOnDate(date));
          }
        }

        // persist the fixings if the curve has details

        if (!string.IsNullOrEmpty(curve_.CurveFixingTicker))
        {
          var pxs = new SymmetryTSInstrument(curve_.CurveFixingTicker).GetPrices();

          if (pxs != null)
          {
            if (taDFs.FixingValues == null ||
              (taDFs.FixingValues.LastDate < pxs.LastDate))
            {
              taDFs.FixingValues = pxs.GetValuesBetweenDates(datesRecord.Dates.Keys[0],DateTime.Today);
              updated = true;
            }
          }
        }


        if (updated)
        {
          var result = await DFsCache.Instance().AddOrUpdateDefinition(taDFs);
          Logger.Info(string.Format("Updated DFs on server for {0}. Result = {1}", curve_.CarbonCurveName, result),
            typeof (DFsWorker));
        }
        else
          Logger.Info(string.Format("Not updating {0} DFs as nothing changed", curve_.CarbonCurveName),
            typeof(DFsWorker));



        return taDFs;
      }