public static ReturnsFromWeightsResult DoIt_DailyWeights(ConstructGen<double> dailyWts_, DateTime? maxPnlDate_=null) { var wts = (ConstructGen<double>)dailyWts_.Clone(); var indexPrices = Singleton<ComIndexPrices>.Instance.GetData(DataConstants.DATA_START, DateTime.Today, false); var indexReturns = indexPrices.ToReturns().GetSubValues(dailyWts_.Dates.First(),DateTime.Today); var coms = Singleton<ComIDs>.Instance.ToArray(); var spotPnl = new ConstructGen<double>(wts.ColumnHeadings) {Name = wts.Name}; var dollImpWts = new ConstructGen<double>(wts.ColumnHeadings); double[] currentWts = Utils.GetArrayOfValue(0d, wts.ArrayLength); for (int i = 0; i < indexReturns.Dates.Count; ++i) { var date = indexReturns.Dates[i]; if (maxPnlDate_.HasValue && date > maxPnlDate_.Value) break; var todayIndexReturns = indexReturns.GetValues(date); var todayStratReturns=new double[wts.ArrayLength]; for (int j = 0; j < todayStratReturns.Length; ++j) { // set today's strat returns todayStratReturns[j] = currentWts[j]*todayIndexReturns[j]; // dollar impact weights currentWts[j] *= (1d + todayStratReturns[j]); } spotPnl.SetValues(date, todayStratReturns); // if the weights have change at the end of today, update currentWts so they affect tomorrows pnl if (wts.Dates.Contains(indexReturns.Dates[i])) currentWts = wts.GetValues(indexReturns.Dates[i]); dollImpWts.SetValues(date, (double[]) currentWts.Clone()); } return new ReturnsFromWeightsResult(dailyWts_.Name) { SpotPnl = spotPnl, OriginalWts = dailyWts_, DailyDollarImpactedWeights = dollImpWts, SpotsUsed = indexPrices.GetSubValues(dailyWts_.Dates.First(),DateTime.Today) }; }