public static LiveRelativeDateMonitor GetMonitor(RDDateIndex[] dates_, DisplayTimeZone zone_)
 {
   return _cache.ContainsKey(dates_[0].Date)
     ? _cache[dates_[0].Date]
     : _cache[dates_[0].Date] = new LiveRelativeDateMonitor(dates_,zone_);
 }
 public LiveRelativeDateMonitor(RDDateIndex[] dateIndexes_,DisplayTimeZone zone_)
 {
   m_dateIndexes = dateIndexes_;
   m_zone = zone_;
   GenerateValue();
 }
Exemplo n.º 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;
      }
    }