Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

Ninjatrader 8 – Button Trading OpenSource Code

7 min read

Here is the open-source code for building a simple button-based API call to the Algomojo Platform. Now one can use Ninjatrader 8 to build customized trading requirements using Algomojo API.

Requirements

Installing the Algomojo Arrow Bridge

Installing the Ninjascript Addon

Step 1: Download the Ninjascript Algomojo Button Addon

After you have downloaded 3rd Party Add-On, they can be imported from the NinjaTrader Control Center.

Step 2: From the Control Center window select the menu Tools > ImportNinjaScript Add-On… to open the “Import” dialog window as shown below

Step 3: Select the file Algomojo Buttons.zip you want to import

Step 4: Press the “Import” button

Ninjascript Code

#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;
#endregion

//This namespace holds Indicators in this folder and is required. Do not change it. 
namespace NinjaTrader.NinjaScript.Indicators
{
	public class Algomojo : Indicator
	{
		
        private string pricetype;
		private string amo;
        private double price;
        private int disclosed_quantity;
        private double trigger_price;
		
        
		private System.Windows.Controls.Button myBuyButton;
        private System.Windows.Controls.Button mySellButton;
		private System.Windows.Controls.Button myShortButton;
        private System.Windows.Controls.Button myCoverButton;
		private System.Windows.Controls.Button myExitAllButton;
        
        private System.Windows.Controls.Grid   myGrid;
		ExchangeEnumIndicator exchange = ExchangeEnumIndicator.NSE;
	    ProdTypeEnumIndicator product = ProdTypeEnumIndicator.MIS;
		BrokerCodeEnumIndicator broker = BrokerCodeEnumIndicator.an;
		SplitOrderEnumIndicator splitorder = SplitOrderEnumIndicator.NO;
		
		public string PlaceOrder(string action, int orderqty)
		{
			 Type algo = Type.GetTypeFromProgID("AMAMIBRIDGE.main");
			 if(algo == null) throw new InvalidOperationException(
    			"Invalid prog-id: " + "AMAMIBRIDGE.main");
			 dynamic algomojo = Activator.CreateInstance(algo);
			 
			 string api_data = "{ \"broker\": \""+broker.ToString()+"\",   \"strategy\":\""+strategy+"\",  \"exchange\":\""+exchange.ToString()+"\",         \"symbol\":\""+symbol+"\",       \"action\":\""+action+"\",       \"product\":\""+product.ToString()+"\",          \"pricetype\":\""+pricetype.ToString()+"\",       \"quantity\":\""+orderqty.ToString()+"\",           \"price\":\""+price.ToString()+"\",      \"disclosed_quantity\":\""+disclosed_quantity.ToString()+"\",         \"trigger_price\":\""+trigger_price.ToString()+"\",     \"amo\":\""+amo+"\",    \"splitorder\":\""+splitorder.ToString()+"\",   \"split_quantity\":\""+split_quantity.ToString()+"\"   }"; 
			
			 Log("API Request : "+api_data, LogLevel.Information);
					  
			 string result = algomojo.AMDispatcher(apikey,apisecret,"PlaceOrder",api_data,"am",version);  
			 Log("API Response : "+result, LogLevel.Information);
			 PlaySound(NinjaTrader.Core.Globals.InstallDir + @"\sounds\Alert4.wav");
			 return result;
			
		}
		
		
		public string ExitOrder(string action, int position_size)
		{
			 Type algo = Type.GetTypeFromProgID("AMAMIBRIDGE.main");
			 if(algo == null) throw new InvalidOperationException(
    			"Invalid prog-id: " + "AMAMIBRIDGE.main");
			 dynamic algomojo = Activator.CreateInstance(algo);
			 
			 string api_data = "{ \"broker\": \""+broker.ToString()+"\",   \"strategy\":\""+strategy+"\",  \"exchange\":\""+exchange.ToString()+"\",         \"symbol\":\""+symbol+"\",       \"action\":\""+action+"\",       \"product\":\""+product.ToString()+"\",          \"pricetype\":\""+pricetype.ToString()+"\",       \"quantity\":\""+"0"+"\",           \"price\":\""+price.ToString()+"\", 	\"position_size\":\""+position_size.ToString()+"\",     \"disclosed_quantity\":\""+disclosed_quantity.ToString()+"\",         \"trigger_price\":\""+trigger_price.ToString()+"\",     \"amo\":\""+amo+"\",    \"splitorder\":\""+splitorder.ToString()+"\",   \"split_quantity\":\""+split_quantity.ToString()+"\"   }"; 
			
			 Log("API Request : "+api_data, LogLevel.Information);
					  
			 string result = algomojo.AMDispatcher(apikey,apisecret,"PlaceSmartOrder",api_data,"am",version);  
			 Log("API Response : "+result, LogLevel.Information);
			 PlaySound(NinjaTrader.Core.Globals.InstallDir + @"\sounds\Alert4.wav");
			 return result;
			
		}
		
		public string Squareoffall()
		{
			 Type algo = Type.GetTypeFromProgID("AMAMIBRIDGE.main");
			 if(algo == null) throw new InvalidOperationException(
    			"Invalid prog-id: " + "AMAMIBRIDGE.main");
			 dynamic algomojo = Activator.CreateInstance(algo);
			 
			 string api_data = "{ \"broker\": \""+broker.ToString()+"\"   }"; 
			
			 Log("API Request : "+api_data, LogLevel.Information);
					  
			 string result = algomojo.AMDispatcher(apikey,apisecret,"SquareOffAllPosition",api_data,"am",version);  
			 Log("API Request : "+result, LogLevel.Information);
			 PlaySound(NinjaTrader.Core.Globals.InstallDir + @"\sounds\Alert4.wav");
			 return result;
			
		}
		
			private void OnMyButtonClick(object sender, RoutedEventArgs rea)
			{
				  System.Windows.Controls.Button button = sender as System.Windows.Controls.Button;
				  
				  if(button.Name.Equals("MyBuyButton"))
				  {									 
						PlaceOrder("BUY",quantity);  
				  }
				
				  if(button.Name.Equals("MySellButton"))
				  {
						ExitOrder("SELL",0);
				  }
				  if(button.Name.Equals("MyCoverButton"))
				  {									 
						ExitOrder("BUY",0);  
				  }
				
				  if(button.Name.Equals("MyShortButton"))
				  {
						PlaceOrder("SELL",quantity);
				  }
				  if(button.Name.Equals("MyExitAllButton"))
				  {									 
						Squareoffall();  
				  }
				
				  
			
			}
		
		protected override void OnStateChange()
		{
			if (State == State.SetDefaults)
			{
				Description									= @"Place your orders from Ninjatrader Button Trading.";
				Name										= "Algomojo Button Trading";
				Calculate									= Calculate.OnBarClose;
				IsOverlay									= true;
				IsOverlay									= true;
				DisplayInDataBox							= true;
				DrawOnPricePanel							= true;
				DrawHorizontalGridLines						= true;
				DrawVerticalGridLines						= true;
				PaintPriceMarkers							= true;
				ScaleJustification							= NinjaTrader.Gui.Chart.ScaleJustification.Right;

				pricetype = "MARKET";
                
                strategy ="Ninjatrader 8";		
				apikey					="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
				apisecret               ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
				quantity = 1;
				version = "v1";
				symbol					="INFY-EQ";
				price 					= 0; 
				disclosed_quantity 		= 0;
				trigger_price 			= 0;
				amo 					= "NO";
				split_quantity      	= 1;
				
				 
			}
			else if (State == State.Configure)
			{
			}
			 else if (State == State.DataLoaded)
            {

            }
			else if(State==State.Historical)
			{
				ChartControl.Dispatcher.InvokeAsync((() =>
   			 {
        // Grid already exists
        if (UserControlCollection.Contains(myGrid))
          return;
        // Add a control grid which will host our custom buttons
        myGrid = new System.Windows.Controls.Grid
      	  {
          Name = "MyCustomGrid",
          // Align the control to the top right corner of the chart
          HorizontalAlignment = HorizontalAlignment.Left,
          VerticalAlignment = VerticalAlignment.Top,
        };
 
        // Define the two columns in the grid, one for each button
        System.Windows.Controls.ColumnDefinition column1 = new System.Windows.Controls.ColumnDefinition();
        System.Windows.Controls.ColumnDefinition column2 = new System.Windows.Controls.ColumnDefinition();
		  System.Windows.Controls.ColumnDefinition column3 = new System.Windows.Controls.ColumnDefinition();
		  System.Windows.Controls.ColumnDefinition column4 = new System.Windows.Controls.ColumnDefinition();
		  System.Windows.Controls.ColumnDefinition column5 = new System.Windows.Controls.ColumnDefinition();
 
        // Add the columns to the Grid
        myGrid.ColumnDefinitions.Add(column1);
        myGrid.ColumnDefinitions.Add(column2);
		myGrid.ColumnDefinitions.Add(column3);
		myGrid.ColumnDefinitions.Add(column4);
		myGrid.ColumnDefinitions.Add(column5);
 
        // Define the custom Buy Button control object
        myBuyButton = new System.Windows.Controls.Button
        {
          Name = "MyBuyButton",
          Content = "Long entry",
          Foreground = Brushes.White,
          Background = Brushes.Green
        };
		 mySellButton = new System.Windows.Controls.Button
        {
          Name = "MySellButton",
          Content = "Long Exit",
          Foreground = Brushes.White,
          Background = Brushes.Red
        };
		
		myShortButton = new System.Windows.Controls.Button
        {
          Name = "MyShortButton",
          Content = "Short entry",
          Foreground = Brushes.White,
          Background = Brushes.OrangeRed
        };
		myCoverButton = new System.Windows.Controls.Button
        {
          Name = "MyCoverButton",
          Content = "Short Exit",
          Foreground = Brushes.White,
          Background = Brushes.Goldenrod
        };
		
		myExitAllButton = new System.Windows.Controls.Button
        {
          Name = "MyExitAllButton",
          Content = "Squareoff All",
          Foreground = Brushes.White,
          Background = Brushes.Crimson
        };
		
		
        myBuyButton.Click += OnMyButtonClick;
	    mySellButton.Click += OnMyButtonClick;
		myShortButton.Click += OnMyButtonClick;
	    myCoverButton.Click += OnMyButtonClick;
		myExitAllButton.Click += OnMyButtonClick;
	    
        System.Windows.Controls.Grid.SetColumn(myBuyButton, 0);
		System.Windows.Controls.Grid.SetColumn(mySellButton, 1);
		System.Windows.Controls.Grid.SetColumn(myShortButton, 2);
		System.Windows.Controls.Grid.SetColumn(myCoverButton, 3);
		System.Windows.Controls.Grid.SetColumn(myExitAllButton, 4);
		
        myGrid.Children.Add(myBuyButton);
	    myGrid.Children.Add(mySellButton);
		myGrid.Children.Add(myShortButton);
	    myGrid.Children.Add(myCoverButton);
		myGrid.Children.Add(myExitAllButton);
	    
        UserControlCollection.Add(myGrid);
 
    }));
  }
 
  else if (State == State.Terminated)
  {
    if (ChartControl == null)
        return;
    ChartControl.Dispatcher.InvokeAsync((() =>
    {
        if (myGrid != null)
        {
          if (myBuyButton != null)
          {
              myGrid.Children.Remove(myBuyButton);
              myBuyButton.Click -= OnMyButtonClick;
              myBuyButton = null;
          }
		   if (mySellButton != null)
          {
              myGrid.Children.Remove(mySellButton);
              mySellButton.Click -= OnMyButtonClick;
              mySellButton = null;
          }
		  if (myShortButton != null)
          {
              myGrid.Children.Remove(myShortButton);
              myShortButton.Click -= OnMyButtonClick;
              myShortButton = null;
          }
		   if (myCoverButton != null)
          {
              myGrid.Children.Remove(myCoverButton);
              myCoverButton.Click -= OnMyButtonClick;
              myCoverButton = null;
          }
		  if (myExitAllButton != null)
          {
              myGrid.Children.Remove(myExitAllButton);
              myExitAllButton.Click -= OnMyButtonClick;
              myExitAllButton = null;
          }
		  
        }
    }));
			}
        
		}

		protected override void OnBarUpdate()
		{
			//Add your custom indicator logic here.
			
		}
		
		public override string DisplayName
		{
			get { return Name; }
		}
		
        public enum ExchangeEnumIndicator
		 {
			 NSE,NFO,BSE,CDS,MCX
		 }
		 public enum ProdTypeEnumIndicator
		 {
			MIS,NRML,CNC
		 }
		 public enum BrokerCodeEnumIndicator
		 {
			 an,ab,fs,fy,tc,up,zb,ze
		 }
		 public enum SplitOrderEnumIndicator
		 {
			 NO,YES
		 }
		#region Properties
		 
		[Description("Property defined in Indicator")]
		 [Display(Name="Exchange", Order=6, GroupName="Parameters")]
		 public  NinjaTrader.NinjaScript.Indicators.Algomojo.ExchangeEnumIndicator
		 Exchange
		 {
		 get { return exchange; }
		 set { exchange = value; }
		 }
		 
	    [Description("Property defined in Indicator")]
		 [Display(Name="ProdType", Order=5, GroupName="Parameters")]
		 public  NinjaTrader.NinjaScript.Indicators.Algomojo.ProdTypeEnumIndicator
		 ProdType
		 {
		 get { return product; }
		 set { product = value; }
		 }
		 
		 [Description("Property defined in Indicator")]
		 [Display(Name="SplitOrder", Order=9, GroupName="Parameters")]
		 public  NinjaTrader.NinjaScript.Indicators.Algomojo.SplitOrderEnumIndicator
		 SplitOrder
		 {
		 get { return splitorder; }
		 set { splitorder = value; }
		 }
		 
		[NinjaScriptProperty]
		[Display(Name="Apikey", Description="Enter your Apikey here", Order=1, GroupName="Parameters")]
		public string apikey
		{ get; set; }

		[NinjaScriptProperty]
		[Display(Name="Apisecret", Description="Enter your Apisecret here", Order=2, GroupName="Parameters")]
		public string apisecret
		{ get; set; }
		
		[NinjaScriptProperty]
		[Display(Name="Broker", Description="Enter your Broker Shortcode", Order=3, GroupName="Parameters")]
		public  NinjaTrader.NinjaScript.Indicators.Algomojo.BrokerCodeEnumIndicator
		BrokerCode
		 {
		 get { return broker; }
		 set { broker = value; }
		 }
		 		 
			
		
		[NinjaScriptProperty]
		[Display(Name="Version", Description="Enter Algomojo API Version", Order=4, GroupName="Parameters")]
		public string version
		{ get; set; }
		
		[NinjaScriptProperty]
		[Display(Name="Strategy Name", Description="Enter your Strategy Name", Order=5, GroupName="Parameters")]
		public string strategy
		{ get; set; }

		[NinjaScriptProperty]
		[Display(Name="Symbol", Description="Enter Trading Symbol", Order=7, GroupName="Parameters")]
		public string symbol
		{ get; set; }

		[NinjaScriptProperty]
		[Range(1, int.MaxValue)]
		[Display(Name="Quantity", Order=8, GroupName="Parameters")]
		public int quantity
		{ get; set; }

		[NinjaScriptProperty]
		[Range(0, int.MaxValue)]
		[Display(Name="Split Quantity", Order=10,GroupName="Parameters")]
		public int split_quantity
		{ get; set; }

		
		#endregion

	}
}

#region NinjaScript generated code. Neither change nor remove.

namespace NinjaTrader.NinjaScript.Indicators
{
	public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
	{
		private Algomojo[] cacheAlgomojo;
		public Algomojo Algomojo(string apikey, string apisecret, NinjaTrader.NinjaScript.Indicators.Algomojo.BrokerCodeEnumIndicator brokerCode, string version, string strategy, string symbol, int quantity, int split_quantity)
		{
			return Algomojo(Input, apikey, apisecret, brokerCode, version, strategy, symbol, quantity, split_quantity);
		}

		public Algomojo Algomojo(ISeries<double> input, string apikey, string apisecret, NinjaTrader.NinjaScript.Indicators.Algomojo.BrokerCodeEnumIndicator brokerCode, string version, string strategy, string symbol, int quantity, int split_quantity)
		{
			if (cacheAlgomojo != null)
				for (int idx = 0; idx < cacheAlgomojo.Length; idx++)
					if (cacheAlgomojo[idx] != null && cacheAlgomojo[idx].apikey == apikey && cacheAlgomojo[idx].apisecret == apisecret && cacheAlgomojo[idx].BrokerCode == brokerCode && cacheAlgomojo[idx].version == version && cacheAlgomojo[idx].strategy == strategy && cacheAlgomojo[idx].symbol == symbol && cacheAlgomojo[idx].quantity == quantity && cacheAlgomojo[idx].split_quantity == split_quantity && cacheAlgomojo[idx].EqualsInput(input))
						return cacheAlgomojo[idx];
			return CacheIndicator<Algomojo>(new Algomojo(){ apikey = apikey, apisecret = apisecret, BrokerCode = brokerCode, version = version, strategy = strategy, symbol = symbol, quantity = quantity, split_quantity = split_quantity }, input, ref cacheAlgomojo);
		}
	}
}

namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
	public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
	{
		public Indicators.Algomojo Algomojo(string apikey, string apisecret, NinjaTrader.NinjaScript.Indicators.Algomojo.BrokerCodeEnumIndicator brokerCode, string version, string strategy, string symbol, int quantity, int split_quantity)
		{
			return indicator.Algomojo(Input, apikey, apisecret, brokerCode, version, strategy, symbol, quantity, split_quantity);
		}

		public Indicators.Algomojo Algomojo(ISeries<double> input , string apikey, string apisecret, NinjaTrader.NinjaScript.Indicators.Algomojo.BrokerCodeEnumIndicator brokerCode, string version, string strategy, string symbol, int quantity, int split_quantity)
		{
			return indicator.Algomojo(input, apikey, apisecret, brokerCode, version, strategy, symbol, quantity, split_quantity);
		}
	}
}

namespace NinjaTrader.NinjaScript.Strategies
{
	public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
	{
		public Indicators.Algomojo Algomojo(string apikey, string apisecret, NinjaTrader.NinjaScript.Indicators.Algomojo.BrokerCodeEnumIndicator brokerCode, string version, string strategy, string symbol, int quantity, int split_quantity)
		{
			return indicator.Algomojo(Input, apikey, apisecret, brokerCode, version, strategy, symbol, quantity, split_quantity);
		}

		public Indicators.Algomojo Algomojo(ISeries<double> input , string apikey, string apisecret, NinjaTrader.NinjaScript.Indicators.Algomojo.BrokerCodeEnumIndicator brokerCode, string version, string strategy, string symbol, int quantity, int split_quantity)
		{
			return indicator.Algomojo(input, apikey, apisecret, brokerCode, version, strategy, symbol, quantity, split_quantity);
		}
	}
}

#endregion

Indicator Settings

Enter the API Key, API SecretKey, Broker and other order parameters according to the requirement.

Ninjascript Output Window

Goto Ninjascript Control Center -> New -> Ninjascript Output to view the API request/API response parameters.

Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

Algomojo Platform Now Open to Finvasia (Shoonya) Users

Algomojo, a leading Algotrading platform for DIY traders, is excited to announce that it is now open to Finvasia (Shoonya) users. This partnership aims...
Rajandran R
5 min read

Algomojo Platform Now Open to 5Paisa Users

Algomojo, a leading Algotrading platform for DIY traders, is excited to announce that it is now open to 5Paisa users. This partnership aims to...
Rajandran R
5 min read

Algomojo Platform Now Open to Goodwill Commodities Users

Algomojo, a leading Algotrading platform for DIY traders, is excited to announce that it is now open to Goodwill Commodities users. This partnership aims...
Rajandran R
5 min read

Leave a Reply

Get Notifications, Alerts on Market Updates, Trading Tools, Automation & More