Traders' Tip text
We strived to find clear rules that build a trading system in this month’s article but it doesn’t appear to contain a complete strategy. Here’s our attempt at creating something:
Entry rules- Buy next bar at open when the Leavitt Convolution Slope and the LcAcceleration both get above zero 
 
Exit rules- Exit at market when the Leavitt Convolution Slope "reaches its peak" (as defined by rising to its 20-bar high) and then the LcAcceleration changes its sign (i.e. goes below zero). 
 
Figure 1. Trading rules applied to a chart of AXP (American Express) Data provided by Yahoo Finance.
Figure 1 illustrates the system’s mechanics on a sample trade in AXP. In July’19 the 
LeavittConvSlope indicator hits a 50-bar highest high, touching the blue dashed line. Shortly after the 
LcAcceleration indicator turns down and the system is out.
To get the Strategy's C# code, no need in copy/paste: simply download it right from Wealth-Lab's "Open Strategy" dialog.
WealthScript Code (C#)
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace WealthLab.Strategies
{
	public class Leavitt : WealthScript
	{
		private StrategyParameter paramLength;
		private StrategyParameter paramPeak;
		
		public Leavitt()
		{
			paramLength = CreateParameter("LcP Length", 50, 10, 50, 10);
			paramPeak = CreateParameter("LcSlope Peak", 50, 5, 50, 5);
		}
		
		protected override void Execute()
		{
			bool reachedPeak = false, changedSign = false;
			int peakBar = -1, signBar = -1;
			int peakBars = paramPeak.ValueInt;
			int Length = paramLength.ValueInt;
			var LeavittProjection = LinearReg.Series(Close, Length);
			
			int LenConv = Convert.ToInt32(Math.Sqrt(Length)); // this is how EasyLanguage extracts the integer portion of a variable
			var LeavittConv = LinearReg.Series(LeavittProjection, LenConv); //inline function call
			
			// The slope follows the same pattern. However, step 2, which defines the line, is replaced by capturing the slope of that line.
			var LeavittConvSlope = LinearRegSlope.Series(LeavittProjection, LenConv);
			LeavittConvSlope.Description = "LeavittConvSlope";
			
			// The acceleration is simply the difference between two consecutive values of the slope.
			var LcAcceleration = LeavittConvSlope - (LeavittConvSlope>>1);			
			LcAcceleration.Description = "LcAcceleration";
			
			var LeavittConvAcc = new DataSeries(Bars,"LeavittConvAcc");
			LeavittConvAcc.Description = "LeavittConvAcc";
			
			HideVolume();
			ChartPane p3 = CreatePane(10,false,false);
			ChartPane p2 = CreatePane(30,true,false);
			ChartPane p1 = CreatePane(30,true,false);
			PlotSeries(p1, LcAcceleration, Color.Blue, LineStyle.Histogram, 5 );
			PlotSeries(p2, LeavittConvSlope, Color.Blue, LineStyle.Histogram, 5 );
			PlotSeries(p3, LeavittConvAcc, Color.Blue, LineStyle.Histogram, 5 );
			PlotSeries( p2, Highest.Series( LeavittConvSlope, peakBars ), Color.Blue, LineStyle.Dashed, 1 );
			
			for(int bar = 1; bar < Bars.Count; bar++)
			{
				SetSeriesBarColor( bar, LcAcceleration, 
					LcAccelerationbar > 0 ? Color.DarkGreen: Color.Red );
				
				SetSeriesBarColor( bar, LeavittConvSlope, 
					LeavittConvSlopebar > LeavittConvSlopebar-1 ? Color.DarkGreen: Color.Red );
				if( bar > 2 )
				{
					if (Closebar - 2 - 2*Closebar - 1 + Closebar > 0)
						LeavittConvAccbar = 1;
					else
						LeavittConvAccbar = -1;
				}
			}
			
			for(int bar = GetTradingLoopStartBar(1); bar < Bars.Count; bar++)
			{
				if (IsLastPositionActive)
				{
					//This exit was taken on the 30-minute chart precisely when
					//LcSlope reached its peak and LcAcceleration changed sign.
					
					var hb = HighestBar.Series( LeavittConvSlope, peakBars )bar;				
					if( !reachedPeak ) {
						if( bar == hb ) {
							SetBackgroundColor( bar, Color.FromArgb(50,Color.LightBlue));
							reachedPeak = true;
							peakBar = bar;
						}
					}
					
					if( reachedPeak ) {
						if( !changedSign ) {
							if( LcAccelerationbar < 0 ) {
								SetBackgroundColor( bar, Color.FromArgb(50,Color.LightSalmon));
								changedSign = true;
								signBar = bar;
							}
							
							if( changedSign ) {
								if( SellAtMarket(bar+1, LastPosition ) ) {
									reachedPeak = false;
									changedSign = false;
								}
							}								
						}						
					}
				}
				else
				{
					if( LeavittConvSlopebar > 0 && LcAccelerationbar > 0 )
						BuyAtMarket(bar+1);
				}
			}
		}
	}
}
Gene Geren (Eugene)
Wealth-Lab team