Traders' Tip text
We hope that the zero-lag EC filter becomes a good addition to the trader's arsenal. To be employed in a Wealth-Lab Strategy, all it takes is to install (or update if you haven't done that already) the
TASCIndicators library from the
wealth-lab.com site. Our tests of the always-in-market system mentioned in the article on several diversified portfolios showed that it has potential but may benefit from further optimization and refinement.
Figure 1. A Wealth-Lab Developer 6.0 chart showing the EC filter applied to Crude Oil, October 2010 (60-minute).
It's pleasing to see how this responsive, leading indicator tracks trends, but traders should never underestimate the amount of time spent by markets in range-trading and consolidation phases. As can be noticed on the Crude Oil chart above (the green line in its upper half), the Least Error filter is doing a good job ruling out the low-probability signals, yet it misses some here and there. To improve performance, adding some other filter to detect non-trending conditions might be appropriate.
WealthScript Code (C#)
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using TASCIndicators; // The EC filter and Least Error
namespace WealthLab.Strategies
{
public class ZeroLag1011 : WealthScript
{
private StrategyParameter paramLength;
private StrategyParameter paramGain;
private StrategyParameter paramThresh;
public ZeroLag1011()
{
paramLength = CreateParameter("Length", 32, 2, 100, 1);
paramGain = CreateParameter("Gain Limit", 22, 2, 100, 1);
paramThresh = CreateParameter("Threshold", 0.75, 0.5, 2, 0.25);
}
protected override void Execute()
{
int Length = paramLength.ValueInt;
int GainLimit = paramGain.ValueInt;
double Thresh = paramThresh.Value;
// Data series
EMA ema = EMA.Series( Close, Length, EMACalculation.Modern );
EC ec = EC.Series( Close, Length, GainLimit );
LeastError le = LeastError.Series( Close, Length, GainLimit );
SetBarColors( Color.LimeGreen, Color.OrangeRed );
// This EMA-based indicator is "unstable": allow it to stabilize
for(int bar = Length * 3; bar < Bars.Count; bar++)
{
SetBackgroundColor( bar, Color.Black );
// Detect crossover/crossunder and LeastError above threshold
bool maXo = CrossOver( bar, ec, ema ) & ( lebar > Thresh );
bool maXu = CrossUnder( bar, ec, ema ) & ( lebar > Thresh );
// The initial trade
if (Positions.Count == 0){
if ( maXo )
BuyAtMarket( bar + 1 );
else if( maXu )
ShortAtMarket( bar + 1 );
}
// All subsequent trades of the SAR system
else
{
Position p = LastPosition;
if ( p.PositionType == PositionType.Long ) {
if ( maXu ) {
SellAtMarket( bar + 1, p );
ShortAtMarket( bar + 1 );
}
}
else {
if ( maXo ) {
CoverAtMarket( bar + 1, p );
BuyAtMarket( bar + 1 );
}
}
}
}
// Plotting the EC, EMA, and Least Error
WealthLab.LineStyle solid = LineStyle.Solid;
PlotSeries( PricePane, ec, Color.Gold, solid, 1 );
PlotSeries( PricePane, ema, Color.Red, solid, 1 );
ChartPane lePane = CreatePane( 30,true,true );
PlotSeries( lePane, le, Color.LimeGreen, solid, 2 );
DrawHorzLine( lePane, Thresh, Color.Blue, LineStyle.Dashed, 2 );
HideVolume();
}
}
}