internal static void Go()
    {

      DatedDataCollectionGen<double> stratReturns = null;

      {
        var pathToReturns = @"e:\stratReturnsSeries.csv";

        var dates = new List<DateTime>();
        var data = new List<double>();
        foreach (var v in CsvFile.Read<LineItem>(pathToReturns))
        {
          dates.Add(v.Date);
          data.Add(v.Return);
        }
        stratReturns = new DatedDataCollectionGen<double>(dates.ToArray(), data.ToArray());
      }

      var stratEval = new ReturnsEval.DataSeriesEvaluator(stratReturns.Dates, stratReturns.Data, "strat", ReturnsEval.DataSeriesType.Returns);


      var spx = BbgTalk.HistoryRequester.GetHistory(stratReturns.Dates[0], "SPX INDEX", "PX_CLOSE_1D", false);

      {
        for (int i = 1; i < spx.Length; ++i)
        {
          spx.Data[i - 1] = spx.Data[i];
        }
      }

      var spxR = spx.ToReturns();
      var spxEval = new ReturnsEval.DataSeriesEvaluator(spxR.Dates, spxR.Data, "SPX", ReturnsEval.DataSeriesType.Returns);
      spxEval.Evaluate();
      spxEval.Display("spx");

      double[] perfDuringDrawdown = new double[stratReturns.Length];

      var listOfRecords = new List<DrawdownItem>();

      foreach (var dd in spxEval.Daily.DrawDowns)
      {
        if (Math.Abs(dd.ValueDown) > 0.03)
        {
          double perf = 0d;
          for (int i = 0; i < stratReturns.Length; ++i)
          {
            if (stratReturns.Dates[i] >= dd.StartDate && stratReturns.Dates[i] <= dd.LowDate)
            {
              perfDuringDrawdown[i] = stratReturns.Data[i];
              perf += stratReturns.Data[i];
            }
          }

          if (perf != 0d)
          {
            stratEval.Evaluate(dd.StartDate, dd.LowDate);
            listOfRecords.Add(new DrawdownItem()
            {
              DateStart = dd.StartDate,
              DateBottomOut = dd.LowDate,
              ChangeInSPX = -dd.ValueDown,
              StrategyPerformance = perf,
              TopStratDrawdown = stratEval.Daily.DrawDowns.Count()==0 ? 0d : -stratEval.Daily.DrawDowns.OrderByDescending(x=>x.ValueDown).First().ValueDown
            });
          }
        }
      }


      {
        var origStratCumulative = stratReturns.ToCumulative();
        var perDuringDrawdownCumulative = new DatedDataCollectionGen<double>(stratReturns.Dates, perfDuringDrawdown).ToCumulative();
        var spxCumulative = spxEval.Daily.ToCumulative();

        var linechart = new SI.Controls.LineChartDataDisplay();

        linechart.AddSeries(origStratCumulative.Dates, origStratCumulative.Data, "Original strategy");
        linechart.AddSeries(perDuringDrawdownCumulative.Dates, perDuringDrawdownCumulative.Data, "Strat during SPX drawdown");

        linechart.AddSeries(spxCumulative.Dates, spxCumulative.Data, "SPX cumulative return", 80, "####0.0");

        {
          var legend =  linechart.AddCompositeLegendForAllLayers();
          legend.Bounds = new System.Drawing.Rectangle(30, 0, 20, 30);
          legend.BoundsMeasureType = Infragistics.UltraChart.Shared.Styles.MeasureType.Percentage;

          legend.PE.ElementType = PaintElementType.Gradient;
          legend.PE.FillGradientStyle = GradientStyle.ForwardDiagonal;
          legend.PE.Fill = Color.DarkGray;
          legend.PE.FillStopColor = Color.DarkGray;
          legend.Border.CornerRadius = 10;
          legend.Border.Color = Color.White;
          legend.Border.Thickness = 1;
        }

        linechart.DisplayInShowForm("Strat analysis during >3% SPX drawdowns");
      }

      var g = listOfRecords.DisplayInGrid("Records");
      g.SetHeaderClickSort();
    }