#region Using declarations using NinjaTrader.Cbi; using NinjaTrader.NinjaScript.Indicators; using System; #endregion namespace NinjaTrader.NinjaScript.Strategies { public class TwoPeriodRSI : Strategy { private SMA longTermTrend; private SMA shortTermTrend; 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) { longTermTrend = SMA(200); shortTermTrend = SMA(5); rsi = RSI(2, 1); } } protected override void OnBarUpdate() { if (CurrentBar < 200) return; // Entries int quantity = (int)Math.Floor(1000000 / Close[0]); if (Close[0] > longTermTrend[0] && rsi[0] < 5) { if (Position.MarketPosition != MarketPosition.Long) EnterLong(quantity); } else if (Close[0] < longTermTrend[0] && rsi[0] > 95) { if (Position.MarketPosition != MarketPosition.Short) EnterShort(quantity); } // Exits if (Position.MarketPosition == MarketPosition.Long && Close[0] > shortTermTrend[0]) ExitLong(); else if (Position.MarketPosition == MarketPosition.Short && Close[0] < shortTermTrend[0]) ExitShort(); } public override string DisplayName { get { return Name; } } } }