Historical Data

Rolling Window

Introduction

A RollingWindow is an array of a fixed-size that holds trailing data. It's more efficient to use RollingWindow objects to hold periods of data than to make multiple historical data requests. With a RollingWindow, you just update the latest data point while a History call fetches all of the data over the period you request. RollingWindow objects operate on a first-in, first-out process to allow for reverse list access semantics. Index 0 refers to the most recent item in the window and the largest index refers to the last item in the window.

Supported Types

RollingWindow objects can store any native or C# types.

closeWindow = new RollingWindow<decimal>(4);
tradeBarWindow = new RollingWindow<TradeBar>(2);
quoteBarWindow = new RollingWindow<QuoteBar>(2);
self.close_window = RollingWindow[float](4)
self.trade_bar_window = RollingWindow[TradeBar](2)
self.quote_bar_window = RollingWindow[QuoteBar](2)

To be notified when RollingWindow objects support additional types, subscribe to GitHub Issue #6199.

Add Data

To add data to a RollingWindow, call the Add method.

closeWindow.Add(data["SPY"].Close);
tradeBarWindow.Add(data["SPY"]);
quoteBarWindow.Add(data["EURUSD"]);
self.close_window.Add(data["SPY"].Close)
self.trade_bar_window.Add(data["SPY"])
self.quote_bar_window.Add(data["EURUSD"])

To update the data at a specific index, set the value for that index. If the index doesn't currently exist, it increases the size and fills the empty indices with a default value (zero or nullNone).

closeWindow[0] = data["SPY"].Close;
tradeBarWindow[0] = data["SPY"];
quoteBarWindow[0] = data["EURUSD"];
self.close_window[0] = data["SPY"].Close
self.trade_bar_window[0] = data["SPY"]
self.quote_bar_window[0] = data["EURUSD"]

Warm Up

To warm up a RollingWindow, make a history request and then iterate through the result to add the data to the RollingWindow.

var spy = AddEquity("SPY", Resolution.Daily).Symbol;
var historyTradeBar = History<TradeBar>(spy, 10, Resolution.Daily);
var historyQuoteBar = History<QuoteBar>(spy, 10, Resolution.Minute);

// Warm up the close price and trade bar rolling windows with the previous 10-day trade bar data
var closePriceWindow = new RollingWindow<decimal>(10);
var tradeBarWindow = new RollingWindow<TradeBar>(10);
foreach (var tradeBar in historyTradeBar)
{
    closePriceWindow.Add(tradeBar.Close);
    tradeBarWindow.Add(tradeBar);
}

// Warm up the quote bar rolling window with the previous 10-minute quote bar data
var quoteBarWindow = new RollingWindow<QuoteBar>(10);
foreach (var quoteBar in historyQuoteBar)
{
    quoteBarWindow.Add(quoteBar);
}
spy = self.AddEquity("SPY", Resolution.Daily).Symbol
history_trade_bar = self.History[TradeBar](spy, 10, Resolution.Daily)
history_quote_bar = self.History[QuoteBar](spy, 10, Resolution.Minute)

# Warm up the close price and trade bar rolling windows with the previous 10-day trade bar data
close_price_window = RollingWindow[float](10)
trade_bar_window = RollingWindow[TradeBar](10)
for trade_bar in history_trade_bar:
    close_price_window.Add(trade_bar.Close)
    trade_bar_window.Add(trade_bar)

# Warm up the quote bar rolling window with the previous 10-minute quote bar data
quote_bar_window = RollingWindow[QuoteBar](10)
for quote_bar in history_quote_bar:
    quote_bar_window.Add(quote_bar)

Check Readiness

To check if a RollingWindow is full, use its IsReady flag.

if (!closeWindow.IsReady) 
{
    return;
}
if not self.close_window.IsReady:
    return

Adjust Size

To adjust the RollingWindow size, set the Size property.

closeWindow.Size = 3;
tradeBarWindow.Size = 3;
quoteBarWindow.Size = 3;
self.close_window.Size = 3
self.trade_bar_window.Size = 3
self.quote_bar_window.Size = 3

When you decrease the size, it removes the oldest values that no longer fit in the RollingWindow. When you explicitly increase the Size member, it doesn't automatically add any new elements to the RollingWindow. However, if you set the value of an index in the RollingWindow and the index doesn't currently exist, it fills the empty indices with a default value (zero or nullNone). For example, the following code increases the Size to 10, sets the 10th element to 3, and sets the 4th-9th elements to the default value:

closeWindow[9] = 3;
self.close_window[9] = 3

Access Data

RollingWindow objects operate on a first-in, first-out process to allow for reverse list access semantics. Index 0 refers to the most recent item in the window and the largest index refers to the last item in the window.

var currentClose = closeWindow[0];
var previousClose = closeWindow[1];
var oldestClose = closeWindow[closeWindow.Count-1];
current_close = self.close_window[0]
previous_close = self.close_window[1]
oldest_close = self.close_window[self.close_window.Count-1]

To get the item that was most recently removed from the RollingWindow, use the MostRecentlyRemoved property.

var removedClose = closeWindow.MostRecentlyRemoved;
removed_close = self.close_window.MostRecentlyRemoved

Combine with Indicators

Indicators have a built-in RollingWindow that stores historical values. To access these historical values, see Get Indicator Values.

Combine with Consolidators

To store a history of consolidated bars, in the consolidation handler, add the consolidated bar to the RollingWindow.

_consolidator.DataConsolidated += (sender, consolidatedBar) => tradeBarWindow.Add(consolidatedBar);
self.consolidator.DataConsolidated += lambda sender, consolidated_bar: self.trade_bar_window.Add(consolidated_bar)

Cast to Other Types

You can cast a RollingWindow to a list or a DataFrame. If you cast it to a list, reverse the list so the most recent element is at the last index of the list. This is the order the elements would be in if you added the elements to the list with the Add method. To cast a RollingWindow to a DataFrame, the RollingWindow must contain Slice, Tick, QuoteBar, or TradeBar objects. If the RollingWindow contains ticks, the ticks must have unique timestamps.

You can cast a RollingWindow to a list. If you cast it to a list, reverse the list so the most recent element is at the last index of the list. This is the order the elements would be in if you added the elements to the list with the Add method.

var closes = closeWindow.Reverse().ToList();
closes = list(self.close_window)[::-1]

tick_df = self.PandasConverter.GetDataFrame[Tick](list(self.tick_window)[::-1])
trade_bar_df = self.PandasConverter.GetDataFrame[TradeBar](list(self.trade_bar_window)[::-1])
quote_bar_df = self.PandasConverter.GetDataFrame[QuoteBar](list(self.quote_bar_window)[::-1])

Delete Data

To remove all of the elements from a RollingWindow, call the Reset method.

closeWindow.Reset();
self.close_window.Reset()

You can also see our Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the documentation: