Derivative Oscillator

Modified on 2012/12/31 07:23 by Eugene — Categorized as: Community Indicators


DataSeries DerivativeOscillator (DataSeries ds, int periodRSI, int periodEMA1, int periodEMA2, int periodSMA)

Parameter Description

dsA DataSeries to apply Derivative Oscillator to
periodRSIPeriod of the RSI
periodEMA1Period for the EMA to that smooths the RSI
periodEMA2Shorter period EMA to smooth the EMA of RSI
periodSMAPeriod for the SMA that smooths the double-smoothed RSI


The Derivative Oscillator created by Constance Brown is a triple smoothed RSI that incorporates two EMAs and one SMA. It was specifically developed to:
  1. resolve problems associated with complex market corrections where data becomes choppy and congested.
  2. reentering when there is a very strong trend.


The oscillator uses a 14-period RSI. The RSI is then double smoothed with exponential moving averages. The default settings for the smoothing periods are 5 and 3. In a second step a signal line is generated from the smoothed RSI by calculating a simple moving average with a period of 9. The Derivative Oscillator is calculated as the difference between the smoothed RSI and the signal line and displayed as histogram.



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 DerivativeOscDemo : WealthScript { private StrategyParameter paramPeriodRSI; private StrategyParameter paramPeriod1; private StrategyParameter paramPeriod2; private StrategyParameter paramPeriod3; public DerivativeOscDemo() { paramPeriodRSI = CreateParameter("RSI Period", 14, 2, 30, 1); paramPeriod1 = CreateParameter("EMA Period 1", 5, 2, 20, 1); paramPeriod2 = CreateParameter("EMA Period 2", 3, 2, 10, 1); paramPeriod3 = CreateParameter("SMA Period", 9, 2, 20, 1); } protected override void Execute() { int perRSI = paramPeriodRSI.ValueInt; int perEMA1 = paramPeriod1.ValueInt; int perEMA2 = paramPeriod2.ValueInt; int perSMA = paramPeriod3.ValueInt; DerivativeOscillator derivOsc = DerivativeOscillator.Series( Close,perRSI,perEMA1,perEMA2,perSMA );

for(int bar = GetTradingLoopStartBar(derivOsc.FirstValidValue * 3); bar < Bars.Count; bar++) { if (IsLastPositionActive) { if( CrossUnder( bar, derivOsc, 0 ) ) SellAtMarket( bar+1, LastPosition ); } else { if( CrossOver( bar, derivOsc, 0 ) ) BuyAtMarket( bar+1 ); } } ChartPane doPane = CreatePane( 40,true,true ); PlotSeries( doPane, derivOsc, Color.Navy, LineStyle.Histogram, 4 ); HideVolume(); } } }