Modified on 2011/07/25 09:05 by Eugene — Categorized as: Community Indicators


public MSR(Bars bars, int period1, int period2, string description)
public static MSRSeries(Bars bars, int period1, int period2,)

Parameter Description

barsA Bars object
period1First lookback period
period2Second lookback period


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.



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


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 ); } } } } }