Managed NinjaScript Scalping Strategy
A complete single-file NinjaTrader 8 scalping strategy featuring fast EMA crossover signals and managed tick-based profit targets and stop losses.
using System;
using System.ComponentModel.DataAnnotations;
using NinjaTrader.Cbi;
using NinjaTrader.NinjaScript;
using NinjaTrader.NinjaScript.Indicators;
namespace NinjaTrader.NinjaScript.Strategies
{
public class ScalpingStrategy : Strategy
{
[NinjaScriptProperty]
[Range(1, 100)]
[Display(Name = "Fast EMA Period", GroupName = "Parameters", Order = 0)]
public int FastEmaPeriod { get; set; }
[NinjaScriptProperty]
[Range(2, 200)]
[Display(Name = "Slow EMA Period", GroupName = "Parameters", Order = 1)]
public int SlowEmaPeriod { get; set; }
[NinjaScriptProperty]
[Range(1, 100)]
[Display(Name = "Profit Target (Ticks)", GroupName = "Risk", Order = 2)]
public int TargetTicks { get; set; }
[NinjaScriptProperty]
[Range(1, 100)]
[Display(Name = "Stop Loss (Ticks)", GroupName = "Risk", Order = 3)]
public int StopLossTicks { get; set; }
private EMA fastEma;
private EMA slowEma;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "ScalpingStrategy";
Description = "Fast momentum scalping strategy with managed tick-based brackets.";
Calculate = Calculate.OnBarClose;
EntriesPerDirection = 1;
EntryHandling = EntryHandling.AllEntries;
IsExitOnSessionCloseStrategy = true;
ExitOnSessionCloseSeconds = 30;
IsFillLimitOnTouch = false;
TraceOrders = false;
FastEmaPeriod = 9;
SlowEmaPeriod = 21;
TargetTicks = 8;
StopLossTicks = 12;
}
else if (State == State.DataLoaded)
{
fastEma = EMA(FastEmaPeriod);
slowEma = EMA(SlowEmaPeriod);
SetProfitTarget("LongScalp", CalculationMode.Ticks, TargetTicks);
SetStopLoss("LongScalp", CalculationMode.Ticks, StopLossTicks, false);
SetProfitTarget("ShortScalp", CalculationMode.Ticks, TargetTicks);
SetStopLoss("ShortScalp", CalculationMode.Ticks, StopLossTicks, false);
}
}
protected override void OnBarUpdate()
{
if (CurrentBar < Math.Max(FastEmaPeriod, SlowEmaPeriod))
return;
if (Position.MarketPosition == MarketPosition.Flat)
{
if (CrossAbove(fastEma, slowEma, 1))
{
EnterLong("LongScalp");
}
else if (CrossBelow(fastEma, slowEma, 1))
{
EnterShort("ShortScalp");
}
}
}
}
}