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 > Import> NinjaScript 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.
