Backtesting with Dynamic (Evolving) WatchLists

Modified on 2012/06/18 08:37 by Eugene — Categorized as: Community Components

Syntax

public class symbolList : List

public IndexHelper(string folder, string index, Bars bars)

public DateTime FirstIndexDate(int bar) public DateTime LastIndexDate(int bar) public symbolList WatchList(int bar)


Parameter Description

folder Location of files containing historical watchlist data
index Index name
bars Current Bars object

Description

As a protection from survivorship bias, traders can use historical data on index components, when they entered, exited or even re-entered an index. The IndexHelper class scans a folder of text files that have an index name and date in their names (e.g. DAX_20010702.txt = DAX Index components for 2001/07/02).

Each of those files holds a list of symbols that were in the index at this date. The list is one symbol at each line. The assumption is, that each symbol in the list is active until the next file. If it still appears it was still in the index, if not it was dropped.

The IndexHelper returns the index composition (WatchList) on any given date (bar) within the first and last available dates (which are exposed as FirstIndexDate and LastIndexDate, respectively.) The WatchList is an object of type symbolList which is simply a generic list of type string.

Example

To run this sample code, you need a collection of files placed in C:\Data and named like below, containing a history of index components:

DAX_20010702.txt
DAX_20010910.txt
DAX_20020923.txt


using System; using System.Collections.Generic; using System.Text; using System.Drawing; using WealthLab; using WealthLab.Indicators; using Community.Components; /*** Requires installation of Community.Components Extension from www.wealth-lab.com > Extensions ***/

namespace WealthLab.Strategies { public class MyStrategy : WealthScript { protected override void Execute() { IndexHelper ih = new IndexHelper( @"C:\Data\", "DAX", Bars ); DateTime firstDateAvailable = ih.FirstIndexDate(); for(int bar = 1; bar < Bars.Count; bar++) { if (IsLastPositionActive) { //code your exit rules here } else { // Test it if( Bars.Datebar >= firstDateAvailable ) { symbolList sl = ih.WatchList( bar ); if( sl != null ) { foreach (string s in sl.symbols ) PrintDebug (s); } } } } } } }