George’s EasyLanguage BarsSince Function – How Many Bars Since?

BarsSince Function in EasyLanguage

Have you ever wondered how many bars have transpired since a certain condition was met?  Some platforms provide this capability:

If ExitFlag and (c crosses above average within 3 bars) then

TradeStation provides the MRO (Most Recent Occurrence) function that provides a very similar capability.  The only problem with this function is that it returns a -1 if the criteria are not met within the user provided lookback window.  If you say:

myBarsSinceCond = MRO(c crosses average(c,200),20,1) < 3

And c hasn’t crossed the 200-day moving average within the past twenty days the condition is still set to true because the function returns a -1.

I have created a function named BarsSince and you can set the false value to any value you wish.  In the aforementioned example, you would want the function to return a large number so the function would provide the correct solution.  Here’s how I did it:

inputs: 
	Test( truefalseseries ), 
	Length( numericsimple ), 
	Instance( numericsimple ) , { 0 < Instance <= Length}
	FalseReturnValue(numericsimple); {Return value if not found in length window}
	 
value1 = RecentOcc( Test, Length, Instance, 1 ) ;
If value1 = -1 then 
	BarsSince = FalseReturnValue
Else
	BarsSince = value1;
BarsSince Function Source Code

And here’s a strategy that uses the function:

inputs: profTarg$(2000),protStop$(1000),
rsiOBVal(60),rsiOSVal(40),slowAvgLen(100),
fastAvgLen(9),rsiLen(14),barsSinceMax(3);

Value1 = BarsSince(rsi(c,rsiLen) crosses above rsiOSVal,rsiLen,1,999);
Value2 = BarsSince(rsi(c,rsiLen) crosses below rsiOBVal,rsiLen,1,999);

If c > average(c, slowAvgLen) and c < average(c,fastAvgLen) and Value1 <barsSinceMax then buy next bar at open;

If c < average(c, slowAvgLen) and c > average(c,fastAvgLen) and Value2 <barsSinceMax then sellshort next bar at open;

setStopLoss(protStop$);
setProfitTarget(profTarg$)
Strategy Utilizing BarsSince Function

The function requires four arguments:

  1. The condition that is being tested [e.g.  rsi > crosses above 30]
  2. The lookback window [rsiLen – 14 bars in this case]
  3. Which occurrence [1 – most recent; 2- next most recent; etc…]
  4. False return value [999 in this case; if condition is not met in time]

A Simple Mean Reversion Using the Function:

Here are the results of this simple system utilizing the function.

Optimization Results:

I came up with this curve through a Genetic Optimization:

The BarsSince function adds flexibility or fuzziness when you want to test a condition but want to allow it to have a day (bar) or two tolerance.  In a more in-depth analysis, the best results very rarely occurred on the day the RSI crossed a boundary.   Email me with questions of course.

 

 

Please follow and like us:

Leave a Reply