public IndexDailyPerformance(Index index, DateTime dateTime, decimal? @return, decimal? value)
 {
     Index = index;
     Date = dateTime;
     Return = @return;
     Value = value;
 }
 public void Save(Index index)
 {
     var session = GetSession();
     using (var tx = session.BeginTransaction())
     {
         session.SaveOrUpdate(index);
         tx.Commit();
     }
 }
 public IndexPerformance(Index index, YearMonth yearMonth, decimal? @return, decimal? value)
 {
     Index = index;
     YearMonth = yearMonth;
     _month = yearMonth.Month;
     _year = yearMonth.Year;
     Return = @return;
     Value = value;
 }
 public IndexPerformance(Index index, YearMonth yearMonth)
     : this(index, yearMonth, null, null)
 {
 }
 public IndexDailyPerformance(Index index, DateTime dateTime)
     : this(index, dateTime, null, null)
 {
 }
        TotalReturns GetTotalReturnsFor(Index security)
        {
            var result = new TotalReturns(security);

            using (var session = _sessionFactory.GetSession())
            {
                var service = session.CreateService();

                var priceRequest = service.CreateRequest(RequestType.HistoricalDataRequest);

                priceRequest.Append("securities", security.BloombergName);

                priceRequest.Append("fields", "PX_LAST");
                priceRequest.Set("startDate", new YearMonth(2012, 1).AsDateTime().ToBBDateTimeString());
                priceRequest.Set("endDate", new YearMonth(2013, 12).AsDateTime().ToBBDateTimeString());
                priceRequest.Set("periodicitySelection", "MONTHLY");
                priceRequest.Set("currency", security.CurrencyCode);

                session.ProcessRequest(priceRequest, @event => @event.ForEachFieldData(fdi =>
                {
                    var date = fdi.GetElementAsDate("date").ToSystemDateTime();
                    var lastPrice = fdi.GetElementAsFloat64("PX_LAST");

                    result.Add(date, Convert.ToDecimal(lastPrice));
                }));

                if (security.UseUnderlyingPriceForReturn)
                { // Calculate Return manually
                    foreach (var index in result)
                    {
                        var lastValue = index.GetLastValue();
                        if (index.Value == null || lastValue == null || lastValue == 0m) continue;
                        index.Return = Percent.CreateFromDecimalNotation((index.Value.Value / lastValue) - 1);
                    }
                }
                else
                { // Retrieve Return from Bloomberg
                    foreach (var index in result)
                    {
                        if (index._previous == null) continue;

                        // =BDP("SPX INDEX", "CUST_TRR_RETURN_HOLDING_PER", "CUST_TRR_START_DT,CUST_TRR_END_DT,CUST_TRR_CRNCY", "20121031,20121130,USD")
                        var start = index._previous.DateTime;
                        var end = index.DateTime;

                        var returnRequest = service.CreateRequest(RequestType.ReferenceDataRequest);
                        returnRequest.Append("securities", security.BloombergName);
                        returnRequest.Append("fields", "CUST_TRR_RETURN_HOLDING_PER");
                        returnRequest.AddOverride("CUST_TRR_START_DT", start.ToBBDateTimeString());
                        returnRequest.AddOverride("CUST_TRR_END_DT", end.ToBBDateTimeString());
                        returnRequest.AddOverride("CUST_TRR_CRNCY", security.CurrencyCode);

                        session.ProcessRequest(returnRequest, @event => @event.ForEachFieldData(fdi =>
                        {
                            if (fdi.HasElement("CUST_TRR_RETURN_HOLDING_PER"))
                            {
                                var rtn = fdi.GetElementAsFloat64("CUST_TRR_RETURN_HOLDING_PER");
                                index.Return = Percent.CreateFromPercentageNotation(Convert.ToDecimal(rtn));
                            }
                        }));
                    }
                }
            }

            return result;
        }