Syntax
public MSR(Bars bars, int period1, int period2, string description)
public static MSRSeries(Bars bars, int period1, int period2,)
Parameter Description
| bars | A Bars object | 
| period1 | First lookback period | 
| period2 | Second lookback period | 
Description
The MSR oscillator by David Varadi is a normalized support and resistance indicator that captured the typical or middle price over a short to intermediate time frame.
References
Calculation
The indicator is calculated using the following formula:
MSR = 
(10-day median of (H, L, C) – 20-day  MAX (H, L, C))/(20-day  MAX (H, L, C))
then take the 252-day percentrank of MSR or percentile ranking
Example
This example shows a primitive trading system based on the MSR indicator. Long trades are triggered when the MSR crosses above 0.5 and the system exits when the MSR crosses below 0.5:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Indicators;
namespace WealthLab.Strategies
{
	public class MSRStrategy : WealthScript
	{
		private StrategyParameter paramPer1;
		private StrategyParameter paramPer2;
		
		public MSRStrategy()
		{
			paramPer1 = CreateParameter("Period 1", 10, 2, 300, 1);
			paramPer2 = CreateParameter("Period 2", 20, 3, 300, 1);
		}
		
		protected override void Execute()
		{
			//MSR= (10-day median of (H, L, C) – 20-day  MAX (H, L, C))/(20-day  MAX (H, L, C))
			//then take the 252-day percentrank of MSR or percentile ranking
			
			int per1 = paramPer1.ValueInt;
			int per2 = paramPer2.ValueInt;
			
			MSR msr = MSR.Series( Bars,per1,per2 );
			
			ChartPane msrp = CreatePane( 30,true,true ); HideVolume();
			PlotSeries( msrp, msr, Color.Blue, LineStyle.Solid, 2 );
			
			PercentRank pr = PercentRank.Series(msr,252);
			PrcRank pc = PrcRank.Series(msr,252);
			
			ChartPane p = CreatePane( 30,true,true );
			PlotSeries( p, pr, Color.Red, LineStyle.Solid, 2 );
			PlotSeries( p, pc, Color.Blue, LineStyle.Solid, 2 );
			DrawHorzLine( p, 0.5, Color.Red, LineStyle.Dashed, 1 );
			for(int bar = 252; bar < Bars.Count; bar++)
			{
				if (IsLastPositionActive)
				{
					if( CrossUnder( bar, pr, 0.5d ) )
						SellAtMarket( bar+1, LastPosition );
				}
				else
				{
					if( CrossOver( bar, pr, 0.5d ) )
						BuyAtMarket( bar+1 );
				}
			}
		}
	}
}