Traders' Tip text
We've added Markos Katsanos' Regression Divergence indicator to the Wealth-Lab TASCIndicators library for easy reference in any Strategy.
Buy signals were produced when the divergence crossed above 75 and turned down during the next three days. The opposite event, i.e. the crossing under 25 and turning up, generated short signals.
Figure 1. 
Trades generated by the intermarket divergence system with the 50-day regression divergence indicator plotted on the top.Get the companion Strategy's C# code by downloading it right from Wealth-Lab's "Open Strategy" dialog:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using TASCIndicators;
namespace WealthLab.Strategies
{
	public class MyStrategy : WealthScript
	{
		private StrategyParameter slider1;
		private StrategyParameter slider2;
		private StrategyParameter slider3;
		
		public MyStrategy()
		{
			slider1 = CreateParameter("Regression Period",50,2,300,20);
			slider2 = CreateParameter("Div.Mom. Period",50,2,300,20);
			slider3 = CreateParameter("ROC Period",3,2,300,20);
		}
		
		protected override void Execute()
		{
			var fxy = GetExternalSymbol("FXY",true);
			var spy = GetExternalSymbol("SPY",true);			
			var rd = RegressionDivergence.Series(Bars,fxy,spy,slider1.ValueInt,slider2.ValueInt,slider3.ValueInt);
			
			int STD = 25, OB = 90,//STOCHASIC
			D1 = 3, //ROC DAYS
			D2 = 25, //MA LR DAYS
			DIVDAYS = 50,// REGRESSION DAYS
			IMDAYS = 50;// DIVERGENCE MOMENTUM DAYS
			double CR3CR = 0.8; //CORRELATION WITH SEC3
			int DIVCRIT = 75, LAG = 3; // DIVERGENCE CRITICAL
			double STP = 1.5; // STOP LOSS %
			int EXIT = 11; // TIME EXIT DAYS
			var ls = LineStyle.Solid;
			
			var OS=100-OB;
			var DIVSHORT = 100-DIVCRIT;
			var STOC=(SMA.Series(Close-Lowest.Series(Low,STD),3)*100)/(SMA.Series(Highest.Series(High,STD)-Lowest.Series(Low,STD),3));
			//STOC = StochK.Series(Bars,3);
			var MA1=SMA.Series(Close,D2);
			var LR=100*LinearRegSlope.Series(Close,D2);
			var RS1 =(Close/(Close>>D1)-1)*100;
			var RS2 =(fxy.Close/(fxy.Close>>D1)-1)*100;
			var RS3 =(spy.Close/(spy.Close>>D1)-1)*100;
			var CR2 = Correlation.Series(RS1,RS2,DIVDAYS);
			var CR3 = Correlation.Series(RS1,RS3,DIVDAYS);
			
			//var pop = StdDevCalculation.Population;
			//var b2=CR2*StdDev.Series(RS1,DIVDAYS,pop)/(StdDev.Series(RS2,DIVDAYS,pop)+0.001);
			//var a2=SMA.Series(RS1,DIVDAYS)-b2*SMA.Series(RS2,DIVDAYS);
			//var PRED2=b2*RS2+a2;
			//var DIV2=PRED2-RS1;
			//var IM2=(SMA.Series(DIV2 - Lowest.Series(DIV2,IMDAYS), 2) * 100)/(SMA.Series(Highest.Series(DIV2, IMDAYS) - Lowest.Series(DIV2, IMDAYS),2)+0.01);
			ChartPane rdPane = CreatePane(40,true,true);
			PlotSeries(rdPane,rd,Color.FromArgb(255,255,0,0),LineStyle.Solid,1);
			DrawHorzLine(rdPane,DIVSHORT,Color.Brown,ls,1);
			DrawHorzLine(rdPane,DIVCRIT,Color.CadetBlue,ls,1);
			
			for(int bar = GetTradingLoopStartBar(60); bar < Bars.Count; bar++)
			{
				if (IsLastPositionActive)
				{
					Position p = LastPosition;
					int barssinceentry = bar+1 - p.EntryBar;
					if( barssinceentry>= EXIT )
						ExitAtClose(bar,Position.AllPositions,"TIME");
					else
						if( p.PositionType == PositionType.Long )
					{
						if( barssinceentry>3 && Closebarbar-barssinceentry*(1.0-STP/100d) && STOCbar>OS)
							SellAtMarket(bar+1,p,"STOP");
						if( barssinceentry>7 && Closebarbar*(1.0-STP/100d) )
							SellAtMarket(bar+1,p,"TRAIL");
					}
					else
					{
						if( barssinceentry>3 && Closebar>Closebar-barssinceentry*(1.0+STP/100d) && STOCbar
						if( barssinceentry>7 && Closebar>Lowest.Series(Close,barssinceentry)bar*(1.0+STP/100d) )
							CoverAtMarket(bar+1,p,"TRAIL COVER");					
					}
				}
				else
				{
					if( (rdbar-LAG>DIVCRIT) && (rdbarbar-LAG) && (rdbar>DIVSHORT) &&
						(CR3barbar>=LRbar-1 || Closebar>MA1bar) )
						BuyAtClose(bar,"DIVJPY");
					if( (rdbar-LAGbar>rdbar-LAG) && (rdbarbarbar<=LRbar-1 || Closebarbar) )
						ShortAtClose(bar,"NDIVJPY");
				}
			}			
		}
	}
}
Eugene (Gene Geren)
Wealth-Lab team
www.wealth-lab.com