Problem
You're trying to create a trade trigger for a security that crosses under and SMA
twice in one month so you short it after the
second cross under in one month period.
Solution
Here's how to count crossunders by calendar month:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace WealthLab.Strategies
{
public class SecondCross : WealthScript
{
protected override void Execute()
{
int crossesThisMonth = 0;
DataSeries crossNum = new DataSeries( Bars, "Crossunder count" );
SMA sma = SMA.Series( Close,50 );
PlotSeries( PricePane, sma, Color.Blue, LineStyle.Solid, 1 );
for(int bar = sma.FirstValidValue; bar < Bars.Count; bar++)
{
bool thisMonth = ( Date[bar].Month == Date[bar-1].Month );
if( thisMonth )
{
if( CrossUnder( bar, Close, sma ) )
{
SetBackgroundColor( bar, Color.FromArgb( 60, Color.Orange ) );
crossesThisMonth++;
}
}
else
crossesThisMonth = 0;
crossNum[bar] = crossesThisMonth;
}
HideVolume();
ChartPane cPane = CreatePane( 30, true, true );
PlotSeries( cPane, crossNum, Color.Red, LineStyle.Histogram, 3 );
for(int bar = sma.FirstValidValue; bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
//code your exit rules here
CoverAtMarket( bar+1, LastPosition );
}
else
{
if( ( crossNum[bar] == 2 ) && CrossUnder( bar, Close, sma ) )
ShortAtMarket( bar+1 );
}
}
}
}
}
And here's how to count over that last rolling month (approx. 21 trading days):
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace WealthLab.Strategies
{
public class MyStrategy : WealthScript
{
protected override void Execute()
{
int period = 20;
DataSeries sma = SMA.Series(Close, period);
DataSeries cross = new DataSeries(Bars, "Crossing=1");
for(int bar = sma.FirstValidValue; bar < Bars.Count; bar++)
{
if (CrossUnder(bar, Close, sma))
{
cross[bar] = 1d;
}
}
// Now here's the indicator that counts the crossings for the last rolling month (21 days of trading)
DataSeries xingCount = Sum.Series(cross, 21);
xingCount.Description = "CrossUnder count in last month";
// Plots the count and sma
ChartPane cp = CreatePane(40, true, true);
PlotSeries(cp, xingCount, Color.Blue, LineStyle.Histogram, 2);
PlotSeries(PricePane, sma, Color.Green, LineStyle.Solid, 2);
for(int bar = 50; bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
/* Exit after N days */
Position p = LastPosition;
if ( bar+1 - p.EntryBar >= 10 )
CoverAtMarket( bar+1, p, "Timed" );
}
else
{
if( Close[bar] < SMA.Series( Close,50 )[bar] )
if( ( xingCount[bar] >= 2 ) && CrossUnder( bar, Close, sma ) )
ShortAtMarket( bar+1 );
}
}
}
}
}