I have a need to keep a history (rolling window) of X number of past indicator values. In the simple code below, I'm trying to keep the past 180 fifteen minute periods of a bollinger band by storing them in a RollingWindow just as I do with the consolidated TradeBars. Unfortunately, it is not working and all elements of the the _bbwindow data structure end up being the same, presumably because upon calling the _bbwindow.Add() function to store the bollinger band, it is probably storing a pointer to the bollinger band object. Can someone help explain what the preferred method of storing historical values of indicators are?

Thanks so much!!

using System;

using System.Collections.Generic;

using QuantConnect.Data.Consolidators;

using QuantConnect.Indicators;

using QuantConnect.Data.Market;

namespace QuantConnect.Algorithm

{

public class ForexBollinger : QCAlgorithm

{

BollingerBands _bb;

//Use our new consolidator class - 15 minutes / 15 bars joined.

decimal _price;

decimal stopPrice;

string symbol = "EURUSD";

static int Hist = 180;

static int Inputs = 4;

RollingWindow _datawindow = new RollingWindow(Hist);

RollingWindow _bbwindow = new RollingWindow(Hist);

public override void Initialize()

{

SetStartDate(2014, 5, 1);

SetEndDate(2015,6,4);

SetCash(200000);

AddSecurity(SecurityType.Forex, symbol, Resolution.Minute);

_bb = new BollingerBands(20, 2, MovingAverageType.Simple);

var fifteenConsolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(15));

fifteenConsolidator.DataConsolidated += OnDataFifteen;

SubscriptionManager.AddConsolidator(symbol,fifteenConsolidator);

RegisterIndicator(symbol, _bb, fifteenConsolidator, x => x.Value);

}

public void OnData(TradeBars data)

{

if (!_bb.IsReady) return;

if (!Portfolio.HoldStock)

{

Order("EURUSD", 1000);

Debug("Purchased EURUSD on " + Time.ToShortDateString());

}

foreach(string symbol in Securities.Keys){

if (Securities [symbol].Holdings.IsLong) {

if (data[symbol].Close <= stopPrice) {

Liquidate(symbol);

Debug ("Hit StopLoss: " + data[symbol].Close);

}

}

if (Securities [symbol].Holdings.IsShort) {

if (data[symbol].Close >= stopPrice) {

Liquidate(symbol);

Debug ("Hit StopLoss: " + data[symbol].Close);

}

}

}

}

private void OnDataFifteen(object sender,TradeBar consolidated)

{

_price = consolidated.Close;

if (!_bb.IsReady) return;

_datawindow.Add(consolidated);

// **** _bbwindow does not really keep a history of the Bollingerbands!!

_bbwindow.Add (_bb);

if (!_datawindow.IsReady) return;

if (!_bbwindow.IsReady) return;

Plot("BB", "Price", _price);

Plot("BB", _bb.UpperBand, _bb.MiddleBand, _bb.LowerBand);

}

// Fire plotting events once per day:

public override void OnEndOfDay()

{

//Log("EndOfDay");

}

}

}