**Syntax**

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

**Parameter Description**

*ds* | A DataSeries to apply Derivative Oscillator to |

*periodRSI* | Period of the RSI |

*periodEMA1* | Period for the EMA to that smooths the RSI |

*periodEMA2* | Shorter period EMA to smooth the EMA of RSI |

*periodSMA* | Period for the SMA that smooths the double-smoothed RSI |

**Description**

The Derivative Oscillator created by Constance Brown is a triple smoothed RSI that incorporates two EMAs and one SMA. It was specifically developed to:

- resolve problems associated with complex market corrections where data becomes choppy and congested.
- reentering when there is a very strong trend.

**Calculation**

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.

**Reference**

**Example**

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