public void ShouldGetMinuteDataFromCarbon()
        {
            using (var carbonClient = new CarbonClient("PRD"))
            {
                var atTime = new TimeSpan(0, 14, 15);
                var options = new TimeSeriesOptions { AtTime = atTime };

                // specify explicitly UTC time
                var start = new DateTime(2012, 4, 1, 0, 0, 0, DateTimeKind.Utc);
                var end = new DateTime(2016, 3, 1, 0, 0, 0, DateTimeKind.Utc);

                DateTime now = DateTime.Now;
                var intra = carbonClient.GetTimeSeriesAsync("FVH6 Comdty", "intra", start, end, options).Result;
                //var intra = carbonClient.GetTimeSeriesAsync(new[]{"FVU6 Comdty","FVM6 Comdty","FVH6 Comdty","FVZ15 Comdty","FVU15 Comdty","FVM15 Comdty","FVH15 Comdty"}, "intra", start, end, options).Result;
                Console.WriteLine(string.Format("get time series intra taken {0}s", (DateTime.Now - now).TotalSeconds));
                now = DateTime.Now;
                intra = carbonClient.GetTimeSeriesAsync("FVZ15 Comdty", "intra", start, end, options).Result;
                //intra = carbonClient.GetTimeSeriesAsync(new[] { "FVU6 Comdty", "FVM6 Comdty", "FVH6 Comdty", "FVZ15 Comdty", "FVU15 Comdty", "FVM15 Comdty", "FVH15 Comdty" }, "intra", start, end, options).Result;
                Console.WriteLine(string.Format("get time series intra taken {0}s", (DateTime.Now - now).TotalSeconds));
                now = DateTime.Now;
                intra = carbonClient.GetTimeSeriesAsync("FVH6 Comdty", "intra", start, end, options).Result;
                Console.WriteLine(string.Format("get time series intra taken {0}s", (DateTime.Now - now).TotalSeconds));
                
                foreach (var row in intra)
                {
                    var ticker = row.Identifier;

                    foreach (var series in row.Series)
                    {
                        // these are nullable and only present if data was provided
                        var bid = series.GetDouble("highBid");
                        var ask = series.GetDouble("highAsk");
                        var time = series.GetDateTime("timeStamp");
                    }
                }

            }

        }
Пример #2
0
    private async Task populate(CarbonClient cc_)
    {
      await populateDates(cc_);
      // at the moment, carbon can't give me the list of cmt bonds for 'today' so need to get as of yesterday

      var bonds =
        await
          cc_.GetTimeSeriesAsync(Market.CarbonName(), "cmt-bonds", Yesterday.AsOf);

      //var blah =
      //  await cc_.GetTimeSeriesAsync("US7YT=TWEB", "Snap", null, null, new TimeSeriesOptions {IdentifierType = "RIC"});

      if (!bonds.Any())
      {
        Logger.Error(
          string.Format("Did not get any response from carbon asking for cmt-bonds for market {0}", Market.CarbonName()),
          typeof (BondMarket));
        return;
      }

      MessagePackObject mpo;

      if (bonds[0].Series[0].TryGetValue("cmtBonds", out mpo) == false || !mpo.IsList)
        return;


      var bondDict = new Dictionary<string, Bond>();

      foreach (var v in mpo.AsList())
      {
        var dict = v.AsDictionary();

        var bond = new Bond
        {
          OwningMarket = this,
        };

        foreach (var key in dict.Keys)
        {
          switch (key.AsString())
          {
            case "isin":
              bond.Isin = dict[key].AsString();
              break;
            case "term":
              bond.Term = dict[key].AsDouble();
              break;
            case "aswyylambda":
              bond.ASWyyLambda = dict[key].AsDouble();
              break;
            case "yieldlamda":
              bond.YieldLambda = dict[key].AsDouble();
              break;
            case "zspreadlambda":
              bond.ZSpreadLambda = dict[key].AsDouble();
              break;
          }
        }

        if (!string.IsNullOrEmpty(bond.Isin))
        {
          bondDict[bond.Isin] = bond;
        }
      }

      m_bonds = bondDict;

      // need to get some more static data about the bonds

      var dateSetups = new[]
      {
        new Tuple<string, Action<Bond, DateTime>>("maturityDt", (bs, date) => bs.Maturity = date),
        new Tuple<string, Action<Bond, DateTime>>("issueDt", (bs, date) => bs.IssueDate= date),
        new Tuple<string, Action<Bond, DateTime>>("firstCpnDt", (bs, date) => bs.FirstCouponDate= date),
        new Tuple<string, Action<Bond, DateTime>>("effectiveDt", (bs, date) => bs.EffectiveDate= date),
      };

      var dblSetups = new[]
      {
        new Tuple<string, Action<Bond, double>>("cpnRate", (bs, dbl) => bs.Coupon = dbl),
      };

      var statics = await cc_.GetStaticDataAsync(m_bonds.Keys, "static-bond");

      foreach (var s in statics)
      {
        var isin = s.Identifier;

        Bond bs;
        if (m_bonds.TryGetValue(isin, out bs) == false)
          continue;

        DateTime dt;

        foreach (var setup in dateSetups)
        {
          var strVal = s.Properties.GetString(setup.Item1);
          if (DateTime.TryParseExact(strVal, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
            setup.Item2(bs, dt);
        }

        foreach (var setup in dblSetups)
        {
          var dblVal = s.Properties.GetDouble(setup.Item1);
          if (dblVal.HasValue)
            setup.Item2(bs, dblVal.Value);
        }
      }

      var histPrices =
        await cc_.GetTimeSeriesAsync(m_bonds.Keys, Market.CarbonCloseSnapCollection(), DateTime.Today.AddMonths(-2));

      foreach (var v in histPrices.Where(x=>x.Series!=null))
      {
        var isin = v.Identifier;

        Bond bs;
        if (m_bonds.TryGetValue(isin, out bs) == false)
          continue;

        var px = new SortedDictionary<DateTime, double>();

        foreach (var obj in v.Series.Where(x=>x.ContainsKey("close") && x.ContainsKey("date")))
        {
          var strVal = obj.GetString("date");
          DateTime dt;
          double? dblVal;

          if (DateTime.TryParseExact(strVal, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)
            && (dblVal = obj.GetDouble("close")).HasValue)
            px[dt] = dblVal.Value;
        }

        if (px.Count > 0)
          bs.HistoricPrices = new DatedDataCollectionGen<double>(px.Keys.ToArray(), px.Values.ToArray());


        Logger.Debug(v.Series.ToString(), typeof (BondMarket));
      }


      m_priceSub = cc_.SubscribeToMarketData(m_bonds.Keys.ToList(),handlePriceCallback);
    }
Пример #3
0
    private static async Task getFromCarbon(IEnumerable<string> possibleIdentifiers_, IDictionary<RelativeDate, Line> values_, RDDateIndex[] dateIndexes_, DisplayTimeZone zone_, DayField valueField_, DayField volumeField_, CarbonClient cc_)
    {
      var startDate = dateIndexes_.Select(x => x.Date).Min().AddDays(-3d);
      var endDate = dateIndexes_.Select(x => x.Date).Max().AddDays(1d);


      var result = await cc_.GetTimeSeriesAsync(possibleIdentifiers_, "intra", startDate, endDate);

      if (result == null)
      {
        Logger.Info(
          string.Format("Could not get results back from carbon for tickers=[{0}], with startdate={1} and enddate={2}",
            string.Join(",", possibleIdentifiers_),
            startDate.ToString("dd-MMM-yyyy"),
            endDate.ToString("dd-MMM-yyyy")), typeof (CarbonHelper));
        return;
      }

      foreach (var id in possibleIdentifiers_)
      {
        var set = result.FirstOrDefault(x => x.Identifier.Equals(id));

        if (set == null) continue;

        foreach (var row in set.Series)
        {
          // need to have timestamp and price in order to be a value row...
          if (
            !row.ContainsKey(CarbonFields.TimeStamp)
            || !row.ContainsKey(CarbonFields.CloseAsk)
            || !row.ContainsKey(CarbonFields.CloseBid))
            continue;

          var tsGMTstr = row.GetString(CarbonFields.TimeStamp);
          DateTime tsGMT;

          if (!DateTime.TryParseExact(tsGMTstr, "yyyyMMdd HHmmss.fff", CultureInfo.InvariantCulture,DateTimeStyles.None, out tsGMT))
            continue;

          // convert gmt to the timezone that we're interested in
          var tsTZ = tsGMT.ToTZfromGMT(zone_);

          // create a relative date object so we can check if we need this line
          var rd = new RelativeDate(dateIndexes_, tsTZ, zone_);

          if (rd.Index == RelativeDate.INVALID_INDEX)
            continue;

          var closeBid = row.GetDouble(CarbonFields.CloseBid);
          var closeAsk = row.GetDouble(CarbonFields.CloseAsk);

          if (!closeBid.HasValue || !closeAsk.HasValue || closeBid.Value.IsZero() || closeAsk.Value.IsZero())
            continue;

          var closeMid = (closeBid.Value + closeAsk.Value)/2d;

          if (!values_.ContainsKey(rd))
            values_[rd] = new Line { GMTDateTime = tsGMT.ToString(Line.MongoDateFormat) };

          double volume = 0d;
          if (row.ContainsKey(CarbonFields.Volume))
          {
            var vol = row.GetDouble(CarbonFields.Volume);
            volume = vol ?? 0d;
          }

          values_[rd].SetValue(valueField_, closeMid);
          values_[rd].SetValue(volumeField_, volume);

        }

        // if one of the tickers returned values for the given start/end date, then we don't need to consider the next one
        break;
      }
    }