#region Using declarations
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml.Serialization;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Gui.SuperDom;
using NinjaTrader.Gui.Tools;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.Indicators;
using NinjaTrader.NinjaScript.DrawingTools;
namespace NinjaTrader.NinjaScript.Strategies
public class RSIScalpTrailingStop : Strategy
public int Trail_Trigger { get; set; }
public int Trail_Size { get; set; }
public int Trail_Frequency { get; set; }
public int TicksBetweenTrades { get; set; }
public int Trail_StopLossTicks { get; set; }
public int Trail_ProfitTicks { get; set; }
private double trailingStopPrice;
private int ticksSinceLastTrade;
private double trailingProfitStopPrice;
private double ExpectedProfit;
public int TP { get; set; }
public int SL { get; set; }
public int LotSize { get; set; }
public int RSI55UP { get; set; }
public int RSI50Down { get; set; }
protected override void OnStateChange()
if (State == State.SetDefaults)
Description = @"Enter the description for your new custom Strategy here.";
Name = "RSIScalpTrailingStop";
Calculate = Calculate.OnEachTick;
EntryHandling = EntryHandling.AllEntries;
IsExitOnSessionCloseStrategy = true;
ExitOnSessionCloseSeconds = 30;
IsFillLimitOnTouch = false;
MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
OrderFillResolution = OrderFillResolution.Standard;
StartBehavior = StartBehavior.WaitUntilFlat;
TimeInForce = TimeInForce.Gtc;
RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
StopTargetHandling = StopTargetHandling.PerEntryExecution;
BarsRequiredToTrade = 20;
Trail_StopLossTicks = 10;
else if (State == State.DataLoaded)
SetProfitTarget("", CalculationMode.Ticks, TP);
SetStopLoss("", CalculationMode.Ticks, SL, false);
ExpectedProfit = TP * TickSize;
protected override void OnBarUpdate()
if (CrossAbove(rsi.Default, RSI55UP, 1) && ticksSinceLastTrade >= TicksBetweenTrades)
SetStopLoss("", CalculationMode.Price, Low[0] - (Trail_Size * TickSize), false);
trailingStopPrice = High[0] - (Trail_Trigger * TickSize);
trailingProfitStopPrice = Close[0] + (Trail_ProfitTicks * TickSize);
BackBrush = Brushes.MediumSeaGreen;
if (CrossBelow(rsi.Default, RSI50Down, 1) && ticksSinceLastTrade >= TicksBetweenTrades)
SetStopLoss("", CalculationMode.Price, Low[0] + (Trail_Size * TickSize), false);
trailingStopPrice = High[0] - (Trail_Trigger * TickSize);
trailingProfitStopPrice = Close[0] + (Trail_ProfitTicks * TickSize);
BackBrush = Brushes.Goldenrod;
if (Position.MarketPosition == MarketPosition.Long && Close[0] > trailingProfitStopPrice)
trailingProfitStopPrice = Close[0] + (Trail_ProfitTicks * TickSize);
SetProfitTarget("", CalculationMode.Price, trailingProfitStopPrice);
else if (Position.MarketPosition == MarketPosition.Short && Close[0] < trailingProfitStopPrice)
trailingProfitStopPrice = Close[0] - (Trail_ProfitTicks * TickSize);
SetProfitTarget("", CalculationMode.Price, trailingProfitStopPrice);
if (ticksSinceLastTrade % Trail_Frequency == 0)
if (Position.MarketPosition == MarketPosition.Long)
SetStopLoss("", CalculationMode.Price, trailingStopPrice, false);
else if (Position.MarketPosition == MarketPosition.Short)
SetStopLoss("", CalculationMode.Price, trailingStopPrice, false);
if (Position.MarketPosition == MarketPosition.Long && Close[0] >= (ExpectedProfit * 0.9))
double newProfitTarget = trailingProfitStopPrice + (Trail_ProfitTicks * TickSize);
SetProfitTarget("", CalculationMode.Price, newProfitTarget);
ExpectedProfit = newProfitTarget - trailingProfitStopPrice;
else if (Position.MarketPosition == MarketPosition.Short && Close[0] <= (ExpectedProfit * 0.9))
double newProfitTarget = trailingProfitStopPrice - (Trail_ProfitTicks * TickSize);
SetProfitTarget("", CalculationMode.Price, newProfitTarget);
ExpectedProfit = trailingProfitStopPrice - newProfitTarget;