public class SpreadOscillator : Indicator
{
private string firstInstrument = @"ES 12-15";
private string secondInstrument = @"NQ 12-15";
private int maPeriod = 100;
private int devMult = 3;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Shows the current spread between two symbols and its deviation channel. TASC October 2013";
Name = "SpreadOscillator";
Calculate = Calculate.OnBarClose;
IsOverlay = false;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = true;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
AddPlot(new Gui.Stroke (Brushes.DimGray, Gui.DashStyleHelper.Solid, 2), PlotStyle.Line, "Spread");
AddPlot(new Gui.Stroke (Brushes.DarkOrange, Gui.DashStyleHelper.Solid, 2), PlotStyle.Line,"SMAMid");
AddPlot(new Gui.Stroke (Brushes.DarkBlue, Gui.DashStyleHelper.DashDotDot, 2), PlotStyle.Line,"Upper");
AddPlot(new Gui.Stroke (Brushes.DarkBlue, Gui.DashStyleHelper.DashDotDot, 2), PlotStyle.Line,"Lower");
}
else if (State == State.Configure)
{
AddDataSeries(FirstInstrument, Data.BarsPeriodType.Minute, BarsPeriod.Value, Data.MarketDataType.Last);
AddDataSeries(SecondInstrument, Data.BarsPeriodType.Minute, BarsPeriod.Value, Data.MarketDataType.Last);
}
}
protected override void OnBarUpdate()
{
if (CurrentBars[0] < BarsRequiredToPlot || CurrentBars[1] < BarsRequiredToPlot || CurrentBars[2] < BarsRequiredToPlot)
return;
double FirstValue = (Closes[1][0] * Instruments[1].MasterInstrument.PointValue)-(Closes[1][1] * Instruments[1].MasterInstrument.PointValue);
double SecondValue = (Closes[2][0] * Instruments[2].MasterInstrument.PointValue)-(Closes[2][1] * Instruments[2].MasterInstrument.PointValue);
Spread[0] = (FirstValue)-(SecondValue) ;
SMAMid[0] = (SMA(Spread, MAPeriod)[0]);
Upper[0] = (SMAMid[0] + DevMult * StdDev(Spread, MAPeriod)[0]);
Lower[0] = (SMAMid[0] - DevMult * StdDev(Spread, MAPeriod)[0]);
}
Comment