- Background reading: https://algofuturestrader.com/create-your-own-rules-in-your-own-ninjatrader-scripts-and-simply-inject-them-into-the-algo-trade-entry-module/
- Using custom signals to inject signals Is the new way and best way
- Click here for Discord Forum link:
1) Add a reference to the NinjaTrader Editor for the file "\Documents\NinjaTrader 8\bin\CustomATS.NinjaTrader8.AlgoFuturesTrader.dll"
2) download and save the Algo Entry template "AFTCustomSignal001" to:
d:\Users\Trader\Documents\NinjaTrader 8\MicroTrends\templates\MarketAnalyzer\MTLTradeEntry\AFTCustomSignal001
3) Workspace attached "AFT-CustomSignal-001" - set for playback simply change the account in the market analyzer columns to your sim or demo account - save to
\Documents\NinjaTrader 8\workspaces\AFT-CustomSignal-001
CODE EXAMPLE
#region Using declarations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Gui;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Gui.SuperDom;
using NinjaTrader.Gui.Tools;
using NinjaTrader.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.DrawingTools;
using MicroTrends.NT8;
#endregion
//This namespace holds Indicators in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Indicators
{
public class CustomSignal001 : Indicator
{
private SMA smaFast;
private SMA smaSlow;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"CustomSignal001 Send Trade Signals into the AFT Realtime Trading Signal Q for execution via the AFT Algo Entry - Custom Trading Signal module.";
Name = "CustomSignal001";
Calculate = Calculate.OnBarClose;
IsOverlay = true;
DisplayInDataBox = false;
DrawOnPricePanel = false;
DrawHorizontalGridLines = false;
DrawVerticalGridLines = false;
PaintPriceMarkers = false;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
//Disable this property if your indicator requires custom values that cumulate with each new market data event.
//See Help Guide for additional information.
IsSuspendedWhileInactive = false;
Fast = 10;
Slow = 25;
TradeSignalChannel="001";
TradeSignalMode=1;
AddPlot(Brushes.Blue, "fast");
AddPlot(Brushes.Goldenrod, "Slow");
}
else if (State == State.Configure)
{
}
else if (State == State.DataLoaded)
{
smaFast = SMA(Fast);
Values[0]=smaFast.Value;
smaSlow = SMA(Slow);
Values[1]=smaSlow.Value;
}
}
protected override void OnBarUpdate()
{
if (CurrentBar < 1) return;
try{
if (IsTradeSignalLong(TradeSignalMode))
{
Draw.ArrowUp(this,CurrentBar.ToString(),false,0,Close[0],Brushes.LimeGreen);
if(State!=State.Realtime)return;
//create a long signal
MicroTrends.NT8.AlgoTradingSignal signal = new MicroTrends.NT8.AlgoTradingSignal();
signal.InstrumentName = Instrument.MasterInstrument.Name;
signal.TradeSignalChannel = TradeSignalChannel;
signal.AFTSignalActionDateTime = Time[0];
signal.AFTSignalAction = AFTSignalAction.Buy;
MicroTrends.NT8.AlgoTradingSignalServices.Submit(signal);
Print("Send:" + signal.ToString());
}
else if (IsTradeSignalShort(TradeSignalMode))
{
Draw.ArrowDown(this,CurrentBar.ToString(),false,0,Close[0],Brushes.DarkGray);
if(State!=State.Realtime)return;
//create a short signal
MicroTrends.NT8.AlgoTradingSignal signal = new MicroTrends.NT8.AlgoTradingSignal();
signal.InstrumentName = Instrument.MasterInstrument.Name;
signal.TradeSignalChannel = TradeSignalChannel;
signal.AFTSignalActionDateTime = Time[0];
signal.AFTSignalAction = AFTSignalAction.Sell;
MicroTrends.NT8.AlgoTradingSignalServices.Submit(signal);
Print("Send:" + signal.ToString());
}
}
catch(Exception ex)
{
Print(ex.ToString());
}
//Add your custom indicator logic here.
}
private bool IsTradeSignalLong(int tradeSignalMode=1)
{
bool result=false;
if(tradeSignalMode==1)
result=CrossAbove(smaFast, smaSlow, 1);
return result;
}
private bool IsTradeSignalShort(int tradeSignalMode=1)
{
bool result=false;
if(tradeSignalMode==1)
result=CrossBelow(smaFast, smaSlow, 1);
return result;
}
[NinjaScriptProperty]
[Display(Name = "TradeSignalMode", Description = "TradeSignalMode: 1:Crossover, 2:MyRules", Order = 55, GroupName = "NinjaScriptStrategyParameters")]
public int TradeSignalMode { get;set; }
[NinjaScriptProperty]
[Display(Name = "TradeSignalChannel", Description = "TradeSignalChannel=001 default", Order = 55, GroupName = "NinjaScriptStrategyParameters")]
public string TradeSignalChannel { get;set; }
[Range(1, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "Fast", GroupName = "NinjaScriptStrategyParameters", Order = 0)]
public int Fast
{ get; set; }
[Range(1, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "Slow", GroupName = "NinjaScriptStrategyParameters", Order = 1)]
public int Slow
{ get; set; }
}
}