Managed EMA crossover Strategy
A single-file NinjaScript Strategy example with explicit parameters, signal names, and fixed protective orders.
using System;
using System.ComponentModel.DataAnnotations;
using NinjaTrader.Cbi;
using NinjaTrader.NinjaScript;
using NinjaTrader.NinjaScript.Indicators;
namespace NinjaTrader.NinjaScript.Strategies
{
public class ManagedEmaCrossStrategy : Strategy
{
[NinjaScriptProperty]
[Range(1, 200)]
[Display(Name = "Fast period", GroupName = "Parameters", Order = 0)]
public int FastPeriod { get; set; }
[NinjaScriptProperty]
[Range(2, 400)]
[Display(Name = "Slow period", GroupName = "Parameters", Order = 1)]
public int SlowPeriod { get; set; }
[NinjaScriptProperty]
[Range(1, 200)]
[Display(Name = "Stop ticks", GroupName = "Risk", Order = 2)]
public int StopTicks { get; set; }
[NinjaScriptProperty]
[Range(1, 400)]
[Display(Name = "Target ticks", GroupName = "Risk", Order = 3)]
public int TargetTicks { get; set; }
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "ManagedEmaCrossStrategy";
Calculate = Calculate.OnBarClose;
BarsRequiredToTrade = 50;
EntriesPerDirection = 1;
FastPeriod = 10;
SlowPeriod = 30;
StopTicks = 12;
TargetTicks = 24;
}
else if (State == State.Configure)
{
SetStopLoss("LongEntry", CalculationMode.Ticks, StopTicks, false);
SetProfitTarget("LongEntry", CalculationMode.Ticks, TargetTicks);
SetStopLoss("ShortEntry", CalculationMode.Ticks, StopTicks, false);
SetProfitTarget("ShortEntry", CalculationMode.Ticks, TargetTicks);
}
}
protected override void OnBarUpdate()
{
if (CurrentBar < Math.Max(BarsRequiredToTrade, SlowPeriod))
return;
if (Position.MarketPosition == MarketPosition.Flat)
{
if (CrossAbove(EMA(FastPeriod), EMA(SlowPeriod), 1))
EnterLong(1, "LongEntry");
else if (CrossBelow(EMA(FastPeriod), EMA(SlowPeriod), 1))
EnterShort(1, "ShortEntry");
}
}
}
}