Log in to see Cloud of Tags

Wealth-Lab Wiki

TASC 2010-10 | Smooted RSI Inverse Fisher (Vervoort)

RSS

Traders' Tip text

Because of the interesting tail-recursion type of construction of the SVE Inverse Fisher RSI indicator, we included it with this month’s script. For the often-neglected bears out there, our WealthScript code includes a simple shorting Strategy which triggers and entry when a) SVE_IF_RSI crosses under 70, and, b) price negatively diverges with the ARSI. We employed rudimentary divergence detection that keys off the two ARSI peaks just prior to the SVE_IF_RSI trigger. The technique compares the relative price peaks corresponding to the ARSI peak bars, and, if a negative divergence is detected the script draws in the divergence lines and initiates a short Position. For simplicity, we exit the Position after 7 bars.


Image

Figure 1. While the strategy is not expected to work so well on all stocks, the four most-recent short trades for Alcoa would have worked out quite well.


WealthScript Code (C#)

using System; using System.Collections.Generic; using System.Text; using System.Drawing; using WealthLab; using WealthLab.Indicators; using TASCIndicators;

namespace WealthLab.Strategies { public class ShortDivergence : WealthScript { StrategyParameter _rsiPeriod; StrategyParameter _emaPeriod; StrategyParameter _arsiPeriod; public ShortDivergence() { _arsiPeriod = CreateParameter("ARSI_Period", 10, 2, 200, 20); _rsiPeriod = CreateParameter("RSI Period", 4, 2, 30, 1); _emaPeriod = CreateParameter("EMA Period", 4, 2, 10, 1); }

public DataSeries SVEInvFisherRSI(int rsiPeriod, int emaPeriod) { DataSeries rbw = WMA.Series(Close, 2); DataSeries sve = 5 * rbw; for (int w = 4; w >= -4 ; w--) { rbw = WMA.Series(rbw, 2); if (w > 1 ) sve += (w * rbw); else sve += rbw; } sve /= 20d; sve.Description = "SVE Rainbow"; //PlotSeries(PricePane, sve, Color.Blue, LineStyle.Solid, 2); DataSeries x = 0.1 * (RSI.Series(sve, rsiPeriod) - 50); DataSeries e1 = EMA.Series(x, emaPeriod, EMACalculation.Modern); DataSeries e2 = EMA.Series(e1, emaPeriod, EMACalculation.Modern); DataSeries z1ema = e1 + (e1 - e2); z1ema = (InverseFisher.Series(z1ema) + 1) * 50; z1ema.Description = "SVE_IF_RSI(" + rsiPeriod + "," + emaPeriod + ")"; return z1ema; } protected override void Execute() { HideVolume(); const double d = 1.01; int perRSI = _rsiPeriod.ValueInt; int perEMA = _emaPeriod.ValueInt; /* Create and plot indicators */ DataSeries arsi = ARSI.Series(Close, _arsiPeriod.ValueInt); ChartPane rsiPane = CreatePane(40, true, true); PlotSeries(rsiPane, arsi, Color.Red, LineStyle.Solid, 2); DataSeries invfish = SVEInvFisherRSI(perRSI, perEMA); ChartPane cp = CreatePane(40, true, true); PlotSeries(cp, invfish, Color.Navy, LineStyle.Solid, 2); /* Trading loop */ for (int bar = 3 * GetTradingLoopStartBar(4) ; bar < Bars.Count; bar++) { if (IsLastPositionActive) { Position p = LastPosition; if (bar + 1 - p.EntryBar > 6) ExitAtMarket(bar + 1, p, "Time-based"); } else if (CrossUnder(bar, invfish, 70)) { // check the last two arsi peaks for negative divergence with price int pb1 = (int)PeakBar.Value(bar, arsi, 20, PeakTroughMode.Value); if (pb1 == -1) continue; int pb2 = (int)PeakBar.Value(pb1, arsi, 20, PeakTroughMode.Value); if (pb2 == -1) continue; if ( Math.Sign(arsipb1 - arsipb2) == -1 && Math.Sign(Highpb1 - Highpb2) == 1) { SetBackgroundColor(bar, Color.FromArgb(50, Color.Green)); DrawLine(rsiPane, pb2, arsipb2, pb1, arsipb1, Color.Blue, LineStyle.Solid, 2); DrawLine(PricePane, pb2, Highpb2 * d, pb1, Highpb1 * d, Color.Blue, LineStyle.Solid, 2); ShortAtMarket(bar + 1); } } } } } }

Important Disclaimer: The information provided by Wealth-Lab is strictly for informational purposes and is not to be construed as advice or solicitation to buy or sell any security.  The owner of Wealth-Lab.com assumes no liability resulting from the use of the material contained herein for investment purposes. By using this web site, you agree to the terms of this disclaimer and our Terms of Use.


ScrewTurn Wiki. Some of the icons created by FamFamFam.