#region Using declarations using NinjaTrader.Cbi; using NinjaTrader.NinjaScript.Indicators; using System; #endregion namespace NinjaTrader.NinjaScript.Strategies { public class TwoPeriodRSI : Strategy { private SMA sma200; private SMA sma5; private RSI rsi; protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Taken from chapter 9 of Short Term Trading Strategies That Work"; Name = "2 Period RSI"; Calculate = Calculate.OnBarClose; EntriesPerDirection = 1; EntryHandling = EntryHandling.AllEntries; IsExitOnSessionCloseStrategy = true; ExitOnSessionCloseSeconds = 30; IsFillLimitOnTouch = false; MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix; OrderFillResolution = OrderFillResolution.Standard; Slippage = 0; StartBehavior = StartBehavior.WaitUntilFlat; TimeInForce = TimeInForce.Gtc; TraceOrders = false; RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose; StopTargetHandling = StopTargetHandling.PerEntryExecution; BarsRequiredToTrade = 20; IsInstantiatedOnEachOptimizationIteration = true; } else if (State == State.DataLoaded) { sma200 = SMA(200); sma5 = SMA(5); rsi = RSI(2, 1); } } protected override void OnBarUpdate() { if (CurrentBar < 200) return; double sma200Value = sma200[0]; double sma5Value = sma5[0]; // Entries int quantity = (int)Math.Floor(1000000 / Close[0]); if (Close[0] > sma200Value && rsi[0] < 5) { if (Position.MarketPosition != MarketPosition.Long) EnterLong(quantity); } else if (Close[0] < sma200Value && rsi[0] > 95) { if (Position.MarketPosition != MarketPosition.Short) EnterShort(quantity); } // Exits if (Position.MarketPosition == MarketPosition.Long && Close[0] > sma5Value) ExitLong(); else if (Position.MarketPosition == MarketPosition.Short && Close[0] < sma5Value) ExitShort(); } public override string DisplayName { get { return Name; } } } }