Traders' Tip text
The slow relative volume index (SVSI) indicator created by Vitali Apirine is a momentum volume oscillator similar to its sibling SRSI in application and interpretation. Oscillating between 0 and 100, it becomes overbought after reaching 80 and oversold after dropping below 20. Signals can also be generated by looking for centerline crossovers and divergences.
Like RSI after which SVSI is modeled, SVSI could be put to use to screen for dips in established trends. The example trading system will focus on this ability. Here are its rules:
- Established long trend: close price is above a medium-term SMA
- Dip in the uptrend: SVSI gets below 50
- Enter long at market next bar
- Exit long on a trailing stop when the low price falls below the lowest low of N days
The trailing stop parameter (lowest low of N days) controls the trade duration: set it to a shorter period (5 bars) to profit from small rallies or to a longer period (e.g. 20-50 bars) to catch larger trends.
Figure 1. A characteristic trade in ^DJIA when the SVSI dipped below 50 in a strong uptrend.The SVSI indicator is installed under the TASC Magazine Indicators group after updating the TASCIndicators library to version 2015.07 or later, You can plot it on a chart or use it as an entry or exit condition in a Rule-based Strategy without having to program a line of code yourself.
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using TASCIndicators;
namespace WealthLab.Strategies
{
public class TASCTips201507 : WealthScript
{
private StrategyParameter paramSVSIPeriod;
private StrategyParameter paramSVSIWMAPeriod;
private StrategyParameter paramSVSIThreshold;
private StrategyParameter paramSMAPeriod;
private StrategyParameter paramExitChannel;
public TASCTips201507()
{
paramSVSIPeriod = CreateParameter("SVSI Period",6,6,30,2);
paramSVSIWMAPeriod = CreateParameter("SVSI WilderMA Period",14,8,52,4);
paramSVSIThreshold = CreateParameter("SVSI Threshold",50,40,90,5);
paramSMAPeriod = CreateParameter("SMA Period",40,10,100,10);
paramExitChannel = CreateParameter("Trailing Exit",20,5,50,5);
}
protected override void Execute()
{
int svsiThreshold = paramSVSIThreshold.ValueInt;
int smaPeriod = paramSMAPeriod.ValueInt;
int trailingExit = paramExitChannel.ValueInt;
SVSI svsi = SVSI.Series(Bars,paramSVSIPeriod.ValueInt,
paramSVSIWMAPeriod.ValueInt);
SMA sma = SMA.Series(Close,smaPeriod);
ChartPane paneSVSI1 = CreatePane(40,true,true);
PlotSeries(PricePane,sma,Color.MediumVioletRed,LineStyle.Solid,1);
PlotSeries(paneSVSI1,svsi,Color.FromArgb(255,255,128,0),LineStyle.Solid,2);
DrawHorzLine(paneSVSI1,50,Color.DodgerBlue,LineStyle.Dashed,2);
for(int bar = GetTradingLoopStartBar(1); bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
SellAtTrailingStop(bar+1,LastPosition,
Lowest.Series(Low,trailingExit)[bar]);
}
else
{
if( Close[bar] > sma[bar] &&
svsi[bar] < svsiThreshold )
BuyAtMarket(bar+1);
}
}
}
}
}
Eugene
Wealth-Lab team
www.wealth-lab.com