Traders' Tip text
In March 2015 issue, authors John Ehlers and Ric Way outlined a statistically valid procedure for the successful development of trading systems, providing a testbed for assessing whether the price will increase or decrease over N bars after an event.
From our point of view, it might be optimal to prove the conclusion regarding robustness of the example system by using a different subset of data. It's not a secret that throughout the in-sample period of 10 years used to optimize the system on, almost 6 have been attributed to blowing the third biggest bubble in the U.S. stock market history. Consequently, it's hard to not come up with a trading system having a positive expectation when the market is again comparable to the Dot-com frenzy.
Figure 1. A Wealth-Lab 6 chart showing the U.S. market bubble of the 2010's through the monthly chart of S&P 500 index (^GSPC).
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace WealthLab.Strategies
{
	public class EhlersMar2015 : WealthScript
	{
		private StrategyParameter paramStoc;
		private StrategyParameter paramThresh;
		private StrategyParameter paramLength;
		private StrategyParameter paramLoss;
		public EhlersMar2015()
		{
			paramStoc = CreateParameter("StocLength", 8, 1, 100, 1);
			paramThresh = CreateParameter("Threshold", 0.3, 0.1, 0.9, 0.1);			
			paramLength = CreateParameter("TradeLength", 14, 1, 50, 1);
			paramLoss = CreateParameter("PctLoss", 3.8, 0.5, 15.0, 0.5);
		}
		
		protected override void Execute()
		{
			int StocLength = paramStoc.ValueInt, TradeLength = paramStoc.ValueInt;
			double Threshold = paramThresh.Value, PctLoss = paramLoss.Value;
			Highest HiC = Highest.Series(Close, StocLength);
			Lowest LoC = Lowest.Series(Close, StocLength);
			DataSeries Stoc = (Close - LoC) / (HiC - LoC);
			
			for(int bar = GetTradingLoopStartBar(1); bar < Bars.Count; bar++)
			{
				if (IsLastPositionActive)
				{
					Position p = LastPosition;
					if ( bar+1 - p.EntryBar >= TradeLength )
						SellAtMarket( bar+1, p, "Timed" );
					else
						if( Lowbar < p.EntryPrice*(1.0 - PctLoss /100d) )
						SellAtMarket(bar+1, p, "Stop");
				}
				else
				{
					if( CrossOver( bar, Stoc, Threshold ) )
						BuyAtMarket( bar+1 );
				}
			}
		}
	}
}
Eugene
Wealth-Lab team
www.wealth-lab.com